Мы запускаем тяжелую службу на Debian. Наш сервис генерирует множество файловых операций ввода-вывода, и его производительность зависит от того, насколько хорошо ядро Linux кэширует файлы.
В нашей системе 64 ГБ памяти. Общий размер файла - 500 ГБ (много маленьких файлов). Эти файлы обслуживаются через reiserfs на рейде. Сейчас ядро 3.2.9. (Это не новая проблема. У нас уже несколько лет.)
Обычно большая часть содержимого файлов кэшируется, и наша система работает без сбоев. Команда free (1) показывает, что кэш памяти 14 ГБ, буфер памяти 10 ГБ и память 8 ГБ свободны.
Однако в наш пиковый час я обнаружил, что ядро Linux освободило большую часть кеша / буфера и сохранило их в свободном состоянии. На мой взгляд, держать память в свободном состоянии - огромная трата времени, и я думаю, что это причина того, что наш сервис перегружается в часы пик. Команда free (1) показывает что-то вроде кеша 2 ГБ, буфера 2 ГБ и 28 ГБ свободного места.
Мой вопрос в том, в какой ситуации ядро Linux хочет освободить память вместо кеширования / буферизации. И как этого избежать? Есть ли какая-нибудь конфигурация, которую мы можем настроить?
(Сообщите мне, если вам потребуется дополнительная информация о нашем оборудовании / системе / услуге)
Это произошло по двум основным причинам.
Первый, который, я надеюсь, вы можете исключить, - это какой-то человек или сценарий, приказывающий ему это сделать. Например, кто-то отправляет команду /sys/vm/drop_caches
.
Другой - если эта память требуется для каких-то других целей. Если приложению требуется много памяти, ядро предоставит приложению эту память, уменьшая кэш по мере необходимости. Когда приложение завершит работу с этой памятью, она станет свободной. Со временем он будет только заполняться кэшированными данными.
В этом случае вы можете сделать несколько вещей. Например, если использование памяти происходит из-за того, что вы пытаетесь обработать четыре запроса одновременно, вы можете изменить конфигурацию, чтобы выполнять максимум два запроса одновременно. Если это позволяет хранить больше данных в кеше, это может дать выигрыш в производительности в целом.
Можно ли что-нибудь положить в рамдиск? Явный кеш, если хотите. Не уверен, что то, что вы делаете, подходит для этого, и вы, наверное, думали об этом, но я брошу это там;)
Взгляните сюда: http://www.linuxinsight.com/proc_sys_vm_hierarchy.html
есть несколько битов, которые вы можете легко настроить, просто "катая" значения в. vfs_cache_pressure & zone_reclaim_mode выпрыгивает, предостережение: только один, который я когда-либо настраивал, - это swappiness.
Огромный free
память, вероятно, вызвана одним или несколькими короткоживущими процессами, которым требуется много памяти. Ядро Linux будет использовать свободную память для кешей, но эти кеши будут отброшены вместо использования подкачки в случае, если какой-либо процесс получит больше памяти даже на короткий период. Судя по предоставленным вами числам, система увидит дополнительный 20 ГБ ОЗУ загружаются в часы пик, и это слишком много для вашей системы, потому что кеши становятся слишком маленькими.
Я бы попробовал регистрировать запущенные процессы примерно в то время, когда вы видите, что ваши кеши падают (например, log date; free -m; ps auxw
каждые 5 секунд в файл, пока не обнаружите проблему).