我运行的是 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。没有在丢失数据时运行 cron。
我的问题:什么原因造成缓存使用率下降?
答案1
我不确定 CentOS 5.6,但对于我的 Linux 2.6.32-5-amd64,添加此行/etc/sysctl.conf
vm.vfs_cache_pressure = 1
解决了这个问题。
答案2
我认为您的网络服务器中的某个大型文件是罪魁祸首。我猜是出于常规管理目的而旋转或压缩的日志。以下是一些实验,表明 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
答案3
解决这个问题vm.zone_reclaim_mode = 0