Настройка Java + Docker RSS для ошибки glibc - PullRequest
1 голос
/ 20 июня 2019

У меня похожая история, как в вопросе Рост использования резидентной памяти (RSS) Java Process

jcmd NMT не показывает проблем.Имеет постоянные значения.Например,

Native Memory Tracking:
Total: reserved=1611305KB +19680KB, committed=347717KB +41440KB

В то же время команда docker exec eb97c7681baa ps -o rss,vsz,sz 7 возвращает

  RSS    VSZ    SZ
458368 2294800 573700

И зафиксированный размер для NMT остается +/- постоянным, но RSS продолжает расти, что вызывает dockerУбийца ООМ, чтобы остановить контейнер с ООМ.Я прочитал несколько замечательных статей о фрагментации памяти (https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_native_memory_fragmentation_and_process_size_growth?lang=en)

Так что многие люди сообщают, что исправление, например MALLOC_ARENA_MAX=2, должно решить проблему, но, похоже, требуется больше настроек. Когда я устанавливаю значение,проблема с ростом RSS значительно уменьшается, но все еще остается. Кажется, мне нужно установить значения для:

MALLOC_MMAP_THRESHOLD_ - определяет, когда память будет выделяться из кучи Java (значение по умолчанию 128k)

MALLOC_TRIM_THRESHOLD_ он пытается обрезать арены, чтобы освободить память для операционной системы, когда размер арены достигает максимального порогового значения (значение по умолчанию 128k) - Это так?

Из статьи:

Если вы решите изменить порог mmap, первым шагом будет определение шаблона распределения. Это можно сделать с помощью таких инструментов, как ltrace (на malloc) или SystemTap, или если вы знаете, что является причиной большей частираспределения (например, Java DirectByteBuffers), затем вы можете отслеживать только эти распределения. Затем создайте гистограмму этих размеров и выберите порогd только при наименьшем, но наиболее частом распределении.Например, допустим, вы обнаружили, что большинство выделений больше 8 КБ.В этом случае вы можете установить порог на 8192

Я использовал инструмент pmap, чтобы проверить, каковы размеры выделения:

7:   java -XX:NativeMemoryTracking=detail -XX:+PrintFlagsFinal -XshowSettings:vm -jar /usr/share/jvmservice/service.jar
Address           Kbytes     RSS   Dirty Mode  Mapping
00000000020af000     560     432     432 rw---   [ anon ]
00000000f8000000   43648   39032   39032 rw---   [ anon ]
00000000faaa0000   87424   66532   66532 rw---   [ anon ]
0000000100000000   11136   11056   11056 rw---   [ anon ]
00007f2820000000   30912   25520   25520 rw---   [ anon ]
00007f2828000000   65512   58568   58568 rw---   [ anon ]
00007f282fb06000    1280    1176    1176 rw---   [ anon ]
00007f282fd06000    2048    2044    2044 rw---   [ anon ]
00007f282ff06000    2048    2048    2048 rw---   [ anon ]
00007f2830106000    2048    2048    2048 rw---   [ anon ]
00007f2830309000    3064    2064    2064 rw---   [ anon ]
00007f283060a000    1016     100     100 rw---   [ anon ]
00007f283070b000    3064    2068    2068 rw---   [ anon ]
00007f2830a09000    2048    2048    2048 rw---   [ anon ]
00007f2830c0c000    1016     108     108 rw---   [ anon ]
00007f2830d0d000    1016      92      92 rw---   [ anon ]
00007f2830e0e000    1016     124     124 rw---   [ anon ]
00007f2830f0f000    1016     128     128 rw---   [ anon ]
00007f2831111000    1016     124     124 rw---   [ anon ]
00007f2831212000    1016     128     128 rw---   [ anon ]
00007f2831313000    1016     144     144 rw---   [ anon ]
00007f2831414000    1016     128     128 rw---   [ anon ]
00007f2831515000    1016     144     144 rw---   [ anon ]
00007f2831616000    1016     128     128 rw---   [ anon ]
00007f2831717000    1016     136     136 rw---   [ anon ]
00007f2831818000    3064    2136    2136 rw---   [ anon ]
00007f2831b16000    2048    2044    2044 rw---   [ anon ]
00007f2831d19000    3064    2152    2152 rw---   [ anon ]
00007f2832017000    2048    2048    2048 rw---   [ anon ]
00007f283221a000    3064    2152    2152 rw---   [ anon ]
00007f2832518000   16388     164     164 rw---   [ anon ]
00007f283351c000    1016     136     136 rw---   [ anon ]
00007f283361d000    3064    2136    2136 rw---   [ anon ]
00007f283391b000    2048    2048    2048 rw---   [ anon ]
00007f2833d20000    1016     100     100 rw---   [ anon ]
00007f2833e21000    3064    2148    2148 rw---   [ anon ]
00007f283411f000    2048    2048    2048 rw---   [ anon ]
00007f2834b43000    3064    2136    2136 rw---   [ anon ]
00007f2835291000    2116    2052    2052 rw---   [ anon ]
00007f28354a2000    2048    2048    2048 rw---   [ anon ]
00007f28356a2000    2048    2048    2048 rw---   [ anon ]
00007f28358a2000    2048    2048    2048 rw---   [ anon ]
00007f2835aa2000    2048    2048    2048 rw---   [ anon ]
00007f2835ca2000    2048    2048    2048 rw---   [ anon ]
00007f2835ea2000    2048    2048    2048 rw---   [ anon ]
00007f28360e1000    2048    2048    2048 rw---   [ anon ]
00007f28365df000    3064    2164    2164 rw---   [ anon ]
00007f28368dd000    2048    2048    2048 rw---   [ anon ]
00007f2836add000    2048    2048    2048 rw---   [ anon ]
00007f2836cdd000    2048    2048    2048 rw---   [ anon ]
00007f2836ee0000    3064    2156    2156 rw---   [ anon ]
00007f28371de000    2048    2048    2048 rw---   [ anon ]
00007f28373de000    2048    2048    2048 rw---   [ anon ]
00007f28375de000    2048    2048    2048 rw---   [ anon ]
00007f2837c00000    2048    2048    2048 rw---   [ anon ]
00007f2837e00000    2048    2048    2048 rw---   [ anon ]
00007f2838000000   19828   19820   19820 rw---   [ anon ]
00007f283c000000    6296    6036    6036 rw---   [ anon ]
00007f2840000000    1004     952     952 rw---   [ anon ]
00007f2844000000   65520   62180   62180 rw---   [ anon ]
00007f2848000000     192     192     192 rw---   [ anon ]
00007f284c000000    3260    3228    3228 rw---   [ anon ]
00007f2850000000    5060    5060    5060 rw---   [ anon ]
00007f28544b7000    1024      12      12 rw---   [ anon ]
00007f28545ba000    1016     116     116 rw---   [ anon ]
00007f28546bc000    1012      24      24 rw---   [ anon ]
00007f28547bd000    1012      56      56 rw---   [ anon ]
00007f28548bd000    1016      92      92 rw---   [ anon ]
00007f2854b31000    1016      92      92 rw---   [ anon ]
00007f2854c32000    1016      88      88 rw---   [ anon ]
00007f2854d31000    1024      16      16 rw---   [ anon ]
00007f2855000000   45440   44788   44788 rwx--   [ anon ]
00007f2864000000   27756   26120   26120 rw---   [ anon ]
00007f28680d1000    8976    8976    8976 rw---   [ anon ]
00007f2868995000     712     712     712 rw---   [ anon ]

