Я использую виртуальную машину Centos 7 ESXi с почти 300 ГБ ОЗУ и 24 виртуальными ЦП.
Средняя нагрузка составляет 3, и приложения почти никогда не используют более 150 ГБ ОЗУ. Остальная часть доступной памяти используется Linux для кеширования.
Проблема в том, что когда кеш заполняет доступную оперативную память, два процесса kswapd начинают использовать 100% ЦП, и внезапно я вижу, что все ЦП также показывают 99% использования системы (это не ожидание или пользователь, это в основном 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