一朋友找我說,他們一個項目的服務器內存占用率太高了,讓我幫忙看下怎么回事。我正好不是太忙就幫他看了下,並記錄如下。
1 查看服務器狀態
他的服務器是阿里雲的ECS,系統是 CentOS Linux release 7.5.1804 (Core)
使用top命令看了下系統的狀態
在這里插入圖片描述
系統的整體負載和cpu並不高,但是內存使用比較高(總8G使用了7.2G)。
使用M按內存占用率排序
在這里插入圖片描述
2 查看消耗內存最多的前40個進程
ps auxw|head -1;ps auxw|sort -rn -k4|head -40
在這里插入圖片描述
通過上圖可以發現有很多php-fpm的進程,使用命令ps -ef |grep php-fpm:\ pool\ www|wc -l 查看這中進程的個數有159個
在這里插入圖片描述
每個進程大概占用了50M,看來內存高的問題應該在於php-fpm池的子進程數過多的問題了。
3 解決辦法
通過各種搜索,發現可以通過配置 pm.max_children 屬性,控制php-fpm子進程數量,首先,打開php-fpm配置文件,執行指令:
vi /opt/php/php7.2/etc/php-fpm.d/www.conf
找到 pm.max_children字段將其修改為100(原來是300),同事將pm.start_servers 修改為30 (原來是100)。
然后重啟php-fpm systemctl restart php-fpm
再次查看內存使用情況,發現內存使用降低了很多
在這里插入圖片描述
同時使用命令查看php的進程數降低了很多
在這里插入圖片描述
由於不是太了解php,解決方法非專業的,都是從網搜的,可能不是最佳方案。