Я использую виртуальную машину Centos 7 ESXi с почти 300 ГБ ОЗУ и 24 виртуальными ЦП.
Средняя нагрузка составляет 3, а приложения почти никогда не используют более 150 ГБ оперативной памяти. Остальная часть доступной памяти используется Linux для кеширования.
Проблема в том, что, когда кеш заполняет доступную оперативную память, два процесса kswapd начинают использовать 100% ЦП, и внезапно я вижу, что все ЦП также показывают 99% использования sys (это не ожидание или пользователь, это в основном sys).
Это вызовет высокую нагрузку (100+) в течение нескольких минут, пока система не восстановится и нагрузка снова не упадет до 3.
На данный момент у меня нет раздела подкачки, но даже когда он у меня был, он возникла проблема.
Одно из найденных мною "решений" - выполнять следующую команду каждый день:
echo 3 > /proc/sys/vm/drop_caches
, которая удаляет буферы / кеши. Это «исправит» проблему, поскольку использование кеша никогда не достигает 100%.
Мои вопросы:
Есть ли реальное решение этой проблемы?
Разве ядро Linux не должно быть достаточно умным, чтобы просто очистить старый кеш страниц из памяти вместо запуска kswap?
В конце концов, насколько я понимаю, основная функция оперативной памяти должна использоваться приложениями. Кэширование - это всего лишь второстепенная функция, от которой можно отказаться / игнорировать, если у вас недостаточно памяти.
Моя версия ядра - 3.10.0-229.14.1.el7. x86_64.
Похоже, у вас заканчивается ОЗУ на одном узле NUMA, и система пытается освободить память на этом узле. Это может произойти, если у вас есть один процесс, использующий большой объем памяти, которая (по умолчанию) выделяется преимущественно на узле, на котором выполняется процесс.
Посмотрите, поможет ли это:
sysctl -w vm.zone_reclaim_mode=0
Более подробное описание проблем которые могут возникнуть при использовании политики NUMA по умолчанию в большинстве систем, см. https://engineering.linkedin.com/performance/optimizing-linux-memory-management-low-latency-high-throughput-databases