问题描述
最近我的服务器出现了一个问题,内存不够的时候,常常 kill 掉我的 Tomcat。因为访问量整体不算大,目前 LNMP、Tomcat 都在一台机器上,但是这就导致了 Tomcat 相关的 Java 应用无法使用。
|
|
查看内存情况发现,操作系统的内存只剩下 60MB 左右,几乎用尽。这种状况持续了 1 个月,当时一直如鲠在喉。中间想过增加内存,又嫌贵。当资源不够的时候一般有两种思路,第一种是增加资源,第二种是优化现有资源。对于我这种穷人来说,第二种常常是我首选的方法。
开始我以为是 Tomcat 自身或者别的进程太吃内存,用
|
|
命令查看后发现,php-fpm 进程常常是占用内存最多的进程。
查看消耗内存最多的前 40 个进程:
|
|
发现前 40 的进程中,php-fpm 占了绝大部分,而且占用率从 2% 到 7% 不等,问题已经很明显了。罪魁祸首就是 php-fpm。
解决问题
可以通过配置 pm.max_children 属性,控制 php-fpm 子进程数量,首先,打开 php-fpm 配置文件,执行指令:
|
|
pm.max_children 默认值为 50,每一个进程占用 1%-2.5% 的内存,加起来就耗费大半内存了,尝试将其值调小,博主这里将其设置为 25(也是参考了其他博客),同时,检查以下两个属性:
- pm.max_spare_servers : 该值表示保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
- pm.min_spare_servers : 保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程;
这两个值均不能大于 pm.max_children 值,通常设置 pm.max_spare_servers 值为 pm.max_children 值的 60%-80%。
最后,重启 php-fpm
|
|
再次查看内存
|
|
发现有 600MB 内存的剩余,就算启动 Tomcat 之后,也能剩余 300MB。
参考链接: https://www.jb51.net/article/129528.htm
|
|