Não tenho certeza sobre o CentOS 5.6, mas para o meu Linux 2.6.32-5-amd64 adicionando essa linha em /etc/sysctl.conf
vm.vfs_cache_pressure = 1
resolve esse problema.
Eu rodei uma máquina CentOS 5.6 (64 bits) que tem o Nginx (versão mais recente) rodando, com o php-fpm (versão mais recente). As coisas correm muito bem, mas desde cerca de duas semanas notei nos meus gráficos do Munin que a cada 2 horas o uso do 'cache' cai. Antes era usado como um gráfico totalmente estável, que não parecia ser redefinido de vez em quando.
Configurações do PHP-FPM:
pm.max_children = 300
daemonize = yes
pm = static
listen = /tmp/fpm.sock
pm.max_requests = 1000
Eu verifiquei o php-fpm.log, e cerca de uma vez por 5 segundos um processo filho é eliminado e reiniciado. Mas isso é o tempo todo, então isso não explica as quedas repentinas.
Eu só executo Nginx, PHP (via fpm), Munin e vsftpd nesta máquina. Nenhum crons é executado exatamente no momento das gotas.
Minha pergunta: O que poderia estar causando essas quedas no uso do cache?
Acho que algum arquivo grande que faz parte do seu servidor é responsável. Eu estou supondo um log que é girado ou compactado como uma função de limpeza geral. Abaixo estão alguns experimentos mostrando que o Linux descarta essa parte do cache quando um arquivo é removido, inclusive por meio de um utilitário como o 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
Mas isso provavelmente não é o que está acontecendo. E se um arquivo fosse excluído? Ainda seria referenciado?
$ 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
E, se recarregarmos, comprima o arquivo:
$gzip cachetest
$free
total used free shared buffers cached
Mem: 4054352 3439412 614940 0 3384 36404
-/+ buffers/cache: 3399624 654728
Swap: 4194300 338344 3855956
Resolvido, colocando vm.zone_reclaim_mode = 0