Назад | Перейти на главную страницу

Использование памяти в Linux часто падает

Я запускаю машину CentOS 5.6 (64-битную) с запущенным Nginx (последняя версия) с php-fpm (последняя версия). Все работает очень хорошо, но примерно через 2 недели я заметил на своих графиках Munin, что примерно каждые 2 часа использование «кеша» падает. Раньше это был устойчивый полный график, который, казалось, не сбрасывался так часто.

Настройки PHP-FPM:

pm.max_children = 300
daemonize = yes
pm = static
listen = /tmp/fpm.sock
pm.max_requests = 1000

Я проверил php-fpm.log, и примерно раз в 5 секунд дочерний процесс был убит и перезапущен. Но это все время, поэтому резкие перепады этим не объясняются.

Я запускаю на этой машине только Nginx, PHP (через fpm), Munin и vsftpd. Кроны не бегают точно во время капель.

Мой вопрос: Что могло быть причиной такого падения использования кеша?

Решил, поставив vm.zone_reclaim_mode = 0

Думаю, за это отвечает какой-то большой файл, который является частью вашего веб-сервера. Я предполагаю, что журнал поворачивается или сжимается в соответствии с обычными делами. Ниже приведены некоторые эксперименты, показывающие, что Linux выгружает эту часть кеша при удалении файла, в том числе с помощью такой утилиты, как gzip.

$ free
             total       used       free     shared    buffers     cached
Mem:       4054352    3867292     187060          0      75664     390788
-/+ buffers/cache:    3400840     653512
Swap:      4194300     338344    3855956

# echo 1 > /proc/sys/vm/drop_caches
$ free
             total       used       free     shared    buffers     cached
Mem:       4054352    3420612     633740          0        292      20516
-/+ buffers/cache:    3399804     654548
Swap:      4194300     338344    3855956

Но, вероятно, это не то, что происходит. Что делать, если файл был удален? Будет ли на него ссылаться?

$ dd if=/dev/zero of=cachetest bs=1M count=200
200+0 records in
200+0 records out
209715200 bytes (210 MB) copied, 0.288883 s, 726 MB/s

$ free
             total       used       free     shared    buffers     cached
Mem:       4054352    3647688     406664          0       3200     240328
-/+ buffers/cache:    3404160     650192
Swap:      4194300     338344    3855956

$ rm cachetest
$ free

             total       used       free     shared    buffers     cached
Mem:       4054352    3438508     615844          0       3208      35528
-/+ buffers/cache:    3399772     654580
Swap:      4194300     338344    3855956

И, если мы перезагрузим его, сжимаем файл:

$gzip cachetest
$free
             total       used       free     shared    buffers     cached
Mem:       4054352    3439412     614940          0       3384      36404
-/+ buffers/cache:    3399624     654728
Swap:      4194300     338344    3855956

Я не уверен насчет CentOS 5.6, но для моего Linux 2.6.32-5-amd64 добавление этой строки в /etc/sysctl.conf

vm.vfs_cache_pressure = 1

решает эту проблему.