web-dev-qa-db-ja.com

メモリ管理に「いい」

質問の前に、少し背景を説明します。私はVPSでWebサイトを運営しています。 VPS itselmfは、Apache Webサーバー、SQLite DBへのacvcを含むページを生成するPHPコード)を実行し、cronジョブによってトリガーされるいくつかのバックグラウンドタスクを実行します。

これらのバックグラウンドタスクは、主にDB値を更新し、Webサイトユーザーに表示される新しいレコードを追加します。

パフォーマンスに関しては、Webサイトの応答性が優先されますが、バックグラウンドタスクは時間に敏感ではなく、再生したり、速度を落としたりする必要がある場合でも、まったく問題はありません。訪問回数がそれほど多くないことを考えると(1日あたり約4000ページビュー、ほとんどがキャッシュされています)、優先度の低いものを実行する余裕がありますが、それでも仕事は完了します。 CPUに関しては、「niceness」を0(デフォルト)でApacheを実行し、バックグラウンドタスクの「niceness」は10から18になります。すべて問題ありません。

これらのタスクの一部はメモリフットプリントが大きいため、メモリは問題です。それらのいくつかは、必要なときに十分なメモリが残っていないため、実際にクラッシュします。通常起こることは:

  1. メモリ消費量の多いタスク1がトリガーされます
  2. ユーザーがWebサイトにアクセスする=>タスク1が遅れる(問題はありません)
  3. タスク1が再開します
  4. メモリを大量に消費するタスク2がトリガーされます。遅延のため、タスク1は終了していません
  5. ユーザーがWebサイトにアクセスする=>両方のタスクが遅れる(それでも問題ありません)
  6. タスク1が再開し、より多くのメモリが必要=>メモリが残っていないタスク1がクラッシュ
  7. タスク2が終了します
  8. ユーザーがWebサイトにアクセスします
  9. .。

VPSは1ギガバイトのRAMシステムで実行され、現在SWAPは定義されていません。SWAPスペースを追加すると(コストがかからないので無料です)、良いと思います。私の問題の解決策上記のイベントの過程で、バックグラウンドタスクによって使用されるメモリの一部がスワップされ、それらのタスクのパフォーマンスが低下する可能性がありますが、それでも問題はありません。

エンドユーザーのWebサイトの応答性が低下するため、Apacheメモリを交換することは避けたいと思います。 「Nice」で示したように、Apacheはバックグラウンドタスクよりも重要です。私の問題に対する別の解決策を見つけたら、何でも提案してください。また、メモリフットプリントを削減するためにバックグラウンドタスクを改善していますが、それには少し時間がかかります。

5
Snowangelic

これを行うには、cgroupsを使用できます。これにより、メモリとメモリ+スワップの制限を設定できるため、プロセスを強制的にスワップさせることができます。

または、各cgroupのswappinessを個別に調整できるため、バックグラウンドページがスワップアウトされる可能性を高めることができます。

http://www.kernel.org/doc/Documentation/cgroups/memory.txt

5
n8whnp