タイトルに「の」がいっぱいあるけど仕方ない。

問題発生
うちの回線はNTT西日本のフレッツ光プレミアムなんだけども、こいつはNTTが貸してくれてるCTUという箱にISP情報なんかを(なぜかNTT経由で)書き込んで接続する。
このCTUという奴が、ADSLでいうルータ+モデムみたいな感じのやつで、こいつがあれば複数の端末を一つの回線でネットにつなげるし、NATなんかもやってくれるからサーバ公開にも使える便利アイテム。
ということで、俺もそれを使ってサーバ運営してた。

けど、1年ぐらい前に急に調子が悪くなって、ネットに繋がったり切れたりを繰り返すようになった。
その頃はまだ非固定IPアドレスで運営してたので、DDNSを更新せずにサーバに対するアクセスが無い状態にしてやると全く問題なく使えるので、サーバへのアクセス過多が原因だと思われる。

現状確認
今まで使えてたのになぜ急に?ってことだけど、この頃どんどんサーバへのアクセスが増えてた。今も増えてる。
その当時で、apacheのアクセスログが毎秒30~50行増えるような状態だった。今は60~70行ぐらい。
しかしアクセスは多いけど、転送速度は5~10Mbps程度なので回線速度の問題ではないはず。

とりあえず繋がったり切れたりってのがどんな感じなのか確認してみようってことで、現在の転送速度をモニタするで紹介したスクリプトを少しいじって、30分ほど動かしてファイルにリダイレクトする。

[genkikko@vine php_scripts]$ php transfer_speed.php > transfer_speed.log
これで出来たログファイルを、エクセルで読み込んでグラフを作ってやる。
image
約50秒間の切断と、約1分10秒間の接続という約2分間のサイクル。
とてもきれいだけど、これはいかん。

試行錯誤
試行錯誤といってもCTUの設定ではどうしようもないので、早々にこいつは諦めて、無線アクセスポイントとして使ってたルータを使って、CTUを飛び越えて直接PPPoE接続してみる。
(ちなみに、この頃ちょうどCTUのファームウェアがアップデートされて、直接PPPoE接続出来るようになったばっかりだったように記憶してる。)
しかし安物無線ルータは、接続した瞬間にリセット以外に復旧できないレベルのハングっぷりを見せつけてくれた。
(ってゆっても普通に使ってる分には充分な性能を持ってるので、今もウチの無線ルータはこれを使ってますよ。)

その他、ADSL時代に使ってた有線ルータを2台ほど試したがどちらもハング。
(これはどっちも知人に売却したので、メーカ・型番等記憶に無し。どちらも数千円のもの。)

問題解決
仕方がないのでお高いルータを購入するかと思ったけど、どうせ数万円のルータを買うなら、あと1~2万円積んでパソコン作って、勉強も兼ねてLinuxでルータを作ってみたらいいんじゃないかという結論に達して、安いマザーでルータマシンを構築したのだけれど、それはまた別のお話。
ちなみに、ルータマシンが頻繁に落ちるで紹介したように、こいつはこいつで俺に問題をもたらしてくれる。

原因推測
ルータマシンにどこで手に入れたか記憶にないような怪しいメモリを差して運用してたところ、再起動したときにメモリサイズが異様に小さく認識されてしまった。
Linuxは起動時に、メモリサイズに応じて

/proc/sys/net/ipv4/ip_conntrack_max
の値を設定するらしいのだが、このときメモリサイズが小さく認識されてしまったので、この値が小さく設定されてしまった。
この値は、
/proc/net/ip_conntrack
というファイルの最大行数を指定していて、このファイルはiptablesがパケットの情報をメモるためのファイルらしい。

これが原因で、クライアントマシンがインターネットに繋がらず、ルータマシンにディスプレイを接続してみたところ、

ip_conntrack: maximum limit of 4096 entries exceeded.
というメッセージが大量発生していたので判明した。

このときは、あいやぁーと慌てて、クライアントマシンのまともなメモリを差してすぐに復旧させてしまったので、詳細な挙動は分からないけれど、CTUや安いルータがダメだった原因って、これだったんじゃないかなぁと思った。