Рейтинг:6

Выделенная память в Linux меньше, чем ожидалось

флаг au

Один из вариантов использования памяти моего Linux-сервера странный. Насколько я знаю, объем выделенной памяти (Committed_AS в /proc/meminfo или kbcommit в sar -r), чем используемая приложением память, является нормальным. Но выделенная память моего сервера значительно мала.

# кошка /proc/meminfo
Общий объем памяти: 32877480 КБ
МемБесплатно: 3511812 КБ
Буферы: 19364 КБ
Кэшировано: 12080112 КБ
SwapCached: 0 КБ
Активный: 22658640 КБ
Неактивно: 5906936 КБ
Актив(анон): 16460116 КБ
Неактивный (анон): 6652 КБ
Активный (файл): 6198524 КБ
Неактивный (файл): 5900284 КБ
Неизбежный: 0 КБ
Заблокировано: 0 КБ
SwapTotal: 0 КБ
SwapFree: 0 КБ
Грязный: 544 КБ
Обратная запись: 4 КБ
Страницы: 16482208 КБ
Нанесено на карту: 17228 КБ
Шмем: 672 кБ
Слэб: 529344 КБ
SReclaimable: 460220 КБ
SUnreclaim: 69124 КБ
Стек ядра: 12304 КБ
Таблицы страниц: 51412 КБ
NFS_Unstable: 0 КБ
Отказ: 0 КБ
WritebackTmp: 0 КБ
Предел фиксации: 16438740 КБ
Committed_AS: 4484680 КБ
VmallocTotal: 34359738367 КБ
VmallocUsed: 66424 КБ
VmallocChunk: 34359651996 КБ
HardwareCorrupted: 0 kB
AnonHugePages: 15376384 КБ
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Огромный размер страницы: 2048 КБ
DirectMap4k: 4096 КБ
DirectMap2M: 2093056 КБ
DirectMap1G: 31457280 КБ

Как видите, Committed_AS занимает около 4,4 ГБ. Но один из процессов использует более 14 ГБ. Этот процесс не имеет файла mmap или общей памяти.

# pidstat -r 1 1
Linux 2.6.32-696.16.1.el6.x86_64 (appintprdsearch01) 23.08.21 _x86_64_ (8 ЦП)

16:56:34 PID minflt/s majflt/s VSZ RSS %MEM Команда
16:56:35 414 19476,24 0,00 17260248 14356476 43,67 isc_mc
# pmap -x 414 | egrep '^Адрес|^всего'
Адрес Кбайт RSS Сопоставление грязного режима
всего кБ 17268588 14363848 14360208
# pmap -x 414 | grep анон | awk '{s+=$3} END {print s}'
14326736

Интересно, почему используемая память этого процесса не влияет на выделенную память. Я что-то потерял?

# кошка /etc/системный выпуск
Red Hat Enterprise Linux Server версии 6.8 (Сантьяго)
# uname -r
2.6.32-696.16.1.el6.x86_64

Заранее спасибо!!

РЕДАКТИРОВАТЬ: я попытался показать полный вывод pmap -x, сделанный сегодня. но это 758 строк и превышает лимит сообщений. Итак, вот резюме. И я обнаружил, что его анонимные страницы становятся больше.

