解决mysql/php-fpm内存占用过高问题

18.12.07更新

今天又出现内存和交换空间爆满的问题,导致网站停止运行(512M内存的小鸡真的拮据)。

php-fpm依旧占用很多内存——四个进程,每个占用了差不多19%的内存,遂改之:

  • 编辑 php-fpm.conf (我的路径在 /usr/local/php/etc/php-fpm.conf)
    pm = ondemand
    # 添加字段
    pm.process_idle_timeout = 10s

    其中pm.process_idle_timeout字段用来自动终结等待超过此字段值时间的php-fpm进程,实测打开网页时会生成多个php-fpm进程(几乎跑满),但网页加载完毕后一些idle状态的php-fpm会自动释放,内存回落到40%-50%的状态。

关于mysql,关闭performance_schema可以显著减少内存/swap分区压力:

  • 编辑my.cnf(我的路径在/etc/my.cnf)
    # 在[mysqld]下添加
    performance_schema = OFF

原内容

今天打开vps控制台一看:

WTF?

htop一下发现五个php-fpm进程,平均每个占了15%的内存,剩下的是一大坨mysql进程,每个差不多4%

下面是两个搜索出来的指令,先放上来,出处:php-fpm占用内存过高分析及解决

查看php-fpm进程个数:
ps -fe |grep "php-fpm"|grep "pool"|wc -l
查看每个php-fpm进程占用的内存大小:
ps -ylC php-fpm --sort:rss

对php-fpm内存占用过高问题,我通过修改php-fpm.conf配置文件来限制php-fpm的进程数:

  • 打开php-fpm.conf配置文件,我的路径:/usr/local/php/etc/php-fpm.conf
  • 我们需要关注的是这几个字段
    • pm = dynamic
      pm.max_children = 10
      pm.start_servers = 2 #启动时的进程数
      pm.min_spare_servers = 1 #表示最小空闲进程数,当进程数小于这个值会自动生成新进程
      pm.max_spare_servers = 4 #表示最大空闲进程数,当进程数大于这个值会自动清理进程,我的默认值是6
  • 其中,max_children字段只有在pm = static时才有效,pm设置为dynamic时后三个字段生效
  • 我把max_spare_servers改成4后内存使用有所缓解,但还不够

内存大户是mysql,解决方法也是修改配置文件:

  • 打开配置文件,我的配置文件路径:/etc/my.cnf
  • 网站:MySQL Calculator 可以通过输入配置文件内的数据来计算mysql需要使用的内存,修改配置文件前可以先计算好合适的内存,然后写入配置文件
  • 输入我原先的数据后居然要用1600MB内存(瑟瑟发抖)
  • 我的问题主要出在max_connection、innodb_log_buffer_size和innodb_additional_mem_pool_size上,分别改成了150、1M和1M

更改后Swap小于两位数,内存300+M