Nekoya Press

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

kazeburoさんがCentOS6.2での事例を紹介されていますが、CentOS5系でもkernelを上げればRPS/RFSが使えるようになって、NICの負荷状況が劇的に改善します。

やり方は意外に簡単で、ELRepoからkernel-ml-2.6.35-14.2.el5.elrepo.x86_64.rpmを落としてきてインストール。

あとは、/boot/grub/menu.lstの設定をdefault=0にしてrebootすればOK。

$ uname -r
2.6.35-14.2.el5.elrepo

ELRepoはNICのドライバなんかもいろいろ提供してくれるし、古いバージョンのRPMをarchiveで提供してくれて非常にいいですね(kernelの過去RPMはないのかな)。

RPS/RFSを有効にする設定はCentOS6と同様です。

# echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus
# echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
# echo 32768 > /proc/sys/net/core/rps_sock_flow_entries

# cat /sys/class/net/eth0/queues/rx-0/rps_cpus
0f

それまで特定のコアだけが他よりも30〜50%ぐらい負荷が高かったのが、各コアにいい具合に分散するようになって、1台で捌けるトラフィックがぐっと多くなりました。

ip_conntrack_maxと監視系の変更

kernel 2.6.35を入れることで、それまでの/proc/sys/net/ipv4/ip_conntrack_maxが/proc/sys/net/nf_conntrack_maxに移動します。

この値を見るNagiosプラグインを書いて、NRPE経由で監視してたのが動かなくなったので、プラグインを更新しました。

/etc/sysctl.confの設定も変わるのですが、既存のサーバと統一するために

net.ipv4.ip_conntrack_max = 524288
net.nf_conntrack_max = 524288

と両方書いてしまうことにしました。

sysctl -pすると

error: "net.ipv4.ip_conntrack_max" is an unknown key

って怒られるけど、実際のところは無視されるだけで特に実害無さそう…

Puppetのテンプレートで真面目に判定すればいいんだろうけど、ひとまずこれで。

弊社ではLVSをUbuntu、GWをVyattaにして自作サーバでNIC叩き回してがんばっていますが、appサーバはこれでまだ戦えそうです。

nekoya.github.io