00007f286a0f7000   12612    4916       0 r-x-- libjvm.so
---------------- ------- ------- ------- 
total kB         2294804  461600  456396

Так что, похоже, большинство ячеек имеютРазмер 2048К.Также я проанализировал кучу с JXRay

result of analysis with jxray

Кажется, что это пространство используется java DirectByteBuffers.Вот отличная статья о настройке https://www.evanjones.ca/java-bytebuffer-leak.html

Вопросы 1. Будет ли правильно задать

MALLOC_MMAP_THRESHOLD_ = 8192

Вопрос 2. Какие соображенияМне нужно принять во внимание, чтобы установить значение для MALLOC_TRIM_THRESHOLD_. Из документов

   M_TRIM_THRESHOLD
          When the amount of contiguous free memory at the top of the
          heap grows sufficiently large, free(3) employs sbrk(2) to
          release this memory back to the system.  (This can be useful
          in programs that continue to execute for a long period after
          freeing a significant amount of memory.)  The M_TRIM_THRESHOLD
          parameter specifies the minimum size (in bytes) that this
          block of memory must reach before sbrk(2) is used to trim the
          heap.

          The default value for this parameter is 128*1024.  Setting
          M_TRIM_THRESHOLD to -1 disables trimming completely.

          Modifying M_TRIM_THRESHOLD is a trade-off between increasing
          the number of system calls (when the parameter is set low) and
          wasting unused memory at the top of the heap (when the
          parameter is set high).

1 Ответ

0 голосов
/ 06 июля 2019

Список размещенной вами анонимной памяти не похож на то, что выделил бы glibc в ситуации чрезмерного потребления RSS. Вы бы увидели намного больше отображений с выравниванием 64 МБ (не обязательно точно такого размера, в зависимости от инструмента отчетности, но начальный адрес был бы кратным 0x4000000, то есть, по крайней мере, шести конечным нулям. Следовательно, это маловероятно, что настройка glibc malloc поможет вам решить эту проблему.

Возможно, в вашем приложении имеется настоящая утечка памяти. Если это действительно вызвано прямыми байтовыми буферами, вы можете попробовать уменьшить значение -XX:MaxDirectMemorySize, чтобы понять, какое минимальное количество прямых байтовых буферов требуется вашему приложению. Другая возможность состоит в том, что ваши настройки сборки мусора откладывают прямую очистку буфера байтов до такой степени, что это вызывает ситуацию нехватки памяти.

...