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

在一台多核CPU的web服务器上,存在负载不均衡问题,其中,其中CPU0的负载明显高于其他CPUx,进一步调查表明PHP-FPM的嫌疑最大
让我们在一台四核服务器上采样分析一下数据确认看看是否存在负载不均衡问题:

shell> mpstat -P ALL 1 10
CPU    %usr   %nice    %sys %iowait    %irq   %soft ... %idle
all   17.57    0.03    1.78    0.00    0.35    0.23 ... 80.04
 0   43.17    0.00    4.12    0.00    1.41    1.00 ... 50.30
 1    9.80    0.00    0.81    0.00    0.00    0.00 ... 89.39
 2    9.31    0.00    1.20    0.00    0.00    0.00 ... 89.49
 3    7.94    0.10    0.80    0.00    0.00    0.00 ... 91.16

如上命令的含义就是每秒一次mpstat,一共采样10次取平均值,可以明显看出CPU0的空闲idel明显小于其他CPUx,而且大部分消耗在user上面

再让我们通过pidstat来确认一下是不是PHP-FRM导致的CPU0负载问题:

shell> pidstat | grep php-fpm | awk '{print $(NF-1)}' | sort | uniq -c
157 0
34 1
34 2
32 3

可见分配给CPU0的PHP-FPM进程比其他三个CPUx总和还要多,为什么大部分进程被分配给CPU0?可能是操作系统偏爱使用CPU0的原因,但是问题总要解决,既然PHP-FPM没有类似Nginx那么CPU亲缘性绑定的指令,那么我们可以使用taskset绑定PHP-FPM进程到固定的CPUx来解决问题:

#!/bin/bash
CPUs=$(grep -c "processor" /proc/cpuinfo)
PIDs=$(ps -aux|grep "php-fpm[:] pool"|awk 'print $2}')
let i=0
for PID in $PIDs;do
    CPU=$(echo "$i%$CPUs"|bc)
    let i++
    taskset -pc $CPU $PID
done

如上脚本运行后,我们再来看各个CPU负载分配情况:

shell> mpstat -P ALL 1 10
CPU    %usr   %nice    %sys %iowait    %irq   %soft ...  %idle
all   15.73    0.03    1.61    0.00    0.20    0.23 ...  82.20
 0   16.28    0.10    1.62    0.10    0.81    0.91 ...  80.18
 1   16.16    0.10    1.51    0.00    0.00    0.10 ...  82.13
 2   14.46    0.10    1.71    0.00    0.00    0.00 ...  83.73
 3   15.95    0.00    1.71    0.00    0.00    0.00 ...  82.35

终于平均了,不过需要提醒的是,一旦PHP-FPM处理请求数超过了max-requests的设置,那么对应的进程将自动重启,先前的taskset设置也将失效,所以为了一直有效,我们需要把taskset脚本添加到CRON配置中去,例如每分钟自动设置一遍

http://huoding.com/2016/07/19/528

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 一个进程可以分配到一个或多个CPU进行执行,这取决于操作系统的调度算法和可用的硬件资源。一些操作系统支持多处理器系统,其中一个进程可以在多个CPU上并行运行,从而提高系统的性能和吞吐量。但是,操作系统也需要管理和协调不同进程之间的CPU资源分配,以确保系统的稳定性和安全性。 ### 回答2: 一个进程可以在多个CPU上运行,这取决于操作系统的调度策略和硬件设备的支持。在一个多核CPU的系统中,操作系统可以选择将一个进程同时分配给多个CPU核心并行执行,从而实现进程的并发执行。这种情况下,一个进程可以分配到多个CPU。 另外,一些操作系统支持将一个进程划分为多个线程,每个线程可以在不同的CPU上独立执行,实现进程的并行执行。在多线程的情况下,一个进程可以被分配到多个CPU。 然而,在单核CPU的系统中,一个进程一次只能在一个CPU上运行。当一个进程正在执行时,操作系统会禁止其他进程在同一个CPU上同时运行,以保证进程的独立性和执行顺序。 综上所述,一个进程可以分配到多个CPU上执行,取决于操作系统和硬件设备的支持情况。而在单核CPU的系统中,一个进程一次只能在一个CPU上运行。 ### 回答3: 一个进程可以分配给一个或多个CPU进行执行,具体的分配方式取决于操作系统的调度算法和硬件的支持。在单核处理器的系统中,一个进程只能分配给一个CPU进行执行,即使有多个进程在运行,也只能按照时间片轮转或优先级来依次执行。而在多核处理器的系统中,一个进程可以同时分配给多个CPU进行并发执行,从而提高系统的处理性能。在多核处理器中,进程的任务可以被划分为多个子任务,分配给不同的CPU同时执行,这样可以实现并行计算,加快任务的完成速度。 除了多核处理器之外,还有一些特殊的硬件架构也支持一次性执行多个线程或进程。例如超线程技术可以让一个物理核心同时执行多个线程,虚拟化技术可以将一个物理服务器虚拟化为多个虚拟机,每个虚拟机都可以运行一个独立的操作系统和进程。 需要注意的是,一个进程分配给多个CPU进行执行并不意味着进程的执行速度会线性增加,因为进程之间可能需要进行同步操作或共享资源,而这些同步开销和竞争条件可能会增加执行时间。此外,在多核系统中,如果进程之间的负载不平衡,有些CPU可能会负载更重,而有些CPU可能处于空闲状态。因此,为了充分利用硬件资源和提高系统的整体性能,需要合理的进程调度策略和负载均衡机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值