web-dev-qa-db-ja.com

VPSサーバーメモリの最適化

私がやろうとしていること

サーバーのリソース制限が厳しくなることがあります。メモリの枯渇を防ぐために、サーバープロセスを制限する必要がありました。自分が正しい方向に進んでいるかどうかを知るために少し専門家の助けが必要です。おそらく、システムをより安定して実行するのに役立つ明らかな設定変更を見つけてください。

[〜#〜]履歴[〜#〜]

最近、私の会社は共有ホスティングからVPSにアップグレードしました。基本的に私たちは共有ホスティングを超えてしまい、週末の過度のCPU使用率のためにホストがサイトを一時停止したために問題が発生し始めました。私たちのウェブサイトのユーザーは毎週金曜日と土曜日に2倍または3倍になる傾向がありますが、これは私たちの場合は予想外ではありません。 (平日は1日あたり約5000回の訪問[〜2500人の訪問者]、週末は約9500回の訪問[〜4500人の訪問者]。)

VPSを使用しているので、CPUの問題はありません。 (実際、CentOS WHMコントロールパネルには「.000201%CPU負荷」と表示されます。)ただし、メモリ不足の問題が発生し、クラッシュが発生しています。

問題の概要

私たちのウェブサイトはWordPressベースです。ただし、コメントを除いて、「書き込み」アクティビティはほとんどありません。ほとんどのユーザーは、私たちが作成したかなり静的なページを見ているだけです。

数か月前に最初にVPSにアップグレードしたとき、2012年10月、Webサイトは平日は正常に動作しましたが、週末ごとにメモリが不足していました。多くの場合、クラッシュは繰り返し発生し(24時間に5〜20回、散発的に)、通常は金曜日の夜から土曜日の午後まで続きます。

平日はサーバーが一貫して65〜90%のメモリ使用量で稼働し、週末には100%に達し、クラッシュが発生しました。

修正するための手順

私はVPSを初めて使用したので、すべてのデフォルト設定から始めました。このサイトや他のウェブサイトでメモリの問題を解決することについて読んだアドバイスに従って、後で微調整を始めました。

以下の「現在の構成」に要約されているMySQL、PHP、およびApacheを調整しました。また、ApacheとPHPを再コンパイルして、不要なモジュールを削除しました。WordPress(W3T)用のより優れたキャッシュプラグインをインストールし、APCオペコードキャッシングを追加しました。また、開始しました。 gz圧縮を使用し、多くの静的ファイルを別のサブドメインに移動しました。

スケジュールに従ってサーバーのステータスを確認し、必要に応じて再起動するための気の利いた小さなスクリプトを作成しました。また、トラブルシューティングに役立つように、サーバーエラーログのトランスクリプトも送信します。 (それは単なるバンドエイドです。しかし、週末に座って監視したくないので、Webサイトをオンラインに保つことが重要でした。)

つい最近、1週間ほど前(2013年1月)にサーバーをアップグレードしましたRAM 1 GB(2 GBバースト可能)から2 GB(3 GBバースト可能)に。これで修正されたようです。問題の大部分ですが、それでもサーバーがハングしているという通知が時々(1週間に1回程度)表示され、「プロセススロットを適用できません」PHPエラーが発生します。

現在の構成

これは、CentOS 6、Apache 2(Worker MPM)、PHP 5.3.20(FastCGI/fcgi)、およびMySQL5.5.28を実行するApacheサーバーです。2GBRAM(3 GBバースト可能)、24CPU。

MySQLは現在約618MB、RAMの約20.1%を使用しています。 PHPはプロセスごとに最大89MBを使用します。Apacheはプロセスごとに最大14MBを使用します。

典型的な平日top出力:

top - 15:31:13 up 89 days,  5:26,  1 user,  load average: 1.54, 1.00, 0.70
Tasks:  49 total,   1 running,  48 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.1%sy,  0.0%ni, 99.7%id,  0.1%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   3145728k total,  1046444k used,  2099284k free,        0k buffers
Swap:        0k total,        0k used,        0k free,        0k cached

残念ながら、週末/最も忙しい時間のトップ出力の現在の例はありません。

Apache構成:

StartServers: 5
MinSpareThreads: 5
MaxSpareServers: 10
ServerLimit: 80
MaxClients: 56
MaxRequestsPerChild: 5000
KeepAlive: Off

PHP構成:

MaxRequestsPerProcess 500
FcgidMaxProcesses 15
FcgidMinProcessesPerClass 0
FcgidMaxProcessesPerClass 8
FcgidIdleTimeout 30
FcgidIdleScanInterval 15
FcgidProcessLifeTime 60
FcgidIOTimeout 300
FcgidMaxRequestLen 268435456

MySQL構成:

[mysqld]
max_user_connections            = 75
net_buffer_length               = 8K
read_buffer_size                = 256K
read_rnd_buffer_size            = 512K
skip-external-locking
sort_buffer_size                = 512K

# MyISAM #
key_buffer_size                 = 32M
myisam_sort_buffer_size         = 16M
#myisam_recover                 = FORCE,BACKUP

# SAFETY #
max_allowed_packet              = 8M
#max_connect_errors             = 1000000

# CACHES AND LIMITS #
tmp_table_size                  = 104M
max_heap_table_size             = 104M
join_buffer_size                = 208K
#query_cache_type               = 0
query_cache_size                = 32M
max_connections                 = 150
thread_cache_size               = 4
#open_files_limit               = 65535
table_cache                     = 512
#table_definition_cache         = 1024
table_open_cache                = 2048
wait_timeout                    = 300

# INNODB #
#innodb_flush_method            = O_DIRECT
#innodb_log_files_in_group      = 2
#innodb_log_file_size           = 64M
#innodb_flush_log_at_trx_commit = 1
#innodb_file_per_table          = 1
innodb_buffer_pool_size         = 416M

# This setting ensures that aio limits are not exceeded
# (default is 65536, each instance of mysql takes 2661 with this enabled)
innodb_use_native_aio           = 0

# LOGGING #
log-slow-queries
log-queries-not-using-indexes

どんな助け/提案も大歓迎です。ウェブサイトのアドレスは3abn.orgです。

5
Michael

あなたはすでにFastCGIでPHPを実行しているので、これをスリム化するために他に何ができるかわかりません。あなたはここで一種の岐路に立っています。

いくつかのオプション:

  • すべて可能な限り最小のデータセットに調整します。 Apacheをnginxに置き換え(可能な場合)、MySQLを調整して、必要以上のデータをバッファリングしないようにします。
  • ボックスにもっとRAMを投げる
  • 階層を専用のVMに分割します。 1つのデータベースサーバー、1つのアプリケーションサーバー、および1つのフロントエンド。これにより、スケーリングが非常に簡単になります。

編集:あなたはたくさんのキャッシュのものをインストールしたと言っています。キャッシュ=もっと食べるRAM次のリクエストが速くなるように。あなたがとても低いRAM-キャッシングは世界で最高のものではないかもしれません..

3
pauska

私の一番の推奨事項:VPSを降りる

VPSシステムのメモリ(およびOOM-Killer)関連の問題について十分にうめき声を上げているので、一般的なVPSホスティングプロバイダーはProduction Gradeソリューションを提供していないと思います- -これは「仮想プライベートサーバー」ではなく、「既存のOS上での準仮想化であり、リソース制限が適切に設計されていないため、実際のマシンとは異なる動作をします」。
(最も一般的な違いに噛まれているようです。「VPS」にはスワップスペースがないため、割り当てられたよりも1バイト多く噛むとRAMあなたのプロバイダーによって物事はバラバラになります。)

高品質のデータセンターに同じ場所に配置された独自のハードウェアでホストできない、またはホストしたくない場合は、スワップなどを備えた「通常の」サーバーのように見えるクラウドサービスを検討する必要があります(Amazon EC2はそのようなオプションの1つです)。これらのソリューションの価格は「VPS」ソリューションと専用ハードウェアの間のどこかですが、「実際のハードウェア」にはるかに近い運用エクスペリエンスを提供し、現在のような状況を回避できます。


いずれの場合でも、システムのサイズを適切に設定する必要があることに注意してください。VPS/クラウドソリューション/専用ハードウェアには、スワップせずにピーク負荷を処理するのに十分なRAM)が必要です。
(高品質の)クラウドまたは専用ハードウェアソリューションの利点は、スワップポイントに到達したときに何が起こるかをより細かく制御できることです( OOM-killerを無効にし、malloc()を失敗させる) 、たとえば)。

