みなさんどうもこんにちは。CTOの馬場です。
最近DELLのサーバ(R410)で、CentOS6.3を使ってLVS+keepalivedなロードバランサを構築したら 見事にハマったりしたので記念ポスト。
ちょっと長いので、一番のドハマリだけ見たい方は最後の「通信速度が著しく遅い件」だけでも見ていただけるとよろしいかと思います。かしこ。
eth0、eth1がない件
いやー。びびった。まじでびびった。
インターフェース名がem1、em2になってます。きもい。
このあたりを参考に対応します。 Getting back to using eth0 in Fedora 15
/boot/grub/grub.conf
にbiosdevname=0
追記/etc/udev/rules.d/70-persistent-net.rules
のNAME
を変更/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からのパケット再送でした。 実際に起きていたことは、、、
- backendがやたら大きいパケットをclientに送付
- 届かない
- backendがパケットを分割して再送
- 届く
- 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
まとめ
いやぁ、検証って大事ですね☆彡