次のシナリオを検討してください。サーバー上のプロセスは、ネットワーク接続からのデータを処理するために使用されます。 Twistedを使用すると、spawnProcess
で非常に簡単になり、ネットワーク側のプロトコルにProcessTransport
を簡単に接続できます。ツイストアプリケーションでのメモリ境界
しかし、ネットワークからのデータが標準入力で読み取る処理よりも速く処理できる状況をTwistedがどのように処理するのか判断できませんでした。私が見る限り、Twistedコードは、消費されていないデータを格納するために内部バッファ(self._buffer
など)を使用しています。これは、高速接続(例えば、ローカルギガビットLAN経由)からの同時要求がメインメモリをいっぱいにし、重いスワップを引き起こし、状況をさらに悪化させる可能性があるのではないでしょうか?どのようにこれを防ぐことができますか?
理想的には、内部バッファには上限があります。私が理解しているように、OSのネットワーキングコードは、OSのバッファがいっぱいになると自動的に接続を停止し、パケットを破棄し始めます。これはクライアントの速度を落とします。 (はい、私は知っている、ネットワークレベルのDoSはまだ可能ですが、これは別の問題です)。これは、自分で実装する場合のアプローチでもあります。内部バッファがいっぱいであれば、ソケットから読み取らないでください。
サービスが任意のサイズのファイルを処理できる必要があるため、最大リクエストサイズを制限することも私の場合は選択できません。