# pmap -x 414 | grep -vw анон
414: /usr/local/search/sf-1v530/bin/isc_mc -license /usr/local/search/sf-1v530/license/license.xml -conf ../config/config_mc.xml -pid /usr/local /search/sf-1v530/pid/isc_mc.pid -log /usr/local/search/sf-1v530/log/isc_mc
Адрес Кбайт RSS Сопоставление грязного режима
0000000000400000 4616 1720 0 r-x-- isc_mc
0000000000a81000 1304 716 20 rw--- isc_mc
0000003c54200000 128 108 0 r-x-- ld-2.12.so
0000003c54420000 4 4 4 р---- ld-2.12.so
0000003c54421000 4 4 4 rw--- ld-2.12.so
0000003c54600000 1576 584 0 r-x-- libc-2.12.so
0000003c5478a000 2048 0 0 ----- libc-2.12.so
0000003c5498a000 16 16 8 r---- libc-2.12.so
0000003c5498e000 8 8 8 rw--- libc-2.12.so
0000003c54a00000 92 72 0 r-x-- libpthread-2.12.so
0000003c54a17000 2048 0 0 ----- libpthread-2.12.so
0000003c54c17000 4 4 4 r---- libpthread-2.12.so
0000003c54c18000 4 4 4 rw--- libpthread-2.12.so
0000003c55600000 524 80 0 r-x-- libm-2.12.so
0000003c55683000 2044 0 0 ----- libm-2.12.so
0000003c55882000 4 4 4 r---- libm-2.12.so
0000003c55883000 4 4 4 rw--- libm-2.12.so
0000003c55a00000 84 16 0 r-x-- libz.so.1.2.3
0000003c55a15000 2044 0 0 ----- libz.so.1.2.3
0000003c55c14000 4 4 4 r---- libz.so.1.2.3
0000003c55c15000 4 4 4 rw--- libz.so.1.2.3
0000003c56600000 88 16 0 r-x-- libgcc_s-4.4.7-20120601.so.1
0000003c56616000 2044 0 0 ----- libgcc_s-4.4.7-20120601.so.1
0000003c56815000 4 4 4 rw--- libgcc_s-4.4.7-20120601.so.1
0000003c57200000 928 488 0 r-x-- libstdc++.so.6.0.13
0000003c572e8000 2048 0 0 ----- libstdc++.so.6.0.13
0000003c574e8000 28 28 28 r---- libstdc++.so.6.0.13
0000003c574ef000 8 8 8 rw--- libstdc++.so.6.0.13
00007ffdcbf56000 84 48 48 rw --- [стек]
---------------- ------ ------ ------
всего кБ 18462068 15806748 15802956

Это отсортированный размер аноновской карты и ее количество.

# pmap -x 414 | grep -w сразу | awk '{s[$2]++} END {for (x in s) {print x,s[x]}}' | Сортировать
-РНК 1
254728 1
225520 1
197220 1
196608 1
131480 2
131072 2
124008 1
65740 3
65536 142
65532 5
65528 3
65524 2
65520 1
65512 2
65508 2
65504 3
65500 3
65488 2
65484 5
65480 2
65476 1
65464 2
65456 1
65452 1
65448 2
65440 4
65436 3
65432 3
65428 2
65424 1
65420 28
65412 1
65404 1
65400 1
65372 1
65192 1
65188 1
64804 1
64636 1
63940 1
63912 1
63792 1
63584 1
63408 1
63400 2
63244 1
63008 2
63004 1
61996 1
61848 1
61792 1
61624 1
60976 1
59940 1
58276 1
57736 1
55992 1
52348 1
51212 1
50084 1
40840 1
24696 1
15452 1
14324 1
13188 1
10396 1
10240 1
9544 1
7800 1
7260 1
7064 1
5596 1
4560 1
3912 1
3744 1
3688 1
3540 1
3216 1
2532 1
2528 2
2292 1
2136 2
2128 1
1952 1
1744 1
1624 1
1596 1
1024 169
900 1
732 1
348 1
344 1
164 1
136 1
132 1
124 1
116 28
112 1
108 2
104 3
100 3
96 4
88 2
84 2
80 1
72 2
60 1
56 2
52 5
48 2
36 3
32 3
28 2
24 2
16 3
12 2
8 4
4 179

РЕДАКТИРОВАТЬ: я обратился в службу поддержки Redhat. Боюсь, я не могу получить никакого ответа, так как RHEL6 был EOSed. В любом случае, я опубликую здесь результат.

