読者です 読者をやめる 読者になる 読者になる

まいんだーのはてなブログ

はてブなのはてブロなのどっちなの

Re: CentOS5でもRPS/RFSでNICが捗る話

id:studio-m (nekoyaさん)にblogエントリで先を越されたけど自分はちょっと使い所と事情が異なっていそうだったのでそれを書いておきたく!!

0. RPS/RFS の利用
CentOS5 系でのやり方は nekoyaさんのエントリ を見てください。
CentOS6 系でのやり方は kazeburoさんのエントリ を見てください。

自分はkernel 2.6.39で試しましたが問題なく動作しました。

1. RPS/RFSの利用を迫られた背景
nekoya さんは app サーバの所でネットワーク問題が起こっていたようですが、自分の場合 LVS と outbound のトラフィックをさばいているLinuxルータで厳しいことになってきておりました。
この時発生する具体的な症状として LoadAverage が 1 で張り付いて応答が極端に悪くなる というものがあります。
これをどげんかする必要があり、RPS/RFS を検証しておりました。

2. 実際の所
2桁Mbpsくらいでサチってしまっていた所が3桁Mbps出してもさばいてくれるようになりました。
top や mpstat -P ALL で見ても、ちゃんと全部のコアを使って処理されている状況になっており、おそらくCPUの前にNICの性能限界が来るんじゃないかというくらいです。

  • RPS/RFS 無効な場合(イメージ)
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.3%us,  0.0%sy,  0.0%ni, 91.0%id,  0.0%wa,  1.7%hi,  7.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni, 62.3%id,  0.0%wa,  1.0%hi, 36.7%si,  0.0%st
  • RPS/RFS 有効な場合(イメージ)
Cpu0  :  0.0%us,  0.0%sy,  0.0%ni, 65.3%id,  0.0%wa,  0.0%hi, 34.7%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni, 81.0%id,  0.0%wa,  0.0%hi, 19.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni, 80.1%id,  0.0%wa,  0.0%hi, 19.9%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni, 80.5%id,  0.0%wa,  0.0%hi, 19.5%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni, 78.7%id,  0.0%wa,  0.0%hi, 21.3%si,  0.0%st
Cpu5  :  0.0%us,  0.3%sy,  0.0%ni, 78.4%id,  0.0%wa,  0.0%hi, 21.3%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni, 76.3%id,  0.0%wa,  0.0%hi, 23.7%si,  0.0%st
Cpu7  :  0.3%us,  0.0%sy,  0.0%ni, 80.0%id,  0.0%wa,  0.0%hi, 19.7%si,  0.0%st

3. ハマりどころ
LVS を DSR で使っているケースだと、outbound のルータで 戻り経路フィルタ に引っかかって outbound のパケットが出て行かないという症状に苛まされることがあります。
自ホスト発信で traceroute とかするとちゃんと出ていくのに〜みたいなことに悩んだら多分これです。
具体的には↓の設定値で、これが outbound のパケットを受けるインターフェースで有効だと発生します。

/proc/sys/net/ipv4/conf/DEV/rp_filter

普通に app サーバで使う分には引っかからない問題だと思いますが、kernel入れ替えたりした時はこの辺のデフォルト設定が変わっていたりするので要注意です。

4. 安めだけどベンダー製サーバだから問題ないよねっ
残念ながら Receive Side Scaling に対応していない NIC を搭載しているサーバはこの問題にぶち当たる可能性を秘めております。
じゃあどうやって調べるの、って話なんですが、メーカーが出しているスペックシートから搭載してる NIC が分かれば対応状況がわかります。
例えば HP とかは搭載 NIC の仕様に「Broadcom BCM5719」使ってるよとか書いてくれています。
BCM5719 のホワイトペーパー を見ると

Boosts performance in Windows® and Linux® environments by directing interrupts to the server's CPU cores, leveraging Transmit/Receive Side Scaling (TSS/RSS).

って書いてあるので割込が多い日も安心でしょう。
サーバ買うときはこういうのも注意して見たいところですね。。

5. 踏み込んだ情報
実践は kazeburo さん nekoya さんのエントリを見るとして、この辺の仕組みの詳しいところは下記URLによくまとまっておりとても勉強になりました。
- Linuxシステムにおけるパケットフォワーディング概要
- VIOPS06で「RPS・RFS等最新Linux Kernel事例」と題してお話してきました