Проблемы с памятью, голова болит голова болит. Означает головную боль, расчет головы слишком мал, боль поддержки. Benpian "Изгой", третий в серии, люди больно головы статьи памяти. Смотрите остальные:
Linux «Остальная часть необитаемого острова» (1) Подготовка
Linux "Остальная часть необитаемого острова" (2) ЦП
Небольшие компании имеют небольшое количество запросов, но любят злоупотреблять памятью, открывать кучу потоков и много запихивать объекты в jvm Последняя проблема — переполнение памяти.
У крупных компаний большой параллелизм, но они любят подчеркивать высокую доступность, поэтому подкачка обычно зарезервирована, и последняя проблема — задержка обслуживания.
Некоторые коллеги, которые любят использовать глобальные переменные-коллекции, пишут Java-код как C, запихивают в них объекты, но забывают их уничтожить, и последняя проблема — утечки памяти.
Как этого избежать? Разумные параметры, элегантный код, отключение свопа, трехсторонний подход, шутер от проблем.
начни с истории
вопрос короля
Одним солнечным днем появилось тревожное текстовое сообщение. Лао Ван слегка улыбнулся.Это была проблема с процессором.Мгновенное значение простоя, вероятно, было пиковой проблемой, вызванной большим пакетом запросов. Лао Ван получает такие смски каждый день, такой маленький пик, среди тысяч серверов, просто каштан в океане, просто продолжайте пить чай.
Но на этот раз все по-другому. Через несколько минут поступили сотни предупреждений о тайм-ауте обслуживания. После этого Фараон подсчитал и обнаружил, что время службы истекло на несколько десятых на тысячу, но это уже было ужасно. Поскольку ситуация обостряется, я боюсь, что нет времени для чая.
Тревога масштабная, это должна быть глобальная проблема, сеть зависла? Или исчерпание базы данных? Фараон выбрал сервер, о котором недавно сообщили в полицию, и по очереди отслеживал различные состояния.
-
Процессор иногда имеет мгновенные пики, но нагрузка очень нормальная.
-
Хоть свободной памяти и не много, но кешируется еще много
-
Различные сетевые пинги в основном нормальны
-
Дисковый ввод-вывод средний, ведь это служебный вычислительный узел
-
Пул соединений с базой данных стабилен, он не должен быть исчерпан.
-
swap часто используется, но похоже, что его использует каждая машина, ничего страшного
Глобальных вещей не так много, шлюз, LVS, реестр, БД, MQ вроде бы в порядке. У Лао Вана начала болеть голова.
Чтобы дать фараону перерыв, мы включаем камеру в Сяо Ван.
Операция Сяо Вана
Сяо Ван не сын Лао Вана, он ученик Лао Вана. Когда ученик подумал, учитель рассмеялся. На этот раз Сяо Ван использует vim, хочет найти исключение, он открыл файл журнала размером 8 ГБ, а затем с радостью ждет загрузки. Затем сервер умирает.
Отвечать
Ответ дан прямо здесь, а причина, естественно, будет понятна после прочтения этой статьи.
Проблема Фараона наконец была обнаружена, потому что инженер по эксплуатации и техническому обслуживанию использовал ansible для пакетного выполнения команды.
find / | grep "x"
Он хочет найти файл под названием X и посмотреть, какой сервер. В результате эти старые серверы были отсканированы в область плиты после того, как файл слишком много. Сервер открыл своп. После того, как операционная система обнаружила, что физическая память была заполнена, она не сразу выпустила кэш, вызывая GC, все GC и жесткие диски. Затем все услуги не прерывают.
В конце концов, вы можете только сначала закрыть раздел подкачки, затем заставить ядро освободить кеш, а затем включить подкачку. Конечно, этот процесс не будет гладким, потому что открытие и закрытие свопа также вызовет большое количество обменов ввода-вывода, поэтому его нельзя выполнять в пакетном режиме. Эти тысячи машин какое-то время будут заняты.
Проблема Сяо Вана намного проще. Он использует vim для открытия больших файлов, и содержимое всех файлов сначала загружается в память. В результате память была заполнена, а затем своп был заполнен, а затем oom-killer убил сервисный процесс, оставив озадаченного Сяо Вана, который был в замешательстве.
Некоторые команды для устранения неполадок с памятью
Память делится на две части: физическую память и подкачку. Проблема с физической памятью в основном связана с утечками памяти, а проблема с подкачкой в основном связана с использованием swap~, давайте начнем с нескольких команд.
(#1) Физическая память
#根据使用量排序查看RES
top -> shift + m
#查看进程使用的物理内存
ps -p 75 -o rss,vsz
#显示内存的使用情况
free -h
#使用sar查看内存信息
sar -r
#显示内存每个区的详情
cat /proc/meminfo
#查看slab区使用情况
slabtop
Обычно, глядя на использование физической памяти, вы не можете найти много проблем, самое большее, вы обнаружите, что процесс занимает много памяти (например, vim и другие обходные приложения). meminfo и slabtop очень полезны для общей оценки системы, но освоить эти два пункта сложно.
(#2) swap
#查看si,so是否异常
vmstat 1
#使用sar查看swap
sar -W
#禁用swap
swapoff
#查询swap优先级
sysctl -q vm.swappiness
#设置swap优先级
sysctl vm.swappiness=10
Рекомендуется обращать внимание на все проблемы с ненулевым свопом, даже если вы используете ssd. Подкачка используется часто, обычно с увеличением ввода-вывода, и служба зависает. Обмен - это совсем не весело. Если не верите мне, поищите статью "Обмен Преступлением и Наказанием" и прочтите, не заморачивайтесь.
(#3) jvm
# 查看系统级别的故障和问题
dmesg
# 统计实例最多的类前十位
jmap -histo pid | sort -n -r -k 2 | head -10
# 统计容量前十的类
jmap -histo pid | sort -n -r -k 3 | head -10
Вышеуказанная команда состоит в том, чтобы увидеть стек, и вы можете найти некоторые проблемы с коллекцией злоупотребления. Внутри внутренней части, все еще рекомендую«Сводка по устранению неполадок с памятью вне кучи Java»
(#4) Другое
# 释放内存
echo 3 > /proc/sys/vm/drop_caches
#查看进程物理内存分布
pmap -x 75 | sort -n -k3
#dump内存内容
gdb --batch --pid 75 -ex "dump memory a.dump 0x7f2bceda1000 0x7f2bcef2b000"
модель памяти
Проблемы двух королей — это все проблемы с процессором, а процессор периодически увеличивается, что вызвано механизмом управления памятью в Linux. Если вы пойдете мониторить использование памяти Linux, велика вероятность, что это бесполезно. Потому что через некоторое время оставшаяся память будет быстро заполняться различными кэшами. Типичный пример — ElasticSearch, который половину памяти выделяет JVM, а оставшуюся половину быстро заполнит индекс Lucene.
Если ваш процесс приложения запускается,После двух уровней буферизации он все еще не может приземлиться, и его встречает убийца oom.
Следующие знания немного утомительны, но есть некоторые термины, которые вы, возможно, слышали много раз.
Перспектива операционной системы
Давайте объясним приведенный выше рисунок, первая часть — это отношение между логической памятью и физической памятью; вторая часть — это результат, отображаемый командой top, которая подробно перечисляет использование памяти каждым процессом; третья часть отображается свободной команда В результате его взаимосвязь запутана, поэтому для иллюстрации добавлены стрелки.-
Любой, кто изучал устройство компьютера, знает, что скомпилированный адрес программы — это логическая память, которую необходимо преобразовать, прежде чем ее можно будет отобразить в физическую память. Это аппаратное обеспечение для перевода называется
MMU
;TLB
То есть хранить небольшой кеш этих сопоставлений. Когда память особенно велика, она будет включать **hugepage
В какой-то момент это оптимизация производительности киллера, например оптимизация redis (THP, не обращайте внимания на несерьезное до полного понимания)** -
Доступный объем физической памяти ограничен, поэтому логическая память сопоставляет часть адреса с жестким диском, чтобы получить больший адрес физической памяти, что
swap
раздел.swap — корень всех зол во многих сценариях производительности, рекомендуется отключать -
рисунок
top
отображаемые поля,RES
Это реальное использование физической памяти (за исключением подкачки, вызываемой в команде ps).RSS
). В Java он представляет собой сумму памяти в куче и вне кучи. А ВИРТ, ШР и т.д., практически не имеют судебной ценности (кроме некоторых сценариев) -
Доступная память системы, в том числе:
free
+buffers
+cached
, потому что последние два могут быть автоматически освобождены. Но не будь суеверным, есть большая часть, которую ты не можешь отпустить. -
Область slab — это специальная область для дескрипторов кэшированных файлов ядра и другой информации.Команда slabtop может видеть конкретное использование.
Более подробно из/proc/meminfo
Размер конкретного блока логической памяти можно увидеть в файле. Существует до 40 элементов информации о памяти, которую можно получить, просмотрев некоторые файлы в /proc.Эта статья освещает только ключевые моменты.
[xjj@localhost ~]$ cat /proc/meminfo
MemTotal: 3881692 kB
MemFree: 249248 kB
MemAvailable: 1510048 kB
Buffers: 92384 kB
Cached: 1340716 kB
40+ more ...
oom-killer
Следующие вопросы были заданы более чем одним другом:Мой java-процесс пропал, ничего не осталось, просто испарился, как пердун
Зачем? Это потому, что объектов слишком много?
воплощать в жизньdmesg
Команда, есть большая вероятность, что вы увидите информацию о сбое вашего процесса, лежащую там.
Для того, чтобы увидеть время возникновения, мы по привычке добавляем параметр T
dmesg -T
Поскольку система Linux использует виртуальную память, процесс代码
,库
,堆
и栈
Использование памяти будет потреблять память, но заявленная память, пока к ней фактически не обращаются, не учитывается, потому что для нее не выделена физическая страница.
Первый уровень защиты — своп, когда своп почти израсходуется, он попытается освободить кеш, когда оба ресурса будут исчерпаны, появится киллер. Убийца oom выскочит, когда системная память будет исчерпана, и выборочно убьет некоторые процессы, чтобы освободить часть памяти. Ядро 2.4 убивает новые процессы, ядро 2.6 убивает самый используемый. Так что покупайте память.
Этот oom и oom jvm — не одно и то же. Кстати, взгляните, где находится наша куча JVM.
пример
JVM Memory Overflow Устранение неполадок
После того, как приложение было выпущено, jvm продолжала расти. Используя команду jstat, вы можете увидеть, что старая область росла.
jstat -gcutil 28266 1000
В параметрах jvm добавляем-XX:+HeapDumpOnOutOfMemoryError
, когда jvm oom создаст моментальный снимок hprof. Затем используйте Jprofile, VisualVM, Mat и т. д., чтобы открыть файл дампа для анализа.
Если вы нетерпеливы, вы можете использовать jmap для немедленного сброса копии.
jmap -heap:format=b pid
В итоге обнаружилось, что есть глобальный объект Cache, не из гуавы и не из пакета commons, а простой ConcurrentHashMap, и чем больше будет накапливаться результат, тем больше он в итоге приведет к переполнению.
Есть также много различий в ситуациях переполнения, которые кратко описаны здесь:
ключевые слова | причина |
---|---|
Java.lang.OutOfMemoryError: Java heap space | Недостаточно памяти кучи или переполнение памяти |
java.lang.OutOfMemoryError: PermGen space | Пермской области мало, и можно использовать большое количество динамически подгружаемых классов, например cglib |
java.lang.OutOfMemoryError: Direct buffer memory | Недостаточно памяти, операционной системе не хватает памяти, более серьезные случаи |
java.lang.StackOverflowError | Уровень вызова или рекурсии слишком глубокий, это можно исправить |
java.lang.OutOfMemoryError: unable to create new native thread | Не удалось создать поток, память операционной системы закончилась, обязательно зарезервируйте часть для операционной системы, а не всю для jvm |
java.lang.OutOfMemoryError: Out of swap space | Ресурсов памяти тоже нет, и своп израсходован. |
Проблемы с памятью программ JVM, в дополнение к реальным утечкам памяти, в основном вызваны слишком жадными программами. Памяти 4гб, некоторые студенты поставили jvm на 3840М, всего 256М на операционку, странно если не сдохнет.
Еще одна проблема - подкачкаКогда ваше приложение действительно высокопараллельное, swap определенно может дать вам испытать его дьявольскую сторону: процесс не может умереть, но время GC невыносимо.
Моя производительность ES низкая
Хост кластера ES бизнес-стороны имеет 32 ГБ памяти, с увеличением объема данных и доступа было принято решение увеличить его емкость => память была изменена на 64 ГБ.
После обновления памяти было обнаружено, что производительность ES не изменилась, а иногда она была ниже.
Проверив конфигурацию, мы обнаружили две проблемы. A, 64GB машина jvm назначена на 60G, зарезервировано для кэширования файлов только 4GB, что приводит к частым подкачкам кеша файлов и дисков, относительно неэффективно. Во-вторых, размер JVM превышает 32 ГБ, указатель объекта памяти не может включить сжатие, что приводит к потере большого количества памяти. Так как в частности объекты ES, так что оставить реальное содержимое объекта кеша памяти уменьшилось.
Решение: дать 30 Гб памяти для jvm.
разное
В основном понять модель памяти, начать несколько устранения неполадок переполнения памяти, даже если вы справились с проблемой памяти. Но есть еще кое-что, и эта система знаний может копнуть глубже.
JMM
Или возьмем, к примеру, java. В java есть классическая модель памяти, которую обычно спрашивают при опросе ключевого слова volatile. Основная причина вызвана потоками.
Когда два потока обращаются к переменной одновременно, необходимо добавить так называемую блокировку. Поскольку блокировки считываются и записываются, в Java существует множество способов синхронизации. ожидание, уведомление, блокировка, cas, volitile, синхронизировано и т.д., ставим только volitileчитать видимоСекс-диаграмма в качестве примера.
Потоки делают копии общих переменных в рабочей области. После того, как поток 1 изменяет переменную, когда другие потоки читают переменную, все они обновляют копию из основной памяти, которая называется доступной для чтения.Проблема JMM — это проблема чистой памяти, а также необходимая точка знаний для продвинутого java.
CacheLine & False Sharing
Да, процесс производства памяти все еще не поспевает за скоростью процессора, поэтому умные инженеры-железщики добавили еще один кеш (о нет, их несколько). Строка кэша — это наименьшая единица кэша в кэше ЦП.
Этот кеш является поядерным и имеет фиксированный размер. Если есть сценарий, в котором несколько потоков работают с разными переменными-членами, но с одной и той же строкой кэша, что произойдет в это время? . Правильно, возникает проблема False Sharing!Псевдо-совместное использование также является необходимым навыком для продвинутого java (хотя он почти не используется), поэтому давайте рассмотрим его сейчас.
HugePage
Оглядываясь назад на нашу самую длинную картинку, на ней есть TLB, хотя эта штука имеет высокую скорость, но ее емкость также ограничена. При частом доступе он может стать узким местом. TLB хранит сопоставление виртуального адреса и физического адреса. Как показано на рисунке, если отображение шире, даже в сотни или тысячи раз, TLB может вместить больше адресов. Такой метод увеличения размера страницы называется Huge Page.
HugePage имеет некоторые побочные эффекты, такие как усиление конкуренции (например, redis:Redis.IO/темы/лат…). Но в современную эпоху большой памяти это в определенной степени повысит производительность после открытия (например, oracle:docs.Oracle.com/Чэнду/E11882_0…).Numa
Первоначально хотел поместить Numa в главу процессора, но оказалось, что то, что Numa изменило, на самом деле было контроллером памяти. Эта штука делит память на сегменты и "привязывает" их к разным процессорам. Другими словами, определенное ядро вашего процессора быстро обращается к некоторой памяти, но медленнее обращается к другой памяти.
Поэтому после того, как Linux распознает архитектуру NUMA, схема выделения памяти по умолчанию состоит в том, чтобы сначала попытаться выделить место в памяти ЦП, где в данный момент находится запрашивающий поток. Если связанной памяти недостаточно, сначала освободите связанную память.
Следующая команда может видеть, является ли текущее оборудование Numa архитектуру.
numactl --hardware
NUMA также является компромиссом, потому что скорость памяти не выдерживает. У Swap есть некоторые сложные проблемы, в основном вызванные NUMA.
Суммировать
Остальная часть этой статьи представляет собой план для студентов, которые хотят глубже понять структуру памяти. В памяти Linux задействовано слишком много вещей, а различные буферы — это волшебство. Не удивляйтесь, если вы столкнетесь с чем-то непонятным и будете изо всех сил пытаться найти причину. Я глубоко сочувствую тому, что произошло, и очень жду появления универсального квантового компьютера.
Так вот вопрос, память еще такая, что с диском?