2009年11月26日木曜日

ネットワーク性能のチューニング (Sun Fire T2000編)

このエントリーをはてなブックマークに追加
Sun Fire T2000には4ポートのGbEが装備されているので、これを束ねれば理論的には4Gbpsのスループットが出ます。しかし、Sun Fire T2000はうまくチューニングしないと、CPUに余裕がある場合でも低いスループットしかでないので注意が必要です。

Solaris 10のTCP/IPスタックについては、「特集記事: Solaris OS ネットワーキング -- マジックの種明かし」が詳しいです。これによると、着信パケットをデバイスの割込みからTCPの出口まで、squeueというデータ構造を使って1つのCPUで処理することがわかります。この場合のCPUは、UltraSPARC T1の場合には1GHzのコアの1/4のstrand (コア上のスレッド)ですので、GbEの処理に追いつきません。

この記事には、それを避けるためにip_squeue_fanoutやip_squeue_bindというカーネルパラメータがあると書かれています。しかし、ip_squeue_fanoutはsqueueが決まってから処理が分散されるので、着信が多くなるとその前で詰まってしまいます。ip_squeue_bindは1つのsqueueを複数のstrandで処理できるだけなので、少ない接続で大きな帯域を使う場合にしか対応できません。

そこでSolaris 10 11/06では、FIFOバッファとワークスレッドからなる複数のソフトリングで、着信パケットの処理をsqueueに入れる前に分散させるようになりました。異なるソフトリングのワークスレッドは別のstrandで実行されるので、ソフトリングの数だけ着信パケットの処理が分散されます。

ソフトリングはsun4vアーキテクチャではデフォルトで、その他のアーキテクチャではip_squeue_fanoutが1のときに有効になり、インターフェイスごとにip_soft_rings_cntで指定された数だけ設けられます。ip_soft_rings_cntのデフォルトは2です。デバイスをアグリゲートした場合には、アグリゲートされたインターフェイスごとに設けられるので、ip_soft_rings_cntは少なくともアグリゲートしたデバイス数の2倍にする必要があります。

マニュアルでは、ソフトリングが過負荷になるとパケットが破棄されて、kstat dlsカウンタdls_soft_ring_pkt_dropが増えるとされているので、このカウンタがip_soft_rings_cntの最適な値を探るために使えるように見えます。しかしTCPの場合には、着信パケットの処理がとどこおると発信パケットが減り、自然と着信の過負荷が抑制されるためソフトリングはあふれません。ソフトリングの過負荷はスループットの低下でしかわかりません。

ip_soft_rings_cntの最適な値はベンチマークを取りながら詰めていくしかありません。ftp.jaist.ac.jpではip_soft_rings_cntを8にしたときにスループットが最高に達したので、この値を使用しています。デバイスを2つずつアグリゲートしているので、1つのデバイスごとに4つのstrandを用いることになります。発信パケットが大半を占めるミラーサーバでも、着信パケットの処理をこれだけ分散させないとスループットが出ないのです。

Solaris InternalsのWikiによるとSolaris 10 10/09 (s10u8)ではip_soft_rings_10gig_cntというパラメータが新設されていて、10GbEではデフォルトでソフトリングが16設けられるとあるのですが、そのようなパラメータは見当たりません。10GbEの場合にはip_soft_rings_cntに16を設定する必要があるようです。

ip_soft_rings_cntに適切な値が設定されていれば、ip_squeue_fanoutやip_squeue_bindはデフォルトから変更する必要はありません。

デバイスの割り込みハンドラが登録されるstrandも分散させる必要があります。特に設定をしないと、同じコアに4つのGbEの割り込みハンドラがすべて登録されることがあります。命令の局所性を考えると、このほうがスループットが出るかもしれません。しかし、1GHzのUltraSPARC T1には荷が重過ぎるので、別々のコアに分かれるように設定したほうがスループットは向上します。
/usr/sbin/psradm -i 1-3 5-7 9-11 13-15 17-19 21-23 25-27 29-31
このようにpsradmコマンドを使って、各コアの最初のstrand以外の割り込みを禁止すると、4つのGbEの割り込みハンドラは4つのコアに分かれて登録されます。割り込みを許すstrandはどれでもいいのですが、実験では最初のstrandにしたときに明らかに高いスループットが出たので、そうしています。

今回説明した設定を行う場所は、ip_soft_rings_cntはインターフェイスがplumbされる前でないといけないので、以下のように/etc/systemで行う必要があります。psradmコマンドはいつでもいいので、適当なrcスクリプトを作って実行するといいでしょう。
set ip:ip_soft_rings_cnt = 8
今回はSun Fire T2000を含むsun4vアーキテクチャ固有のネットワーク性能のチューニングについて説明しました。次回はSolarisに共通のネットワーク性能のチューニングについて説明します。

0 件のコメント:

コメントを投稿