« 2006年05月 | メイン | 2006年07月 »>
2006年06月14日
■mrtgを導入してみる。
[]

トラフィックの量を調べたいということで、MRTGを導入することにした。
MRTGはSNMTをしゃべってその結果を加工するようなので、SNMPエージェントも設定しないといけない。
ということで、まず、SNMPエージェントを設定。

patitude install snmpd, snmp, mrtg

エージェントのテストのためにSNMPも入れておく。
自分で自分を監視するので、ローカルのみアクセス制御を設定する。

[/etc/snmp/snmpd.conf]

# コミュニティとセキュリティのマップ
# sec.name source community
com2sec local 127.0.0.1 private

# セキュリティとグループのマップ
# sec.model sec.name
group MyRWGroup v1 local
group MyRWGroup v2c local
group MyRWGroup usm local

# グループのアクセス制御設定
# context sec.model sec.level match read write notif
access MyRWGroup "" any noauth exact all all none

コミュニティ名はprivateのままつかわないこと。
アクセス制御は読み込みだけでも問題ない。
設定したらデーモンを再起動して、接続テスト。

/etc/init.d/snmpd restart snmpwalk -v 1 -c private localhost

なんかMIB情報がずらずら出てきたらOK。
次にmrtgの方。
debianだと設定ファイルを/etc/mrtg.cfgにおくんだけども、ちゃんと分けて配置したいので、/etc/mrtg/mrtg.cfgに置く。
で、cfgmakerでmrtgの設定ファイルのひな形を作るんだけども、どうやら、IPエイリアスしてるのは区別できないっぽい。

cfgmaker --ifref=ip private@localhost

とかやってもだめ。
そうなると、PPPoEセッション別にトラフィックを調べるには、NIC二枚差すか、SNMPのしゃべれる賢いルータを使うしかないらしい。
最低でもYAMAHAクラス。
貧乏人はあきらめます。
ついでに、ルータでトラフィックを調べてるわけではないので、LAN内部からのトラフィックも加算される。
まあ、目安にはなるだろうということで、設定を継続することに。
シェルは/bin/falseなmrtgユーザを追加しておく。
ついでに、CPUの方も眺めたいので、それも設定。

cfgmaker --ifref=eth > /etc/mrtg/mrtg.cfg

[/etc/mrtg/mrtg.cfg]
### Global Config Options
# ディレクトリはあらかじめ掘っておくこと
Htmldir: /home/mrtg/public_html
Imagedir: /home/mrtg/public_html/images
IconDir: icons
#logはウェブから見えない場所に配置
Logdir: /var/log/mrtg

### Global Defaults
Language: eucjp
EnableIPv6: no
Interval: 5
Refresh: 300

Target[traffic]: !00-00-00-00-00-00:private@localhost:
# ギガビットLANなので、MaxBytesは 1G/8 = 125,000,000
MaxBytes[traffic]: 125000000
Options[traffic]: growright, noinfo
Title[traffic]: Traffic Analysis for 00-00-00-00-00-00
PageTop[traffic]: 適当に

#.1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2の値は、CPU利用率ではない
# http://www.strikeout.jp/karaburi/2004/08/netsnmp_mrtgcpu_1.html 参照
Target[cpu_load]: .1.3.6.1.4.1.2021.11.50.0&.1.3.6.1.4.1.2021.11.52.0:private@localhost
MaxBytes[cpu_load]: 100
Options[cpu_load]: growright,nopercent,noinfo
Title[cpu_load]: CPU load average
YLegend[cpu_load]: CPU load average(%)
LegendI[cpu_load]: User
LegendO[cpu_load]: System
Legend1[cpu_load]: CPU load average(User)(%)
Legend2[cpu_load]: CPU load average(System)(%)
ShortLegend[cpu_load]: %
PageTop[cpu_load]: 適当に

次にmrtgユーザで実行できるように、オーナーを変えておく。
ディレクトリがなければ掘っておく。

chown mrtg:mrtg /var/lock/mrtg
chown -R mrtg:mrtg /var/lib/mrtg
chown -R mrtg:mrtg /home/mrtg
chown -R mrtg:mrtg /etc/mrtg

mrtgをデーモンモードで動かすので、起動停止スクリプトを作成。
/var/run/mrtgディレクトリをつくって、オーナーをmrtgユーザに変えておく。

[/etc/init.d/mrtg]

#/bin/sh

MRTG=/usr/bin/mrtg
CONF=/etc/mrtg/mrtg.cfg
PIDFILE=/var/run/mrtg/mrtg.pid
LOGFIE=/var/log/mrtg/mrtg.log
USER=mrtg
GROUP=mrtg

if [ ! -x ${MRTG} ] || [ ! -r ${CONF} ]; then
echo "executable file or config file not found."
exit 1
fi


