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

computer-1574533_1280
LINEで送る
Share on GREE
Share on LinkedIn

ある日、サーバーが以上に重いな〜重いな〜と感じた時に、想定していなかった事態になっていたので、その奮闘記をブログに残します。
 

それは、ある休日に、個人ブログを公開しているサーバーで、データのアップロードをしていたら、なんだか昨日の夜よりもスピードが1/10ぐらい遅い。
 

きっとサーバーアクセスが多くて悲鳴を上げているのかと思ってたんですが、GoogleAnalyticsを見ても、日曜日の朝は全くアクセスが低い。
 

とりあえず、サーバー管理をしっかりしようと考えて、調査することにしました。

原因究明

とりあえず、回線速度に問題が有るか考えましたが、サーバーは自宅の中に設置されていて、インターネットは普通に閲覧できているので、インターネット回線は問題なしと判断。
 

次にsshでサーバーにログインしてtopコマンドを叩いてみた所、おかしなアクセスは見当たらない。
 

ログを確認しても、過度なアタックを受けているようにも見えない。
 

ちょっと気になったのはtopコマンドで「find」コマンドが少しCPUを使っている数値になっている。
 

 

その時のLAは1.4ぐらいで、アクセスがない状態でのこの値は少しおかしいと思い、「ps」コマンドで確認。
 

 

どうやらPHPが定期的にセッションファイルを削除しているcronコマンドのようです。
 

今までsessionファイルの管理は、したことがなく、自動削除に任せっきりにしていたので、/var/lib/php5/sessions階層を調査することにしました。
 

 

このコマンドを叩いてもなかなか返ってきません。
※せっかちなので30秒ぐらいしか待ってませんが・・・
 

これはとてつもない量のセッションファイルが存在すると思い、下記コマンドで調査
 

 

ん?
 

2192749 !!!! にひゃくじゅうきゅうまんにせんななひゃくよんじゅうきゅう!!!!!

 

放置しすぎも程があるでしょ。
 

それにしても、PHPのcronでは削除しきれなかったんですね。
 

とりあえず、30日以上前(30日以上前)のファイル数を確認
 

 


 

続いて3ヶ月以上前(90日以上前)のファイル数
 
$ find /var/lib/php5/sessions/ -mtime +90|wc -l
1902293

 

だんだん楽しくなってきました。
 

続いて半年以上前(180日以上前)のファイル数
 

 

最後に1年以上前(365日以上前)のファイル数
 

 

これを整理すると、

 

ほぼほぼ過去ファイルのようです。
 

ちなみに、このfindコマンドでも、LAが上がり続けていました・・・orz

対応施策

やはりsessionファイルを削除するのが一番いいと思うので、30日以上前のファイルは削除します。

 

この削除処理は、SSDでもかなりの時間を有する事が想定されるので、しばらく放置しておきます。
 

 

フォルダ内のファイルを確認したところ、ちゃんと想定通りに数が減っていたので、無事に削除できたようです。
 

めでたしめでたし・・・

作業完了して思った事

今回find関数の日付ができるオプションを初めて使ったんですが、非常に便利ですね。
 

これまでは、ファイル数、容量などを、duやlsコマンドでやってただけだったので、今後は、古いファイルという定義もできるようになって、ありがたいです。
 

しかしそもそも今回の件は、PHPセッションファイルの存在をすっかり忘れていたことが原因なので、しっかり設計時に削除ポリシーも作らないといけないと、心から誓いました。
 

ていうより、PHP.iniの設定でなんとかなるんじゃない?

Leave a Reply

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


*