服务器一卡,很多人的第一反应是重启。重启确实能“解决”问题,但病根没找,明天同一时间照样卡。top命令开着看一分钟,负载高在哪基本就有数了。
第一眼看load average,三个数字分别是1分钟、5分钟、15分钟负载。判断标准拿CPU核数做参照:4核机器,负载4算满载,8就是超载。1分钟远高于15分钟说明是突发,正在发生或刚发生;三个数都高是持续性压力,该扩容或找病根了。
top - 20:15:33 up 45 days, load average: 8.32, 5.10, 2.45
Tasks: 120 total, 3 running
%Cpu(s): 25.0 us, 5.3 sy, 0.0 ni, 62.5 id, 7.2 wa, 0.0 hi, 0.0 si
# 读法:us用户态(应用) sy内核态 wa等磁盘 id空闲
第二行看%Cpu(s)的构成,这行直接告诉你瓶颈类型:us高是应用在算,查PHP进程和慢SQL;sy高是系统调用频繁,常见于频繁创建销毁进程;wa高是磁盘跟不上,CPU在干等IO;id高但网站慢,那问题多半不在这台机器上,查下游服务或者网络。
第三步找出元凶进程。按P键按CPU排序(默认就是),按M键按内存排序。看%CPU和%MEM两列,重点盯占用异常的php-fpm、mysqld,多个php-fpm worker都接近100%多半是慢查询循环;单个mysqld吃满CPU就是数据库在硬扛。
# top里按1展开每个核的负载(判断单核瓶颈)
# 交互键:P按CPU排序 M按内存排序 1展开多核 c显示完整命令
# 常用组合:看是哪个php-fpm吃CPU
top -c
# 然后按P,盯着最上面的进程,记下PID
cat /proc/PID/cmdline # 确认是哪个站点(配合pm.status_path更好用)
PHP-FPM有个好东西叫status页面,php.ini开启pm.status_path,浏览器里能看到每个worker当前在跑什么请求。配合top定位,哪个接口拖垮了FPM一目了然,比瞎猜快十倍。
最后纠正一个习惯:load average高不一定是CPU不够。负载统计的是“正在运行加等待IO的进程数”,磁盘打满时load也能上几十,CPU却很闲。所以top里wa和load要一起看,别见负载高就嚷着加CPU。
A5创业网 版权所有