case "$1" in
start)
if [ -f ${PIDFILE} ]; then
echo "mrtg already started."
else
${MRTG} --user=${USER} --group=${GROUP} --daemon --pid-file=${PIDFILE} --logging ${LOGFILE} ${CONF} >>${LOGFILE} 2>&1
echo "mrtg started."
fi
;;

stop)
if [ ! -f ${PIDFILE} ]; then
echo "mrtg is not running."
else
#SIGTERMだとなんかエラー出るのよね。
#正しい止め方がわからない。
kill -9 `cat ${PIDFILE}`
rm ${PIDFILE}
echo "mrtg stopped."
fi
;;

*)
echo "Usage: $0 { start | stop }"
exit 1
;;
esac

exit 0

自動起動設定追加。

update-rc.d mrtg defaults 90 10

後はindexmakerでindexを作ったりしておしまい。
後、debianだとmrtgインストール時にcronに自動的にタスクが登録されるので、それも削除。

rm /etc/cron.d/mrtg

投稿者 邑波。 : 12:39 | コメント (1) | トラックバック

2006年06月13日
■ルータ二台でマルチセッション
[]

先日の続きになるが、PHPで書いたスクリプトで、クライアントの要求ごとにコネクションを生成するやつ。
次の日の朝、データベースのバックアップが走らなかった。
理由は。
そのPHPスクリプトがコネクションを食いつぶしていた。
コネクションを食いつぶすと、コネクションを獲得するまで待ち状態に入るため、Apacheのプロセスも激増。
そんなスクリプトなので当然タイムアウト処理も入っていないし、そもそも、悪意の持った人がそのスクリプトを100個同時に開いたりすれば一瞬で終わる。
ので、封鎖。

そして問題の速度制限。
これを回避する方法。
1. プロバをかえる
2. マルチセッションを張ってプロバイダを使い分けて、トラフィックを分散させる

1の方は、固定IPを変えなければならないのが面倒。
そこで、2を選択。
2を実現するには。
調べまくった結果、今のルータではできないことが判明。
つーか、その辺のルータ、マルチセッション対応とかいって全然対応してない。
PPPoE二つ同時にはじけるだけで、ルーティングが全然できない。
宛先のIPアドレスだけをみたルーティングしかできないマルチセッションなんてフレッツスクエア以外に何の使い道がある。
まともにマルチセッションを謳ってもいいルータは、廉価なものでは、BA8000Pro、BRL-04FMXくらいなわけだが、こいつらはNAPTセッション数の増大に弱く、結局うちのサーバじゃ使えない。
イロイロと紆余曲折はあったものの、最終的な選択は、ルータ二台でマルチセッション。
サーバをルータ化させることも考えたが、LAN内部からのパケットも全部吸い込むため、LAN内部からでかいファイルを高速で落とそうものなら、如実に影響が出そうなのでやめ。

結局、最終的なレイアウトは以下の通り。

光終端装置-HUB-+-ルータA-+
        |      |
        +-ルータB-+-各マシンへ

ルータAのWAN側アドレスはPPPoE1、LAN側アドレスは192.168.0.1。
ルータBのWAN側アドレスはPPPoE2、LAN側アドレスは192.168.0.2。

これで各マシンはゲートウェイをどっちのルータにするかで、利用するPPPoEセッションを選択できる。
で、サーバ側はIPエイリアスを使って、内部IPを二つ持たせる。
サーバ1: 192.168.0.10
サーバ2: 192.168.0.11(エイリアス)

/etc/network/interfacesの内容

auto eth0
iface eth0 inet static
address 192.168.0.10
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.0.1

# Secondary IP Address
auto eth0:0
iface eth0:0 inet static
address 192.168.0.11
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255

ルータ1はサーバへのマスカレードは192.168.0.10へ、ルータ2は192.168.0.11へおこなうようにする。
サーバ側では、192.168.0.10からのパケットは192.168.0.1をゲートウェイとし、192.168.0.11からのパケットは192.168.0.2をゲートウェイとすることにする。
この設定はiproute2でおこなう。
192.168.0.1は、インターフェイスの設定で、デフォルトゲートウェイとして自動で設定されるのでさわらない。
192.168.0.11に関する設定だけおこなう。

/etc/iproute/rt_tableに使うテーブル名をつっこんでおく。
1 router2
とでも。

ip rule add from 192.168.0.11 table router2 prio 10000
ip route add default via 192.168.0.2 table router2

これでいけた。
ルーティングを送信元ポートまでみておこなえれば、IPエイリアスやNIC二枚差しなんてしなくてもいけるんだけども、結局やり方がわからなかった。
誰かやり方知ってる人いませんか?

投稿者 邑波。 : 20:43 | コメント (0) | トラックバック

2006年06月12日
■ASAHIネットのせいで
[]

ルータが一台お亡くなりになりました。

金曜日の夜のこと。
突然外部からの接続がすさまじく重くなったとの報告。
原因究明のために、イロイロ調べる。

