LNMP内存或CPU过高优化问题

《LNMP内存或CPU过高的优化问题》

场景一:正康服务器php服务无法访问,Nginx报502/403错误

原因分析

top指令查看系统各进程使用情况

zkkj168 ~ # top
top - 16:09:32 up 63 days,  4:03,  1 user,  load average: 1.14, 1.24, 1.20
Tasks:  98 total,   4 running,  94 sleeping,   0 stopped,   0 zombie
%Cpu(s): 39.0 us, 17.1 sy,  0.0 ni, 43.9 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   4048148 total,  3880700 used,   167448 free,   246556 buffers
KiB Swap:        0 total,        0 used,        0 free.  2440796 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 2781 www-data  20   0  346384  32324  14716 R  60.2  0.8   8:52.89 php5-fpm
 6072 www-data  20   0  341844  27156  14088 S  29.4  0.7   6:02.94 php5-fpm
13455 mysql     20   0 1541752 200240   4748 S  13.5  4.9   3054:00 mysqld
10920 root      20   0  206876   9620   4884 R   0.4  0.2 155:00.87 AliYunDun
    1 root      20   0   33448   2688   1400 S   0.0  0.1   0:03.07 init
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.80 kthreadd
    3 root      20   0       0      0      0 S   0.0  0.0   0:39.56 ksoftirqd/0
    5 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:+
    7 root      20   0       0      0      0 S   0.0  0.0  35:45.76 rcu_sched
    8 root      20   0       0      0      0 S   0.0  0.0  30:12.54 rcuos/0
    9 root      20   0       0      0      0 R   0.0  0.0  34:00.92 rcuos/1
   10 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
   11 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/0
   12 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcuob/1
   13 root      rt   0       0      0      0 S   0.0  0.0   0:16.86 migration/0
   14 root      rt   0       0      0      0 S   0.0  0.0   0:20.18 watchdog/0
   15 root      rt   0       0      0      0 S   0.0  0.0   0:16.76 watchdog/1
  • php5-fpm CPU过高
  • mysql 内存过高
  • 重启Nginx,错误仍然存在
  • service nginx restart
  • 重启php5-fpm,服务器正常
  • service php5-fpm restart

解决方案

经排查发现是php5-fpm进程CPU占用过高导致php服务无法访问。 同时mysqld服务内存占用过高,导致智能硬件服务端进程server无法正常运行。 1. php-fpm进程数不够用

netstat -napo |grep "php5-fpm" | wc -l
## 正康服务器出现502错误时,显示40/75/135个子进程
## 重新启动后,进程数5

查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

但也不能无休止调高,可以根据服务器内存情况,可以把php5-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。

第一次性能优化后效果及测试

负载过高的业务分离后,连续稳定运行72小时 - 数据库链接数资源,从以前600,到现在一直保持在10以内 - server服务端,100台设备同时在线,内存一直稳定在30M左右 - php5-fpm,CPU占用率不再长期持续80%

zkrds

zkkj168 Models # top

top - 13:16:52 up 70 days,  1:10,  2 users,  load average: 0.03, 0.05, 0.12
Tasks:  97 total,   2 running,  95 sleeping,   0 stopped,   0 zombie
%Cpu(s):  1.7 us,  0.2 sy,  0.0 ni, 98.2 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   4048148 total,  3753880 used,   294268 free,   209400 buffers
KiB Swap:        0 total,        0 used,        0 free.  2003548 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND     
14991 www-data  20   0  480404  30988   4548 S   0.0  0.8   9:02.27 server      
18936 www-data  20   0  338844  24976  15320 S   0.7  0.6   0:04.27 php5-fpm    
18891 www-data  20   0  338800  24752  15264 S   1.0  0.6   0:05.07 php5-fpm    
18904 www-data  20   0  338304  23120  14008 S   1.3  0.6   0:05.01 php5-fpm    
  393 syslog    20   0  256228  22776    896 S   0.0  0.6   0:12.84 rsyslogd    
18581 root      20   0  333980  16600  11892 S   0.0  0.4   0:00.05 php5-fpm    
30356 root      20   0   63400  11868   1568 S   0.0  0.3  13:37.17 supervisord
29979 root      20   0  883932  10104   4116 S   0.3  0.2  22:46.09 AliHids     
10920 root      20   0  206876   9076   4340 S   0.0  0.2 175:58.47 AliYunDun   
17324 root      20   0   23396   4712   1880 S   0.0  0.1   0:00.66 bash        
17281 root      20   0   23324   4508   1756 S   0.0  0.1   0:00.06 bash        
17306 root      20   0  103772   4196   3224 S   0.0  0.1   0:00.28 sshd        
  815 root      20   0   61368   3060   2384 S   0.0  0.1   0:05.82 sshd        
 2472 www-data  20   0   86668   2996   1096 S   0.0  0.1   0:16.94 nginx       
 2469 www-data  20   0   86800   2992   1100 S   0.0  0.1   0:17.75 nginx       
 2470 www-data  20   0   86668   2992   1076 S   0.0  0.1   0:18.96 nginx       
 2471 www-data  20   0   86668   2992   1104 S   0.0  0.1   0:16.76 nginx

正康前端测试 - 清空缓存直接访问admin.zkkj168.com - 进程数 1 正常 - fa.css 404 - 结论:此处不会影响系统资源,不会导致系统错误

  • 登录进入后台

  • 注销登录(开启1个错误轮寻页面)

    • 进程数 1-2
    • count 500 10s一次轮寻,并没有明显占用资源
    • 结论:此处不会影响系统资源,不会导致系统错误
  • 注销登录(同时开启20个错误轮寻页面)

    • 进程数 1-2
    • 结论:此处不会影响系统资源,不会导致系统错误
  • 进入各菜单,测试是否由于程序错误导致资源占用过高

    • 进程数 1
    • 仪表盘
    • 总部后台系统所有栏目
    • 客服后台系统所有栏目
    • 社区/机构后台系统所有栏目

    • 进程数 2

    • 实时定位系统-实时定位-老人设备历史记录(数据最庞大的查询)

    • 结论:后台系统正常,不会导致系统错误

0.负载过高的业务分离

独立使用RDS服务运行Mysql - 利于数据库备份、容灾处理 - 缓解主服务器内存压力(减少约1.5G内存占用)

优化server进程中数据库连接池 - 减少过多闲置链接(600降低到100以内) - 限制最大链接(设置为200)

1.临时方案

重启php5-fpm即可

service restart php5-fpm

2.永久方案

建议1:写监控程序,当进程php5-fpm占用CPU超过90%,执行重启php5-fpm

建议2:排查php.ini检查是具体哪个插件导致的CPU占用过高,从根本进行优化

建议3:实现LNMP基础服务双机备份及双活部署

微信扫一扫交流

作者:ryanemax
微信关注:ryanemax (刘雨飏)
本文出处:https://romantic-hoover-f991f1.netlify.com/faq/lnmp/502.LNMP%E6%80%A7%E8%83%BD%E4%BC%98%E5%8C%96/
授权协议: CC BY-SA 4.0