3
voretaq7

あなたが投稿した情報から:

。 VPSはOpenVZまたはParallelsVirtuozzoで実行されているようです。ホスティングプロバイダーが過剰に割り当てている場合(多くの場合)、サーバーは3ギガバイトのメモリを使用できなくなります。

最悪の場合、VPSが短時間バーストすることが許可される場合がありますが、その後OOMキラーがプロセスを強制終了し始めます。 OOMキラーを(ホスティングプロバイダー側​​から)微調整して、より重要なプロセスが強制終了されないようにすることができます(たとえば、ssh、bind、Apache、mysql-優先順位を使用)が、同じノード上の他のクライアントが実行される可能性があるため同じ典型的なセットアップ、それは助けにはなりません。

3Gを保証し、バーストを無効にします。

。 Webページが本当に静的で小さい場合は、キャッシングリバースプロキシを使用できます。はい、キャッシュはメモリを使用します。ただし、キャッシングは、非常に要求が厳しい傾向があるPHPプロセスの生成も防ぎます。

(あなたはいくつかの数学をするか、そして/または試みる必要があります...これは絶対的な解決策ではありません)

。 APCを無効にするか、PHP-FPMを実行します。

Fcgiを使用すると、各PHPプロセスには独自のAPCオペコードキャッシュがあります。すべてのPHPプロセスにFPMを使用して、共通のキャッシュを共有します。または、APCを無効にします。とにかくそれが必要なようです(オペコードキャッシュはメモリ使用量よりもCPU使用量を減らすのにはるかに効率的です;))

2
zecrazytux