最近搬到了一台装有 CentOS 5.4 的新服务器,它是 64 位的,而不是我们以前的 32 位。它现在有双处理器和更大的内存。
然而我意识到,Apache 已经严重消耗内存,有时会导致系统交换。
当前设置中,Nginx 1.0.8 位于最前面,用于提供静态内容;Apache 2.2 位于最前面,用于提供动态内容(PHP)。我还安装了 APC。是什么原因导致内存使用量激增?我尝试调整 apache 的配置文件,但如果我将某些指令设置为极低的数字,它就会起作用。以前在旧机器上,我能够使用默认设置,所有 apache 进程的内存使用量不超过 ~260MB:
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>
但是现在新机器正在使用它,内存使用率很高,最高可达 600MB+:
<IfModule prefork.c>
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 20
MaxRequestsPerChild 500
</IfModule>
APC设置如下:
extension = apc.so
apc.enabled=1
apc.shm_segments=1
apc.optimization=0
apc.shm_size=64M
apc.ttl=0
apc.user_ttl=7200
apc.num_files_hint=1024
apc.mmap_file_mask=/tmp/apc.XXXXXX
apc.enable_cli=1
apc.cache_by_default=1
知道为什么会发生这种情况吗?
编辑:更多流程信息
top - 21:18:45 up 10 days, 6:20, 4 users, load average: 0.00, 0.04, 0.06
Tasks: 103 total, 2 running, 101 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.3%us, 0.0%sy, 0.0%ni, 98.8%id, 0.2%wa, 0.0%hi, 0.7%si, 0.0%st
Mem: 1541280k total, 1479804k used, 61476k free, 99812k buffers
Swap: 10482404k total, 25548k used, 10456856k free, 725180k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5613 jenkins 17 0 1144m 184m 13m S 0.7 12.3 2:05.94 java
25306 apache 15 0 541m 125m 69m S 0.0 8.3 0:10.44 httpd
25308 apache 15 0 533m 118m 67m S 0.0 7.9 0:11.01 httpd
25356 apache 16 0 524m 112m 69m S 0.0 7.5 0:08.84 httpd
25305 apache 15 0 510m 103m 69m S 0.0 6.9 0:11.58 httpd
25309 apache 16 0 498m 92m 69m S 0.0 6.1 0:10.35 httpd
25307 apache 15 0 499m 90m 67m S 0.0 6.0 0:09.59 httpd
9759 mysql 15 0 428m 83m 6920 S 0.0 5.6 11:10.01 mysqld
16121 apache 15 0 494m 68m 48m S 0.0 4.6 0:05.50 httpd
2945 user 15 0 659m 18m 6364 S 0.0 1.2 0:00.53 node
25303 root 15 0 425m 12m 6176 S 0.0 0.8 0:00.07 httpd
2944 user 15 0 636m 10m 2288 S 0.0 0.7 0:00.11 node
[user@server~]# ps o rss,command -u apache
RSS COMMAND
70236 /usr/sbin/httpd
105860 /usr/sbin/httpd
128096 /usr/sbin/httpd
92888 /usr/sbin/httpd
121288 /usr/sbin/httpd
94768 /usr/sbin/httpd
115644 /usr/sbin/httpd
答案1
如果您发现内存使用量随着时间的推移而增加,则可能是某处发生了内存泄漏。您已经尝试过减少“MaxRequestsPerChild”参数 -尝试在受控环境中将其调低看看总内存是否停止增长。如果停止增长,则可能是 PHP 代码、PHP 解释器或 PHP 缓存模块泄漏了内存。
如果你发现内存泄漏,你可以尝试以下建议关于如何使用 Apache/PHP 调试内存泄漏的问题。