DELLのサーバでCentOS6でLVS+keepalivedなロードバランサを構築したらハマったりした話

みなさんどうもこんにちは。CTOの馬場です。

最近DELLのサーバ(R410)で、CentOS6.3を使ってLVS+keepalivedなロードバランサを構築したら 見事にハマったりしたので記念ポスト。

ちょっと長いので、一番のドハマリだけ見たい方は最後の「通信速度が著しく遅い件」だけでも見ていただけるとよろしいかと思います。かしこ。

eth0、eth1がない件

いやー。びびった。まじでびびった。

インターフェース名がem1、em2になってます。きもい。

このあたりを参考に対応します。 Getting back to using eth0 in Fedora 15

  • /boot/grub/grub.confbiosdevname=0 追記
  • /etc/udev/rules.d/70-persistent-net.rulesNAME を変更
  • /etc/sysconfig/network-scripts/ifcfg-eth{0,1} を作成

rebootすればハイ解消。

この biosdevname=0 の設定、yumでkernel updateしても引き継がれるので安心! インテリジェンス!

ip_vsモジュールがロードされない件

なんだかmodprobe.dが変な感じ。

# cat > /etc/modprobe.d/ip_vs.conf <<EOF
install ip_vs /bin/true
EOF

とか

# cat > /etc/modprobe.d/ip_vs.conf <<EOF
install ip_vs /sbin/modprobe --ignore-install ip_vs
EOF

とかしてみたもののうまくロードされず、 もういいやってことで

# cat >> /etc/rc.local <<EOF
/sbin/modprobe ip_vs
EOF

で回避。

conntrack_maxの項目名変わってる件

net.ipv4.netfilter.ip_conntrack_max とかだった設定は net.nf_conntrack_max になったみたい。

# cat >> /etc/sysctl.conf <<EOF
net.nf_conntrack_max = 12643392
EOF
# sysctl -p

IPv6を無効にしたい

なんかぐぐると色々出てきますが、公式wikiを見ましょう。

Questions about CentOS 6 / 4. How do I disable IPv6?

# cat >> /etc/sysctl.conf <<EOF
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
EOF
# sysctl -p

/etc/ssh/sshd_config も編集しないとなりません。きもい。

# sed -i "s/^AddressFamily .*//" /etc/ssh/sshd_config
# cat >> /etc/ssh/sshd_config <<EOF
Addressfamily inet
EOF
# service sshd reload

rebootすればハイ反映

通信速度が著しく遅い件

keepalived(というか ip_vs モジュール)を通すと、 著しく通信速度が遅くなります。 iptablesでDNATするぶんには速度低下はないのですが、、、

遅延の原因はbackendからのパケット再送でした。 実際に起きていたことは、、、

  1. backendがやたら大きいパケットをclientに送付
  2. 届かない
  3. backendがパケットを分割して再送
  4. 届く
  5. 1.に戻る

を繰り返している状態。なんでやねん。学習せいよ・・・がっかり・・・

あーでもないこーでもないと言っていたところ、 さすが弊社エンジニアは突き止めました。

なぞはすべてとけた

lbでethtool -K eth0 gro off(eth1も)とすると爆速になりました。

!!!!

同様の事例がありました。

http://archive.linuxvirtualserver.org/html/lvs-users/2011-05/msg00004.html

なんということでしょう・・・

要約:RHEL6でLVSを動かすならGROをOFFにするか、kernel 2.6.39までアップデートせよ

・・・まさかNICのオフロードに悩まされる日がくるとは、感無量。 と、いうわけで下記の設定になって万事解決(eth1も同じ設定)。

# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: on
udp-fragmentation-offload: off
generic-segmentation-offload: on
generic-receive-offload: off
large-receive-offload: off

ちなみに環境は以下の通り。

# ethtool -i eth0
driver: bnx2
version: 2.2.1
firmware-version: 6.2.15 bc 5.2.3 NCSI 2.0.11
bus-info: 0000:01:00.0
# dmidecode | grep -A2 "Type: Ethernet"
        Type: Ethernet
        Status: Enabled
        Description: Embedded Broadcom 5716 NIC 1
--
        Type: Ethernet
        Status: Enabled
        Description: Embedded Broadcom 5716 NIC 2
--
        Type: Ethernet
        Status: Enabled
        Type Instance: 1
--
        Type: Ethernet
        Status: Enabled
        Type Instance: 2

まとめ

いやぁ、検証って大事ですね☆彡