Apache が起動しない - Address already in use: make_sock: could not bind to address

DB サーバーの負荷が異常に高い状態が数日続いていることに気がついたので、サーバーにログインして調べてみたら以下のような状態に。

# top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
16103 apache 25 0 33688 4276 1268 R 32.7 0.1 1106:33 perl
16098 apache 25 0 33688 4280 1268 R 29.8 0.1 1106:27 perl
16107 apache 25 0 33688 4280 1268 R 26.8 0.1 1106:25 perl


DB サーバーなのに apache ユーザーで perl が叩かれてそれが合計で 100% 近く消費している状態。
一応、phpMyAdmin 用に Apache が動いているので、http経由で Perl のスクリプトか何かが叩かれてるんだろうと。

まぁ、サービスに影響ない部分なので、とりあえず Apache を再起動しようかなぁっと思い、実行すると変なエラーが・・・

Address already in use: make_sock: could not bind to address [::]:80

で、何度起動使用しても Apache が立ち上がらない状態に。

何となく、上記の3つの perl 絡みのプロセスが悪さしているようだったので、それらのプロセスを kill。

# kill 16103

案の定、終了してくれないので強制終了。

# kill -9 16103

で、再度 Apache を起動するも、先ほどと同じエラーで起動できず・・・

メッセージの内容からポート 80が使えない的な感じ。

どうやら、ポート 80を利用しているプロセスが残っているのが原因のようなので、lsof コマンドでポート 80 を使っているプロセスを調べてみると・・・

# lsof -i :80
httpd 14817 apache 4u IPv6 9590 TCP *:http (LISTEN)


(中略)


httpd 15937 apache 4u IPv6 9590 TCP *:http (LISTEN)
perl 16092 apache 4u IPv6 9590 TCP *:http (LISTEN)
httpd 16567 apache 4u IPv6 9590 TCP *:http (LISTEN)


(中略)


httpd 16716 apache 4u IPv6 9590 TCP *:http (LISTEN)

50個くらい出てきました・・・

ということで、こいつらを終了します。

# kill 14817


(中略)


# kill 16716

が、lsofを再実行するとまだ残ってる。

# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
perl 16092 apache 4u IPv6 9590 TCP *:http (LISTEN)

最初に終了した perl の残骸・・・
強制終了します。

# kill -9 16092

これで 80 を使ってる全てのプロセスが終了しました。

っという事で、Apache を起動。

# service httpd start
httpd を起動中: [ OK ]

やっと問題なく起動できました。


原因は良く分からなかったんですが、無事に CPU 負荷も下がり普段の状態に戻りました。

うーん、なんだろうなぁ?