優れた CPU、6 GB の RAM、および高速バックボーン インターネット接続を備えた Debian Web サーバー (VPS) で、PHP アプリケーションを実行します。PHP は「prefork」モード (APC opcache を含む) で実行されます。これは、PHP と MPM ワーカーを検索するたびに、スレッドの安全性に関する警告が大量に表示されるためです。PHP アプリケーションは非常に大きいため、各サーバー プロセスには約 20 ~ 30 MB の RAM が必要です。アプリケーションによって処理される重要なデータがあるため、Apache サーバーへのすべての接続は SSL で暗号化されます。
通常、アプリケーションには画像がまったく表示されないか、ほとんど表示されず (リクエストごとに CSS と JS を含む約 1 ~ 3 ファイル)、ユーザーは 1 分ごとに新しいリクエストを送信します (ユーザーによって異なりますが、30 秒から 4 分)。
最近、このアプリケーションは大量のユーザー リクエストに直面しました (計画されていた、DoS なし、約 2,500 人の同時ユーザー)。CPU は問題なく動作しましたが (使用率が 50% 未満)、私のサーバーはすぐにスロットを使い果たしました。ポイントは、プレフォークモードでは、各スロットにメモリが必要であり、約 200 スロットの「MaxClients」には 6 GB で十分であるということです)。
問題 1: Apache サーバーのステータスによると、ほとんどのスロットが "..reading.." で占有されていました。PHP の処理には 0.1 ~ 2 秒かかりますが、読み取りには 10 秒以上かかることもあります。ユーザーから送信されるデータはほとんどないため、これは実際には SSL ハンドシェイクであると推測されます。もちろん、これは多くのスロットを占有します(また、非常に遅いクライアントをドロップするように mod_reqtimeout を有効にして構成しました - http://unhandledexpression.com/2013/01/25/5-easy-tips-to-accelerate-ssl / - SSLHonorCipherOrder を使用してより高速な暗号化方式を使用した場合、SSLCertificateChainFile も送信されます)。
問題 2: SSL のオーバーヘッドを減らすために KeepAlive (わずか 1 ~ 2 秒) を有効にすると、スロットが開いたままになり、PHP 処理に必要な時間の 2 倍の時間が占有されます。
問題 3: 実際に 2,500 人のユーザーにサービスを提供し、 KeepAlive を使用して SSL を高速化する場合、2,500 スロットが必要になります。ただし、32 GB の RAM を搭載したマシンはありません。
サーバーに十分な数のユーザーがいて、その限界をテストしたところ、1 秒あたり約 110 のリクエスト、クアッドコア システムで約 50% の CPU 負荷 (最大 400%) でスタックしました。KeepAlive を (再度) 有効にすると、req/sec が少なくなります。最新のWebサーバーで110リクエスト/秒 - これはばかげているようです! これが実際にApache、PHP、およびSSLが実行できることだとは信じられません。
私の考えに重大な誤りはありますか?prefork モードの基本的な制限はありますか? 明らかなことを無視しましたか?SSL は実際にそれほどパフォーマンスを食い物にするのでしょうか? ヒントをありがとう!