Linux内核在性能方面已经经历了很长一段时间的考验,尤其是2.6/3.x内核。然而,在高IO,尤其是网络方面的情况下,对中断的处理可能成为问题。我们已经在拥有一个或多个饱和1Gbps网卡的高性能系统上发现过这个问题,近来在有许多小包并发(大约10000packets/second)超载的虚拟机上也发现了这个问题。
原因很清楚:在最简单的模式中,内核通过硬件中断的方式来处理每个来自于网卡的包。但是随着数据包速率的增长,带来的中断渐渐超过了单个cpu可处理的范围。单cpu概念很重要,系统管理员对此往往认识不足。在一个普通的4-16核的系统中,因为整体cpu的使用率在6-25%左右并且系统看上去很正常,所以一个过载的内核很难被发现,。但是系统将运行很慢,并且会在没有告警,没有dmesg日志,没有明显征兆的情况下严重丢包。
但是你使用top查看多个cpu模式(运行top,接着键入1)时,%si列(系统中断)或者mpstat命令中 irq列(mpstat -P ALL 1),在一些繁忙的系统中你会发现中断明显很高,通过经进一步mpstat使用,你会看到哪个cpu或者哪个设备存在问题。
你需要一个较新版本的mpstat,可以运行-I 模式,用以列出irq负载,运行如下命令:
mpstat -I SUM -P ALL 1
超过5000/秒 有点繁忙, 1万-2万/秒相当高了。
运行如下命令来确认那个设备/项目导致负载:
mpstat -I CPU