·设为首页收藏本站📧邮箱修改🎁免费下载专区💎积分✅卡密📒收藏夹👽聊天室
返回列表 发布新帖

记录一个多核CPU负载不均衡问题

202 0

马上注册,免费下载更多dz插件网资源。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
昨晚和一位读者朋友讨论了一个问题:在一台多核 CPU 的 Web 服务器上,存在负载不均衡问题,其中 CPU0 的负载明显高于其它 CPUx,进一步调查表明 PHP-FPM 的嫌疑很大。话说以前我曾经记录过软中断导致过类似的问题,但是本例中可以排除嫌疑。

让我们在一台四核服务器上采样分析一下数据确认看看是否存在负载不均衡问题:
  1. shell> mpstat -P ALL 1 10
  2. CPU    %usr   %nice    %sys %iowait    %irq   %soft ... %idle
  3. all   17.57    0.03    1.78    0.00    0.35    0.23 ... 80.04
  4.   0   43.17    0.00    4.12    0.00    1.41    1.00 ... 50.30
  5.   1    9.80    0.00    0.81    0.00    0.00    0.00 ... 89.39
  6.   2    9.31    0.00    1.20    0.00    0.00    0.00 ... 89.49
  7.   3    7.94    0.10    0.80    0.00    0.00    0.00 ... 91.16
复制代码
如上命令的含义是每秒运行一次 mpstat,一共采样 10 次取平均值,可以明显看出 CPU0 的空闲 idle 明显小于其它 CPUx,而且大部分都消耗在了用户态 usr 上面。
再让我们通过 pidstat 来确认一下是不是 PHP-FPM 导致的 CPU0 负载问题:
  1. shell> pidstat | grep php-fpm | awk '{print $(NF-1)}' | sort | uniq -c
  2. 157 0
  3. 34 1
  4. 34 2
  5. 32 3
复制代码
可见分配给 CPU0 的 PHP-FPM 进程比其他三个 CPUx 总和还要多。为什么大部分进程被分配给了 CPU0?我模模糊糊有一些印象是因为操作系统偏爱使用 CPU0,但我暂时也没找到实质的线索可以佐证,如果有人知道,麻烦告诉我。
问题总要解决,既然 PHP-FPM 没有类似 Nginx 那样 CPU 亲缘性(affinity)绑定的指令,那么我们可以使用 taskset 绑定 PHP-FPM 进程到固定的 CPUx 来解决问题:
  1. #!/bin/bash
  2. CPUs=$(grep -c processor /proc/cpuinfo)
  3. PIDs=$(ps aux | grep "php-fpm[:] pool" | awk '{print $2}')
  4. let i=0
  5. for PID in $PIDs; do
  6.     CPU=$(echo "$i % $CPUs" | bc)
  7.     let i++
  8.     taskset -pc $CPU $PID
  9. done
复制代码
如上脚本运行后,让我们再来看看各个 CPU 负载分配情况如何
  1. shell> mpstat -P ALL 1 10
  2. CPU    %usr   %nice    %sys %iowait    %irq   %soft ...  %idle
  3. all   15.73    0.03    1.61    0.00    0.20    0.23 ...  82.20
  4.   0   16.28    0.10    1.62    0.10    0.81    0.91 ...  80.18
  5.   1   16.16    0.10    1.51    0.00    0.00    0.10 ...  82.13
  6.   2   14.46    0.10    1.71    0.00    0.00    0.00 ...  83.73
  7.   3   15.95    0.00    1.71    0.00    0.00    0.00 ...  82.35
复制代码
终于平均了,不过需要提醒的是,一旦 PHP-FPM 处理的请求数超过 max_requests 的设置,那么对应的进程将自动重启,先前的 taskset 设置也将失效,所以为了一直有效,我们需要把 taskset 脚本添加到 CRON 配置中去,例如每分钟自动设置一遍!
本文把 PHP-FPM 进程平均分配给了 0,1,2,3 四个 CPU,实际操作的时候可以更灵活一些,比如前文我们提过,操作系统总是偏爱使用 CPU0,如果 CPU0 的负载已经很高了的话,那么我们不妨把 PHP-FPM 进程平均分配给 1,2,3 三个 CPU。

原文地址:https://huoding.com/2016/07/19/528   发表于2016年
我要说一句 收起回复

回复

 懒得打字嘛,点击右侧快捷回复【查看最新发布】   【应用商城享更多资源】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

创宇盾启航版免费网站防御网站加速服务
投诉/建议联系

discuzaddons@vip.qq.com

未经授权禁止转载,复制和建立镜像,
如有违反,按照公告处理!!!
  • 联系QQ客服
  • 添加微信客服

联系DZ插件网微信客服|最近更新|Archiver|手机版|小黑屋|DZ插件网! ( 鄂ICP备20010621号-1 )|网站地图 知道创宇云防御

您的IP:18.191.223.154,GMT+8, 2024-12-19 12:55 , Processed in 0.235043 second(s), 77 queries , Gzip On, Redis On.

Powered by Discuz! X5.0 Licensed

© 2001-2024 Discuz! Team.

关灯 在本版发帖
扫一扫添加微信客服
QQ客服返回顶部
快速回复 返回顶部 返回列表