調べていると、前科一犯の人から、うちのせいかも?みたいな話が。
少し前に、ApacheのCPU利用率が50%も喰らうという事件があった。
しかも、その状態になっていると、Apacheの再起動に数分かかる。
原因がよくわからなかったので、とりあえず、HTTPSの処理が重いのだろうか、と思い、HTTPSで通信していたサイトの一部をHTTPに変えた。
が、しばらくたつとまたCPU利用率が上昇する。
しかし、利用率が普通のときもある。
謎に思っていたところ、その人から連絡があり、ajaxとPHPでチャットを作ったとのこと。
処理に、スリープも入っていないwhile(タイムアウト)なものが入っており、それが原因。
それで前科一犯。
でまあ、その人が、今度はデータベースを利用したキャラクタ管理システムのようなものを作ったと。
で、それが、データベースの接続をアプリ全体で使い回さないで、ユーザの接続ごとにデータベースへの接続・切断をおこなうものらしい。
それが原因かどうかは、イロイロ調べてみた感じ、違うっぽかった。
ユーザの接続ごとにDBへのコネクションを生成するのは気になったが、とりあえずこの時点ではおいておくことに。

サーバに流れてきているパケットを見てみた感じ、たいした量ではない。
ローカルネットワークでの通信は概ね良好。
速度測定サイトで速度計測してみても、全然帯域に余裕がある。
外部からはHTTP、FTP、その他も重い。
ルータを再起動すると、はじめは速度が出るが、1分もたたないうちに速度が落ちる。
試しにサーバマシンにリブートをかけても変化なし。

ルータの限界なのかとも思ったが、それなら、速度測定で速度が出る理由がわからない。
ルータの外でトラフィックが増大しているとしても、それも同じく速度測定で速度が出るのかという話。
サーバマシンの負荷であるなら、ローカルネットワークで快適というのはあてはまらないはず。
実際、先ほどのチャットの問題の時は、ローカルネットワークでも死にそうになった。
ルータの限界であれば、ルータ再起動すればしばらくは復活するはずで、30秒たらずでまたいっぱいいっぱいになるということも考えにくい。

そこで、あることに気がついた。
HTTPで通信したときには、ローカルから外部への接続が快適なのだが、FTPだと死にそうに重い。

ぐるぐる頭を巡らせた結果、一つの可能性にたどり着いた。
アサヒネットが帯域制限かけやがったのかもしれないと。
そこで、ぐぐってみると、朝日はトラフィック量が多いと、帯域制限をしやがるということがわかった。
糞プロバ認定確定。
WinnyなんかのP2Pソフト使って帯域制限かけられるとかならわからんこともないが(それでもどうかと思うが)、通常のサーバ運営もままらないというのは全くもって理解不能。
死んでくれと。

おそらく、帯域制限をかけたということをわかりにくくするために、該当ホストがリクエスト元であるHTTP通信は除外するという小細工を仕込んでいるのだろう。
おかげで、こちら側からは通常のブラウジングではストレスを感じないし、速度測定サイトで測定しても、帯域に余裕があるように見える。
以前からたまに異常にサーバへの接続が重くなることが発生していた現象の謎が、これで全て氷解した。

過去のパターンからすると、一日だか二日だか放置すると、速度が戻った記憶がある。
で、実際に戻った。
自動でスクリプトでも走らせてるんだろう。
嫌がらせにもほどがある。

投稿者 邑波。 : 15:47 | コメント (0) | トラックバック

2006年06月09日
■お勉強

最近、ものすごくお勉強しています。

しばらくC言語をいじっていました。
おかげさまで、だいぶ読めるようになってきました。
が。
C言語をいじっていると、端々で、Javaだったら。。。というのが脳裏をかすめまくります。
構造化言語とオブジェクト指向の違いの問題だけであれば、どうにかなったんですが、ついに限界を感じました。

そしてJavaへかえってきました。
そこで、ふと、J2SE5.0の新機能ってどんなもんなんだろ、と思って、今更ながらに調べ始めました。
すると。
今まで経験してきた、J2SE1.3->1.4(比較的新しいプログラマなんで、デビューは1.3でした)なんて目じゃないすさまじい大変化をとげているじゃありませんか。
1.3->1.4は、便利なクラスが増えたくらいののりだったんですが、1.4->5.0は、今までのJavaプログラムの定石を覆すような、大きな変化がもたらされています。
この変化は、既存のJavaプログラマ全てに影響を与えるだけの物だと思います。
影響を受けないとすれば、よほどJavaらしからぬネイティブに近いところを生業にしている人や、今までの通りでも動くからいいやと投げている人くらいだと思います。

自分の知識確認のために、少しずつ書きためていこうかと思います。

投稿者 邑波。 : 17:00 | コメント (0) | トラックバック

■最近
[]

非常に行動力がダウン。
なにをするにも気力が。

投稿者 邑波。 : 02:06 | コメント (0) | トラックバック