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 -P ALL 1
这个输出很难被阅读,但是你可以跟踪正确的列用来确认哪个中断导致负载,例如:15,19,995. 你也可以定义你想查看的cpu
mpstat -I CPU -P 3 1 # 3 在top,htop中可以定位不同的cpu。(top和mpstat都是从0开始,htop是从1开始计数)
记录下中断数,你就可以查看中断表 ,"cat /proc/interrupts" 找到mpstat‘s得到的数字,你可以发现是哪个设备在使用中断。这个文件也指示了使用该中断的#可以告诉你是什么导致过载。
需要做什么呢?
首先,确认你是否运行irqbalance,这个是nice守护进程它会自动在cpu间扩展中断。在繁忙的系统中很重要,尤其是两块网卡,因为默认cpu0 将处理所有中断,系统很容易过载。irqbalance扩散这些中断用以降低负载。为了性能最大化,你可以手动平衡这些中断将套接字和超线程共享内核分 散,但是通常没必要这么麻烦。
但是即使扩展了中断,某块网卡还是可能导致某一个cpu过载。这取决于你的网卡和驱动,但通常有两种有效的方法来防止这样的事情发生。
第一种是多网卡队列,有些Intel网卡就可以这么做。如果他们有4个队列,就可以有四个cpu内核同时处理不同的中断用以分散负载。通常驱动会自动这么做,你也可以通过mpstat命令来确认。
第二种,并且通常也是更加重要的,网卡驱动选项——‘IRQ coalescing‘,中断请求合并。这个选项有着强大的功能,允许网卡在调用中断请求前缓存数个数据包,从而为系统节约大量的时间和负载。举个例子: 如果网卡缓存10个包,那么cpu负载将大约降低90%。这个功能通常用ethtool工具来控制,使用‘-c/-C‘参数,但是有些驱动要求在驱动初次 加载时就做好相关设置。如何设置需要查看本机文档。举个例子,有些网卡,譬如我们使用的Intel网卡,就有automatic模式可以根据负载自动做到 最优化。
本文由 Steve Mushero, 联合创始人兼首席执行官发表于2012年4月25日
作者简介:
Steve Mushero
云络创始人,首席技术官
Steve Mushero先生拥有超过20年在各行业的,国际性的技术管理经验。他曾经担任土豆网的首席技术官,负责Intermind的高级管理系统,在Beyond Access Communications和 AirReview担任首席架构师。他是Managing White-Collar Job Migration to Asia一书的作者,多项专利的发明者。
云络网络科技(上海)有限公司持有最终解释权