ある日、サーバーが以上に重いな〜重いな〜と感じた時に、想定していなかった事態になっていたので、その奮闘記をブログに残します。
それは、ある休日に、個人ブログを公開しているサーバーで、データのアップロードをしていたら、なんだか昨日の夜よりもスピードが1/10ぐらい遅い。
きっとサーバーアクセスが多くて悲鳴を上げているのかと思ってたんですが、GoogleAnalyticsを見ても、日曜日の朝は全くアクセスが低い。
とりあえず、サーバー管理をしっかりしようと考えて、調査することにしました。
原因究明
とりあえず、回線速度に問題が有るか考えましたが、サーバーは自宅の中に設置されていて、インターネットは普通に閲覧できているので、インターネット回線は問題なしと判断。
次にsshでサーバーにログインしてtopコマンドを叩いてみた所、おかしなアクセスは見当たらない。
ログを確認しても、過度なアタックを受けているようにも見えない。
ちょっと気になったのはtopコマンドで「find」コマンドが少しCPUを使っている数値になっている。
$ top
28760 root 20 0 432396 430212 2032 R 21.5 10.4 1:31.13 find
41 root 20 0 0 0 0 S 2.3 0.0 46:32.99 kswapd0
29798 nobody 20 0 5928 4556 2992 R 2.0 0.1 0:00.06 users
その時のLAは1.4ぐらいで、アクセスがない状態でのこの値は少しおかしいと思い、「ps」コマンドで確認。
$ ps aux|grep find
root 28760 23.4 10.4 432396 430212 ? D 10:39 1:34 find -O3 /var/lib/php5/sessions -depth -mindepth 1 -name sess_* -ignore_readdir_race -type f -cmin +525600 -delete
どうやらPHPが定期的にセッションファイルを削除しているcronコマンドのようです。
今までsessionファイルの管理は、したことがなく、自動削除に任せっきりにしていたので、/var/lib/php5/sessions階層を調査することにしました。
$ ls -lha /var/lib/php5/sessions
このコマンドを叩いてもなかなか返ってきません。
※せっかちなので30秒ぐらいしか待ってませんが・・・
これはとてつもない量のセッションファイルが存在すると思い、下記コマンドで調査
$ find /var/lib/php5/sessions/ |wc -l
2192749
ん?
2192749 !!!! にひゃくじゅうきゅうまんにせんななひゃくよんじゅうきゅう!!!!!
放置しすぎも程があるでしょ。
それにしても、PHPのcronでは削除しきれなかったんですね。
とりあえず、30日以上前(30日以上前)のファイル数を確認
$ find /var/lib/php5/sessions/ -mtime +30|wc -l
2191918
...
続いて3ヶ月以上前(90日以上前)のファイル数
$ find /var/lib/php5/sessions/ -mtime +90|wc -l
1902293
だんだん楽しくなってきました。
続いて半年以上前(180日以上前)のファイル数
$ find /var/lib/php5/sessions/ -mtime +180|wc -l
1238933
最後に1年以上前(365日以上前)のファイル数
$ find /var/lib/php5/sessions/ -mtime +365|wc -l
0
これを整理すると、
合計セッションファイル数:2,192,749
直近1ヶ月: 2,192,749 - 2,191,918 = 831
直近3ヶ月: 2,191,918 - 1,902,293 = 289,625
直近6ヶ月: 1,902,293 - 1,238,933 = 663,360
1年以内 : 1,238,933 - 0 = 1,238,933
それ以上 : 1,238,933
ほぼほぼ過去ファイルのようです。
ちなみに、このfindコマンドでも、LAが上がり続けていました・・・orz
対応施策
やはりsessionファイルを削除するのが一番いいと思うので、30日以上前のファイルは削除します。
$ find /var/lib/php5/sessions/ -mtime +30|xargs rm
この削除処理は、SSDでもかなりの時間を有する事が想定されるので、しばらく放置しておきます。
$ find /var/lib/php5/sessions/ |wc -l
831
フォルダ内のファイルを確認したところ、ちゃんと想定通りに数が減っていたので、無事に削除できたようです。
めでたしめでたし・・・
作業完了して思った事
今回find関数の日付ができるオプションを初めて使ったんですが、非常に便利ですね。
これまでは、ファイル数、容量などを、duやlsコマンドでやってただけだったので、今後は、古いファイルという定義もできるようになって、ありがたいです。
しかしそもそも今回の件は、PHPセッションファイルの存在をすっかり忘れていたことが原因なので、しっかり設計時に削除ポリシーも作らないといけないと、心から誓いました。
ていうより、PHP.iniの設定でなんとかなるんじゃない?
0 件のコメント:
コメントを投稿