サーバーにかなりの負荷がかかっており、1 秒あたり数百のリクエストがあります。そのほとんどは SSL 経由です。
問題は、データベースが関係していなくても、HTTPS 経由のサーバーへの最初のリクエストの応答が非常に遅い (10 秒程度) ことです。次のリクエストは瞬く間に実現されます。同時に、SSL なしでも常に高速に動作します。数日前は状況が逆転し、トラフィックのほとんどが SSL なしで、その後は SSL なしで高速で、SSL ありで低速になりました。
接続を SSL 経由で行いたいのですが、約 10 秒間アクティビティがない状態が続いた後の最初の応答は許容できません。最初の応答が遅くなることを回避するには、おそらく apache2 の設定を変更すればよいでしょうか。
答え1
キー交換で CPU が限界に達しているようです。よくある問題です。クライアントが初めて SSL/TLS 経由で接続すると、(非常に計算コストの高い) キー交換が行われます。このキー交換が完了すると、クライアントは交換で取得したキーを次の通信で再利用できます。これが、HTTPS 経由の最初のリクエストが完了するまでに非常に時間がかかる理由です。
この状況に対しては、リソースを追加する以外にできることはほとんどありません。CPU を増やすと、キー交換の計算が高速化します。メモリを増やすことは常に良いことです。また、クライアントがキー交換をやり直すことを避けるために、生成されたキーをメモリ内に長く保持するように Apache を設定することもできます。
暗号スイートを変更したり、キーの長さを微調整したりすることで、パフォーマンスをわずかに向上させることもできますが、通常は手間をかけるほどの価値はありません。
このような負荷を長時間にわたって実行する場合は、SSL/TLS 計算をオフロードすることをお勧めします。別のボックス (お気に入りのプロキシを使用)、SSL アクセラレーション カード、または専用の SSL/TLS オフロード ボックスを入手できます。
答え2
DNSの問題のようです。DNSがローカルホスト上で設定され、正しく動作していることを確認してください。また、ホスト名検索ディレクティブは Apache 設定でオフに設定されています。
答え3
考えられるシナリオは 2 つあります。
- Apache のログをチェックして、そこから何か賢いものを作る (エラー、アクセス ログのタイムスタンプなど) - これは難しいと思います
- または、Wireshark を使用して SSL ハンドシェイク プロトコルがどのように行われるかを確認することをお勧めします。サーバー側またはクライアント側のどこで 10 秒が経過するかを確認する必要があります。キーストアを開くなどの処理にかなりの時間がかかると思いますが、まずはネットワーク トラフィックをスニッフィングしてタイムスタンプを探してください。結果を教えてください。
答え4
問題が見つかりました。KeepAlive をオフにする必要がありました。
毎秒多数の新しい接続がありました (200 ~ 300/秒、場合によってはそれ以上)。そのほとんどは、接続を 5 秒間維持する必要はありませんでした。その結果、接続プールはすぐに使用され、すべての新しい接続は 5 秒後に古い接続が終了するまで待機する必要がありました。
KeepAlive オプションは、ほとんどのユーザーが KeepAliveTimeout パラメータで指定された時間 (私の場合は 5 秒) に何かを実行している間に、サーバーが十分な数のオープン接続を保持できる場合にのみ役立つようです。
それ以外の場合には、実際にオフにすると便利です。