кеш памяти слишком велик, и я собираюсь использовать swap

У меня есть сервер centos с 32 г RAM и его состояние (свободно -m):

              total       used       free     shared    buffers     cached
 Mem:         32071      31488        583          0        244      19329
 -/+ buffers/cache:      11914      20157
 Swap:        17399        287      17112

размер кеша - рост (между каждым перезапуском приложения и очисткой кеша)

через 5 часов, когда я отправляю свой вопрос, состояние памяти следующее:

             total       used       free     shared    buffers     cached
Mem:         32071      31850        221          0        194      20124
-/+ buffers/cache:      11530      20541
Swap:        17399        299      17100

мои параметры Java:

-Xms12g -Xmx12g -XX:MaxNewSize=6g -XX:NewSize=6g -XX:+UseParallelOldGC -XX:+UseParallelGC -XX:+UseTLAB -XX:MaxTenuringThreshold=15 -XX:+DisableExplicitGC

как вы видите, размер кеша слишком велик и при высокой загрузке время на моем сервере используется своп, и сервер работает слишком медленно (в отличие от https://www.linuxatemyram.com/ , память заполнена, используется подкачка, а мое приложение работает слишком медленно)

я использовал java для обслуживания.

что я могу сделать?

-1
задан 11 November 2017 в 13:55
2 ответа

Причины, по которым приложение Java на сервере может замедляться, ограничиваются только нашим воображением (а иногда и Провидением).Жадные к памяти процессы являются их частью, вызываемое ими исчерпание памяти подразумевает подкачку, а взаимодействие с диском убивает производительность.

Однако в этом случае использование памяти не проявляет симптомов подкачки (см. Комментарий @Sven). Это более правдоподобное объяснение, основанное на поведении приложения.

Приложения Java очень чувствительны (среди прочего) к конфигурации памяти. Программисты очень довольны Java (и почти всеми современными языками), потому что им не нужно вызывать бесплатные функции, чтобы избежать утечек памяти, как это делает сборщик мусора. Однако сборщик мусора может заморозить приложение при входе. Существуют разные типы сборок мусора. Те, которые воздействуют на новую зону, менее агрессивны, те, что в старой зоне, хуже, а полный gc - наихудший.

В целом (и, конечно, в этом случае) необходимо изучить эволюцию памяти, чтобы оптимизировать его конфигурацию. В любом случае, мы можем увидеть некоторые моменты, над которыми стоит задуматься:

  • Объем памяти, выделенной приложению, составляет 12 ГБ из 32 ГБ от общего пространства сервера.
  • Пространство, выделенное для новых объектов, составляет 4 ГБ из 12 ГБ. Как вы можете видеть в Параметры настройки кучи , это означает, что NewRatio, равный 2, соответствует лучшим практикам. В любом случае следует рассмотреть возможность увеличения этого значения.

Параметры NewSize и MaxNewSize управляют минимальным и максимальным размером нового поколения. Отрегулируйте размер нового поколения, установив эти параметры равными. Чем больше молодое поколение, тем реже происходят мелкие коллекции. Размер молодого поколения по отношению к старому контролируется NewRatio. Например, установка -XX: NewRatio = 3 означает, что соотношение между старым и молодым поколениями составляет 1: 3, объединенный размер пространства eden и оставшихся в живых пространств будет четвертой частью кучи.

По умолчанию сервер приложений вызывается с помощью JVM Java HotSpot Server. Значение NewRatio по умолчанию для серверной JVM равно 2: старое поколение занимает 2/3 кучи, а новое поколение - 1/3. Более крупное новое поколение может вместить намного больше недолговечных объектов, уменьшая потребность в медленных крупных коллекциях. Старое поколение все еще достаточно велико, чтобы вместить много долгоживущих объектов

В любом случае, использование других ресурсов (потоков, пулов, соединений и т. Д.) Не следует отказываться.

0
ответ дан 5 December 2019 в 20:22

Вы не объяснили, насколько ваша система слишком медленная и где (интерактивные пользователи? Пакетная обработка?), И идентифицировали только один счетчик производительности, память.Это не решит вашу проблему. Будьте методичны в сборе времени отклика и данных мониторинга, а также в изучении того, как работает приложение и операционная система.

Хорошей отправной точкой для Linux является Анализ производительности Linux за 60 000 миллисекунд . ЦП, хранилище, сеть, ошибки и, конечно же, память.

uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top

Вы можете получить более полное представление о приложении, профилировав его. Прочтите Java in Flames (также это технический блог Netflix). Параметр -XX: + PreserveFramePointer позволяет связывать стеки Java с профилированием ОС.

0
ответ дан 5 December 2019 в 20:22

Теги

Похожие вопросы