PHP-Sessionが肥大化してサーバースペックが落ちる現象の対応

2017年9月21日

サーバー テクノロジー トラブル 日記

ある日、サーバーが以上に重いな〜重いな〜と感じた時に、想定していなかった事態になっていたので、その奮闘記をブログに残します。 それは、ある休日に、個人ブログを公開しているサーバーで、データのアップロードをしていたら、なんだか昨日の夜よりもスピードが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の設定でなんとかなるんじゃない?