状態としては、サーバのLoad averageはいつもは3以下なのですが、突発的に300程度まで上昇し、そのまま数時間200程度を維持し続け、下がるときは一気に下がる状態が続いています。(アップロードしたhot-sanicの週間データをご覧下さい。)
この状況を解決するにはどうすれば良いでしょうか。
サイトはPHP + Perl + MySQLにて構築しています。
一日のページビューは12万PV程度、一日の転送量は500GB程度です。
HDDは40GB程度の余りがあります。
サーバスペックは下記をご覧ください。
Sempron 2600+ / 512M / 70GB / 100Base-TX
Fedora Core 5 / Apache 2
以上、よろしくお願い申し上げます。
* URLのみの紹介はご遠慮ください。
※何がボトルネックになっているか分からないので想像ですが...。
furutanianさんとかぶりますが、512Mはちょっと少ないですね。
1G~2G程度にすると変わる可能性があります。予算的に余裕があれば積めるだけ積むのが良いです。
サーバの動作が遅くなる原因のひとつに、メモリを使い切ってスワップを使用するというのがあります。こうなるともう最悪なくらい遅くなります。
スワップうんぬん以前に、なるべくHDDへのアクセスを減らし、メモリ上で解決すると格段にパフォーマンスがあがります。Linuxは一度使用したファイルをメモリに空きがあれば、メモリ上にとっておいてくれます。ですので単純にメモリを増設するだけでかなり変わってきます。
またメモリをディスクとして使用できる機能(tmpfs)が最近のLinuxにはついていますので、それを用いるという手もあります。
後はプログラムが動作する環境を軽量化するのも大切です。
Perlはmod_perl化されているでしょうか?PHPはバージョンが5以降、かなり軽くなったと聞いています。バージョンを上げたり、環境を整備されるだけでかなり変わります。
また特定の時間だけ重くなるとのことですが、単純にアクセスが増加しているだけでしょうか?バッチを走らせたり、どこかからアタックをしかけられているなどの要因は調べられたりはしたでしょうか?まずはそこの調査から始められるのが良いかと思います。
少しでも負荷を減らすために、
・アクセスが集中している時間に定期実行されているタスクがあれば、そのタスクの実行時間を変更する。
・Apacheのチューンナップを行う
(この辺についてはhttp://www.apache.jp/jdocs/tune/に書かれています)
・MySQLのメンテナンスを定期的に行う
・MySQLをSQLiteなどの「速い」といわれているDBに変更してみる
・PHPやPerlではなく、JavaScriptに書き換えてみる・・(大変そうですが)
・高速なHDDへの乗り換え
などですかね。。。他にもあるかもしれませんし、上に挙げた方法ではあまり効果がないかもしれません。
アクセスの特性がわからないのでなんともいえませんが、アクセスが量に対しメモリが少なく、ボトルネックになっているかもしれません。現在の情報から言えることはそれくらいですね。
ちなみに、レンタルサーバですか? 回線の帯域は?
sysstat パッケージが入っていなければ入れて、sar 情報を展開すると、ボトルネックを特定することができるかもしれません。
※何がボトルネックになっているか分からないので想像ですが...。
furutanianさんとかぶりますが、512Mはちょっと少ないですね。
1G~2G程度にすると変わる可能性があります。予算的に余裕があれば積めるだけ積むのが良いです。
サーバの動作が遅くなる原因のひとつに、メモリを使い切ってスワップを使用するというのがあります。こうなるともう最悪なくらい遅くなります。
スワップうんぬん以前に、なるべくHDDへのアクセスを減らし、メモリ上で解決すると格段にパフォーマンスがあがります。Linuxは一度使用したファイルをメモリに空きがあれば、メモリ上にとっておいてくれます。ですので単純にメモリを増設するだけでかなり変わってきます。
またメモリをディスクとして使用できる機能(tmpfs)が最近のLinuxにはついていますので、それを用いるという手もあります。
後はプログラムが動作する環境を軽量化するのも大切です。
Perlはmod_perl化されているでしょうか?PHPはバージョンが5以降、かなり軽くなったと聞いています。バージョンを上げたり、環境を整備されるだけでかなり変わります。
また特定の時間だけ重くなるとのことですが、単純にアクセスが増加しているだけでしょうか?バッチを走らせたり、どこかからアタックをしかけられているなどの要因は調べられたりはしたでしょうか?まずはそこの調査から始められるのが良いかと思います。
大容量ファイルとの事ですが、それをダウンロードさせるサイトだと考えてよろしいでしょうか?
高負荷の原因によりますが、さし当たっての対処としては以下の2種類が考えられます。
1.回線容量が足りていない場合
1時的に回線容量が足りない場合はサーバー側で大域制限をかけることを検討した方が良いでしょう。
2.サーバースペックが足りない場合
ディスクアクセスやCPU使用率が常に100% で有るなどサーバースペックが足りない場合は Apache のプロセス数に制限を書けたほうが良いでしょう。
http://httpd.apache.org/docs/2.0/ja/mod/mpm_common.html#maxclien...
その他、メモリを追加してキャッシュ機能を搭載する事や、単発で大容量のファイルが多いなら KeepAlive 機能を無効にするなどの対策が考えられます。
あくまで感想ですが、用途にしては HDD と Memory のスペックが足りていないようにも思うので、そのあたりを改善するのも手かもしれません。
負荷が集中している時、以外はおおむね、低いのでバード的な問題ではないように思います。
>大容量ファイル(10MB~200MB)を取り扱うサイト
ということでどうしても占有時間が長くなりがちなのでApacheに
トラフィック制御モジュールを導入してみてはどうでしょう。
http://www.atmarkit.co.jp/flinux/rensai/apache2_08/apache08c.htm...
http://www.atmarkit.co.jp/flinux/rensai/apache2_08/apache08d.htm...
実際、導入したことが無いので申し訳ないのですが、
htmlファイルを優先する。IPアドレスごとにダウンロードファイル数を制限
するなど、一気にダウンロードするようなソフトには有効で応答性も確保できるように思うのですが。
逆にダウンロードする時間が長くなるなどクライアントには好くないことでトレードオフが難しいですが、数100MBでは数分かかるでしょうからもう少し長くなっても大きなサービス低下にはないないように思います。
ありがとうございます。
もう少し具体的な回答が頂ければと思います。