Matthew Ife avatar
флаг jo
Было бы интересно увидеть полный вывод `pmap -x`.
John Mahowald avatar
флаг cn
Что это за программа, которая, по-видимому, делает много анонимных распределений? Используется ли для этого malloc() mmap() или какая-либо другая функция распределения?
hoolaboy avatar
флаг au
@John Mahowald Поскольку это коммерческая программа, мы не можем проверять исходный код. Только мы можем сделать это strace его. Это своеобразный поисковик. И естественно, что эта программа использует огромную память.
Matthew Ife avatar
флаг jo
Еще одна вещь, которую нужно проверить, это `/proc/414/smaps`, он должен разбить, сколько выделений страниц являются прозрачными огромными страницами. Моя текущая «догадка» заключается в том, что выделение THP считается страницей размером 4096 байт в `Committed_AS`, тогда как вместо этого оно должно считаться страницей размером 2048 кбайт.
Matthew Ife avatar
флаг jo
Я написал программу для проверки THP не посчитал правильно теорию и ее не соответствует действительности. Так что то, что вызывает это, не связано с этим. На данный момент может понадобиться вывод smaps.
hoolaboy avatar
флаг au
@Matthew Ife: Спасибо за совет. Какой момент я должен проверить в выводе smaps?
Matthew Ife avatar
флаг jo
@hoolaboy Обычно он разбивает страницы по резервному хранилищу и текущему расположению страниц сопоставлений (если они находятся в свопе и т. Д.). Я надеюсь, что это даст более подробное объяснение того, что представляют собой сопоставления и как/откуда они появились, что могло бы объяснить аномальное поведение `/proc/meminfo`.
Рейтинг:3
флаг cn

Половина памяти этого хоста находится на частных страницах.Большая часть этого процесса, который вы идентифицировали. Зафиксировано_AS относительно низкий уровень в 14% ПамятьВсего подразумевает, что мало что используется для фактических данных.

Операционные системы ленивы. Linux не будет трогать все 14 ГБ, которые запросила эта программа. Вместо этого, поскольку этот процессор x86 поддерживает страницы размером 2 МБ и 1 ГБ, Linux назначает несколько из них этому процессу и делает вид, что они полностью обнулены. Уведомление Прямая карта показывает много аппаратных страниц по 1 Гб. HugePages могут быть явно настроены администратором, но эта меминфо показывает ноль настроенных.

Просто это выделение занимает очень мало физической памяти, поэтому Зафиксировано_AS начинается низко. Если и когда приложение заполнит их реальными данными, оно увеличится.

Что касается планирования емкости, прямо сейчас на этом хосте достаточно памяти. Анонимная и общая память ограничена половиной, 36% кэшируется для быстрого доступа к файлам, а несколько ГБ свободны и не используются для удовлетворения немедленных потребностей в выделении памяти. И конечно Зафиксировано_AS далеко под ПамятьВсего

Несмотря на то, что объем памяти, выделяемый приложению, соответствует размеру хоста, выясните, почему он имеет именно такой размер. Если это база данных в памяти, рассчитанная на будущий рост, это может иметь смысл. Или, может быть, 32 ГБ — это ваша виртуальная машина среднего размера / физический сервер небольшого размера, увеличение размера может быть проще в эксплуатации.

Matthew Ife avatar
флаг jo
Не уверен, что это правда; отправитель показывает, что в их программах поля «rss» и «dirty» составляют 14 ГБ. Эти страницы как будто где-то тронули, так как они были испачканы. Хотя могут быть и общие страницы, и/или файлы в этом сопоставлении, которые не учитываются, поскольку они включены в сумму awk.
marcelm avatar
флаг ng
_ «Операционные системы ленивы. Linux не будет использовать все 14 ГБ, которые запросила эта программа. [...] Только это выделение занимает очень мало физической памяти, поэтому Committed_AS начинается с низкого уровня.Если и когда приложение заполнит их реальными данными, они увеличатся». .html#meminfo) кажется, противоречит этому поведению. Возможно, документация устарела или неверна, или я неправильно ее читаю. У вас есть источники, подтверждающие ваше объяснение?
Matthew Ife avatar
флаг jo
@marcelm, возможно, ответ намекает на то, что прозрачные огромные страницы не включены в расчет commit_as, но я не в состоянии проверить исходный код виртуальной машины или проверить это. Я лично чувствую, что происходит больше, но здесь может помочь более полная pmap.
John Mahowald avatar
флаг cn
Насчет конкретики я, наверное, ошибаюсь, и это далеко не полное обсуждение огромных страниц. Тем не менее, мы наблюдаем общесистемные страницы на страницах, намного превышающих «Committed_AS». Для детального изучения этого может потребоваться знание того, какое приложение, использует ли оно malloc или mmap, и как оно добилось такого выделения памяти. Что на самом деле не имеет значения для планирования емкости, даже если мы предполагаем, что все анонимные страницы будут использоваться, это легко умещается на хосте размером 32 ГБ.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.