报错是这么冒出来的。八核机器上某一个核长期满负荷,其余核几乎空闲,业务线程排队严重,整体吞吐怎么都上不去。

排查方向其实有限,先把可能性排一排。进程是单线程模型,天然只能用一个核。也可能是没有做绑核,调度器把中断和别的任务也压到同一个核。

另外,CPU 亲和性被配置固定成了单核。

动手时先看每个核的使用率

mpstat -P ALL 1 3

然后查进程当前的亲和性

taskset -cp $(pgrep -f app)

再往下把进程分散到多个核

taskset -cp 0-3 $(pgrep -f app)

等前面都确认过,再把网卡中断也分散开

grep eth0 /proc/interrupts

手上没有现成的复现脚本,就照着线上请求手工拼了一个。

怎么算真的好了,看的是同一批现象。各核使用率趋于均衡,单核不再长期满负荷,整体吞吐随之上升。

绑核只能缓解,真正的瓶颈是单线程模型;长期方案要么多进程,要么把任务拆成可并行的结构。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189