0

私は現在、Web サーバーの構築を完了しています。この Web サーバーの主な責任は、各 http ポスト リクエストの本文データの内容を単純に取得し、ログ ファイルに書き込むことです。投稿データの内容は、受信時に難読化されます。そのため、投稿データの難読化を解除し、サーバー上のログ ファイルに書き込みます。難読化後のコンテンツは、リクエストごとに異なる一連のランダムなキーと値のペアです。固定データではありません。

サーバーは 2.6+ カーネルの Linux を実行しています。サーバーは大量のトラフィックを処理するように構成されています (開いているファイルの制限は 32k など)。このアプリケーションは、web.py フレームワークを使用して Python で作成されています。http サーバーは、Nginx の背後にある Gunicorn です。

Apache Benchmark を使用していくつかの負荷テストを行った後、ログ書き込みの問題なしで 1 秒あたり最大約 600 ~ 700 のリクエストを処理できることに気付きました。Linux はネイティブでバッファリングを適切に処理します。1 秒間にこの数を超えるリクエストが同じファイルに同時に書き込もうとすると、問題が発生し始めます。データは書き込まれず、情報は失われます。「ファイルに直接書き込む」という設計は、最初から適切なソリューションではなかった可能性があることを私は知っています。

だから、この問題を克服できるインフラストラクチャとコードをあまり変更せずに、すぐに実装できるソリューションを誰かが提案できるかどうか疑問に思っていますか?

Redis のようなメモリ ストレージについて読んだことがありますが、サーバーの障害時にデータがメモリに残っていると、そのデータが失われることに気付きました。redisを永続ストアとして構成できるドキュメントを読みました.Redisがそれを行うには、サーバーに十分なメモリが必要です. この解決策は、特定の間隔で Redis (メモリ) からログ ファイルにデータをダンプするスクリプトを作成する必要があることを意味します。

より迅速な解決策があるかどうか疑問に思っていますか? どんな助けでも大歓迎です!

4

1 に答える 1

1

私が考えることができる 1 つの可能なオプションは、別のログ プロセスです。web.py をパフォーマンスの問題から保護できるようにします。これは、ロギング モジュールを処理する従来の方法です。IPC またはその他のバス通信インフラストラクチャを使用できます。これにより、次の 2 つの問題に対処できます。

  1. ロギングは、大容量のコール フローの大きなボトルネックにはなりません。
  2. 別のモジュールは、スイッチのオフ/オン機能を保証/提供できます。
  3. そのため、巨大な/重要なプロセス メモリの使用量はありません。

ただし、以下の点に注意してください -

  1. ロギングがロギングのみに制限されていることを確認する必要があります。ビジネス処理用のデータ ストアであってはなりません。そうしないと、ビジネス ロジックで多くの同期の問題が発生する可能性があります。
  2. ロギング プロセス (ここでは、実際の Unix プロセスを意味します) が重要になり、少し複雑になります (つまり、何らかの形で IPC を処理する必要がある場合があります)。

チッ!

于 2013-03-08T10:21:05.313 に答える