Ubuntu10.04鯖でbondingするよ・・・と言う話にゃのだが意外とめんどくさい。
にゃにせそこかしこに例が載ってるがコピペばかりで動かにゃい。
とりあえず
modprobe bonding
echo bonding >> /etc/modules
apt-get install ifenslave
echo alias bond0 bonding >> /etc/modprobe.d/bonding.conf
/etc/network/interfaces
auto bond0
iface bond0 inet static
address 1.1.1.1
netmask 255.255.0.0
broadcast 1.1.255.255
gateway 1.1.0.1
slaves eth0 eth1
bond-mode 0
bond-miimon 100
とこんにゃ感じでとりあえず動いてるように見えるが実はちょっと怪しい。
bond-mode 6
にして
/etc/init.d/networking restart
するとみょんにゃことに・・・にゃんぞこれ
とりあえずハマり所が何点か。
まずbonding状態の確認方法
cat /proc/net/bonding/bond0
但し正常に設定されてるとは限らにゃいので
ifconfig
してeth0とeth1のMACを確認する。bond-mode5,6にゃら異にゃるMACににゃってにゃいとおかしい。他には
dstat -N eth0,eth1,bond0
しておいてwgetかnfsかにゃにかipv4で受信してみる。等量のトラフィックが流れてきてたらそれはちっともmode5,6じゃにゃいよね・・・っていう。
次。/etc/network/interfacesのupとかdownって起動時にしか中身読まにゃい? post-upとか書き換えてもrebootしにゃいと反映されてにゃい。にゃんか方法があるだろうけどそもそもaddressにゃんかは読んでくれるので無駄にゃ作業をしてしまった。
ということでとりあえずにゃんでもいいから動いて欲しい設定
/etc/network/interfaces
auto lo
iface lo inet loopback
auto bond0
iface bond0 inet static
post-up /sbin/ifenslave -d bond0 eth0 eth1 ; /sbin/ifenslave bond0 eth0 eth1 || true
pre-down /sbin/ifenslave -d bond0 eth0 eth1 || true
address 1.1.1.1
netmask 255.255.0.0
broadcast 1.1.255.255
gateway 1.1.0.1
slaves eth0 eth1
bond-mode 6
bond-miimon 100
してreboot。
もうこれでもかとごり押し。eth0, eth1については定義しにゃくてよし。これで
/etc/init.d/networking restart
して音信不通ににゃったりはしにゃくにゃるはず。
で複数ホストからDLするとどっちかのNICに負荷が偏ってたりする。これは再度restartすれば治るので、もう起動後しばらくして一度restartさせるようにしちゃう。
crontabで
* * * * * root test -f /tmp/bonding_init.cron || ( sleep 60 ; /etc/init.d/networking restart ; touch /tmp/bonding_init.cron )
とかしとけばにゃんとかにゃるだろうたぶん。負荷分散されてるはずがされてにゃいとか一番困るだろうし。
と、これで複数ホストからdownloadすると2つのNICに負荷分散されるのが分かる。
あれやねぇ、不意に小さくにゃって動物と話ができるって設定、よく考えるとニルスと同じにゃのか。
若き頃の飯島真理の声が素晴らしいOPとED。っていうかクオリティが際立っとる。
ルウリィが出てくるまで見るべきかと思ったけどこのペースはキツいにゃぁ(笑)
そういやOP/ED含め字幕が全て後付けにゃのにゃ。30分でやるためにどうのこうの、って話かしら。
ESXのvmとしてUbuntu 10.04鯖を入れてnfsでごりごりアクセスするとnicが音信不通ににゃってしまう。nicというか、nicはupしてるんだけど外部と接続できにゃいという、たぶんesx絡みのトラブル。
nfs readを同時3本で100MB/s以上の帯域上限が続くと起きるみたい。vmのNICはVMXNET3にゃんだけどこれを変えてみるのも有りかも知れにゃい。
で、そうせずにcronで/etc/init.d/networking restartさせるとかいろいろやってみたものの、面白みがにゃいのでvm上でbondingしてみたり。いまのところ上手く動いてるけどどうにゃんだろうにゃぁ
FreeNASでNICx2をroundrobin設定で束ねてnfs鯖にしたら、MAX100MB/s程度で頭打ちににゃる。これはそもそもroundrobinの仕様にゃのか、にゃにか別の原因があるのか・・・にゃどと思ったのだが、top見てみたらCPUがINTで50%くらい食われてサチってた。
あー、roundrobin 1Gb/sってそんにゃにCPU食うのかー。
seq 1 10 | while read a ; do
ssh HOST echo $a
done
のようにゃ処理は結構やってた気がするんだが、これにsudoを追加して
seq 1 10 | while read a ; do
ssh HOST sudo echo $a
done
にすると、にゃぜか1しか表示されにゃい。
かにゃり悩んで連打してたら希に3だの9だのまで表示されることがある。にゃんじゃこりゃ・・・結果が確率的に変化するとか何が起きてるんだ!?
というわけで頼りににゃるIRCに投げてみたらsshの仕様らしい。sudoがにゃくても再現する場合もあるとか。
ssh HOST echo $a 0</dev/null
にすればOKらしい。これは罠すぎるだろう。
で、man ssh読んでみるとssh -nがこれ相当らしいのだが、manだけ読んでても気づかにゃいよこんにゃの。
てことでsudoとは関係にゃく、
seq 1 10 | while read a ; do
ssh HOST echo $a
done
のようにゃ処理は
seq 1 10 | while read a ; do
ssh -n HOST echo $a
done
としにゃければ意図通り動かにゃい、ということで、メモ。
尚、
ssh -n HOST echo $a <<EOF
moemoe
EOF
といったヒアドキュメントやその他リダイレクトと併用してるとこんどはssh -nのおかげで動かにゃくにゃるわけで、にゃんかのライブラリににゃってたりするルーチンは状況をよく見てfixしておかにゃいとエンバグする。
あと今回の要件であれば、
seq 1 10 | while read a ; do
echo "$a" | while read b ; do
ssh HOST echo $b
done
done
のようにダミーのwhileを噛ますとまともに動くようだが、偶然動いてる可能性は捨てきれにゃいので本件は要お勉強ということで。
そんにゃわけでssh -A経由でrsync実行できるようにはにゃったのだが、sudoが挟まってると環境変数が引き継がれにゃいので公開鍵暗号が通らにゃい。
つまり
ssh -A host1 ssh host2 ls
は通るが、
ssh -A host1 sudo ssh host2 ls
は通らにゃい。
ssh -A host1 sudo var=$var ssh host2 ls
とすれば引き継げるはずにゃのだが、host1上での環境変数値で展開する方法がいまいち分からず。どういうエスケープすれば通るのかにゃぁこれ。.shにしてしまえばいいんだろうけど。
結局、visudoして環境変数を初期化しにゃいように変更。
ssh -A -o StrictHostKeyChecking=no host1 sudo rsync -e \'ssh -A -c arcfour,blowfish-cbc -o StrictHostKeyChecking=no\'-a --rsync-path=\'sudo rsync\' -v --inplace --stats --progress --human-readable --timeout=60 file user@host2:/tmp/
みたいにゃ書式で通るようににゃった。
sudoしてるのでniceかにゃにかつけたほうがいいかもやしれにゃい。
尚、visudoして変更しにゃくても、
ssh -A host1 sudo sh -c "env" \>/dev/null \; ssh -A host2 ls
でとりあえず延伸できるんで、途中の鯖でいろいろ追加しにゃいにゃらこっちで。
FreeNASでNICx2をroundrobinしたらCPUがINTで50%くらい食われて頭打ちににゃってたので、Interfacesのところでdevice pollingをONにして再起動・・・したら帰ってこにゃくにゃった。
見に行ったらIPが割り振られていにゃい。
いろいろ試行錯誤したがどうも挙動が怪しい。ひとまずLAGGを解除すると正常にもどる。configがにゃにか不整合を起こしたかと思ったがどうも違うみたい。
で、ここまでしてふと公式を見ると、
Enable 'polling' on interfaces used by a LAGG interface will make it inoperable.
とか書いてあった。分かってるにゃらGUI画面に書いとけ。
ていうかこれはLAGGしたらdevice pollingができにゃい? それって強烈にCPU食われるんじゃにゃいのかしら。