我曾经有一个 Linode 的 VPS (512MB),我nginx + php5-fpm
在 Debian Lenny 上运行 (自带 php5.3.3) (i686)。总内存使用量约为90-100MB。
现在我有另一个 VPS(不同的托管公司),我也在nginx + php5-fpm
Debian Lenny 上运行(x86_64)。系统是64位的,所以内存使用率现在比较高,大约210-230MB,我认为这太多了。
这是我的 php5-fpm.conf:
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 2
pm.max_spare_servers = 5
pm.max_requests = 300
这就是top
命令告诉我的:
top - 15:36:58 up 3 days, 16:05, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 209 total, 1 running, 208 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni, 99.9%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 532288k total, 469628k used, 62660k free, 28760k buffers
Swap: 1048568k total, 408k used, 1048160k free, 210060k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
22806 www-data 20 0 178m 67m 31m S 1 13.1 0:05.02 php5-fpm
8980 mysql 20 0 241m 55m 7384 S 0 10.6 2:42.42 mysqld
22807 www-data 20 0 162m 43m 22m S 0 8.3 0:04.84 php5-fpm
22808 www-data 20 0 160m 41m 23m S 0 8.0 0:04.68 php5-fpm
25102 www-data 20 0 151m 30m 21m S 0 5.9 0:00.80 php5-fpm
10849 root 20 0 44100 8352 1808 S 0 1.6 0:03.16 munin-node
22805 root 20 0 145m 4712 1472 S 0 0.9 0:00.16 php5-fpm
21859 root 20 0 66168 3248 2540 S 1 0.6 0:00.02 sshd
21863 root 20 0 66028 3188 2548 S 0 0.6 0:00.06 sshd
3956 www-data 20 0 31756 3052 928 S 0 0.6 0:06.42 nginx
3954 www-data 20 0 31712 3036 928 S 0 0.6 0:06.74 nginx
3951 www-data 20 0 31712 3008 928 S 0 0.6 0:06.42 nginx
3957 www-data 20 0 31688 2992 928 S 0 0.6 0:06.56 nginx
3950 www-data 20 0 31676 2980 928 S 0 0.6 0:06.72 nginx
3955 www-data 20 0 31552 2896 928 S 0 0.5 0:06.56 nginx
3953 www-data 20 0 31552 2888 928 S 0 0.5 0:06.42 nginx
3952 www-data 20 0 31544 2880 928 S 0 0.5 0:06.60 nginx
那么,问题是,有没有办法使用较少的内存?顺便说一句,我有 16 个核心,如果能充分利用它们就好了……
答案1
- PHP, NGINX
由于您的 VPS 内存很少,所以在您使用完所有核心之前,您就会进行交换 - 忘掉它吧:运行 1 个 nginx 工作进程 - 这样就能够处理比您需要的更多的请求。
由于您很可能运行的是 Lenny 发行版的 PHP,因此其中编译了大量内容。重新编译 PHP 将为您节省一些 RAM。因此不会加载您不需要的扩展 - 检查 php.ini 中正在加载的内容。
PHP-FPM 将请求从队列发送给工作进程(循环),因此您可以根据需要将子进程数量减少到 3-4 个 - 如果有更多请求,它们只需等待轮到自己即可。
- 其余的 vps
检查您正在运行哪些服务以及是否真的需要它们。默认安装包含很多东西
如果您正在运行 saslauthd 并且希望它继续运行,请务必添加一个 cron 作业以便每天重新启动它 - 它已经存在严重的内存泄漏很久了,我发现它在我的一个机器上在大约两周内膨胀到 1.5GB。
答案2
我不能 100% 确定是否可以减少 php5-fpm 的内存使用量,但是,如果你想在 nginx 中使用所有 16 个核心,请在 nginx.conf 中将 worker_processes 更改为 16
答案3
您可以降低 php-fpm 服务器的数量,或者减少 php 可以使用的内存量。
“x” 是您可以允许 php/fpm 使用的内存量,然后将 x 除以每个 php 脚本可能需要使用的内存量 (memory_limit),您就会得到 php-fpm“服务器”的数量(不包括任何操作码缓存或 php-fpm 的开销)。
例如:如果你可以让它最大使用 256M,而每个脚本限制为 64M,那么 '256 / 64 = 4' php-fpm 服务器。
不过,我猜多花几美元购买更多内存是值得的。
参考: http://www.php.net/manual/en/ini.core.php#ini.memory-limit
答案4
64 位系统比 32 位系统占用更多内存,这是很正常的,因为代码中几乎每个数字或指针都需要两倍以上的内存。你真的需要 64 位吗?
在同一台计算机上,严格受 CPU 限制的 64 位程序可以比 32 位程序运行得更快,但在您的环境下(RAM 非常少),程序使用的 RAM 越少越好,因为更多的 RAM 可以用于缓存。
我建议恢复到 32 位。