タイトルがすべてでございます。
NICの割り込み処理が1コアに集中してしまい、ボトルネックになって性能が出ない場合があるという話は最近広く知られていると思います。
NICのハードウェアレベルで割り込みを分散してくれる RSS(Receive Side Scaling) という仕組みがあり、それを利用すれば特になにもしなくても複数コアに分散されるはず、と思っていたのですが、どうも特定のマシンでそうならない。
# cat /proc/interrupts CPU0 CPU1 CPU2 (省略) CPU11 64: 1256214 0 0 ... 0 IR-PCI-MSI-edge eth1-0 65: 225711 0 0 0 IR-PCI-MSI-edge eth1-1 66: 402906 0 0 0 IR-PCI-MSI-edge eth1-2 67: 723539 0 0 0 IR-PCI-MSI-edge eth1-3 68: 239176 0 0 0 IR-PCI-MSI-edge eth1-4 69: 726571 0 0 0 IR-PCI-MSI-edge eth1-5 70: 1957739 0 0 0 IR-PCI-MSI-edge eth1-6 71: 2278926 0 0 0 IR-PCI-MSI-edge eth1-7
NIC は BCM 5709 なので RSS 対応しているはずで、eth1-0 〜 eth1-7 まで8つのqueueがあるのは見えています。
なぜだ!と思って分散されているホストとそうでないホストで設定を見比べたところ、単に irqbalance が動いていなかった(インストールすらされていなかった)というオチでした。
# yum -y install irqbalance # service irqbalance start # chkconfig irqbalance on
irqbalance をインストールして起動したところ、無事複数コアに分散するようになりました。
Scientific Linux 6.3 を最小構成でインストールすると入らないんでしょうか…いや、それ最小すぎるだろう…
【追記】irqbalanceを動かすことで分散されるように設定されますが、必須ではないそうです。id:syuu1228 さんありがとうございます。(コメント欄参照)