2011-07-30 15 views
1

私は、サーバーに5秒から10秒の要求を送信するスクリプトを用意しています。私が持っている最も重要な要件は、1秒あたりの要求の制限です。それは常に特定の人物でなくてはならない。それを行うために私は一定の時間間隔(前の要求を送るのに必要な時間を引いた後)の後に要求を送ります。ソケット送信動作を高速化する(Pythonで)

問題:一部のリクエストは速く送信されますが、他のリクエストはsock.sendall()ステップで時間がかかりすぎます。これは、送信バッファがいっぱいで、バッファがクリアされるまで実行がブロックされているためです。

バッファをすばやくフラッシュするにはどうすればよいですか?私が試したオプションの

一つはネーグルを無効にすることです:

sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) 

が、物事を改善していないようでした。

もう1つのオプションは、sendall()呼び出しの前に要求の長さに送信バッファを設定することです。

予測可能な1秒あたりの要求を得るためにできることはありますか?

私はちょうど考えました:もう少し多くの要求を毎秒行ういくつかのプロセスがあり、うまくいけば結果がより予測可能になります。

OSはCentosです。

アップデート:接続後にソケットオプションを設定する際に間違いました。サイズバッファのように見えるのは、connect()呼び出しの前にのみ設定できます。 TCP_NODELAYと同じです。何か違いがあれば、テストする時間はまだありません。

+0

ネットワーク側の問題やサーバー側の負荷が原因で、制御できないことがあります。 – Keith

答えて

2

私が持っている最も重要な要件は、1秒あたりの要求の制限です。 これは常に特定の数字でなくてはなりません。

この要件は、TCP経由では完全に実装できません。また、ピアでサービス時間のリアルタイム保証が必要になります。

+0

「フラッシング」によっては、データがより定期的かつ予想通りに私の側から送信されるようにするために、少なくとも一部がフラッシングされます。現時点では、私はしばしば限界を超えます。あなたが言うように、これは相手先のサーバーにも原因があります。 –

+0

@alexeit上記のあなたの要件は実装できません。 「より規則的に」はその要件を満たしていません。 – EJP

0

How can I force a socket to send the data in its buffer?から)あなたはそれを強制することはできません。期間。 TCPは、いつデータを送信できるかについて独自の考え方をしています。通常、TCPソケット上でwrite()を呼び出すと、TCPは実際にセグメントを送信しますが、これを強制する保証はありません。 TCPがセグメントを送信しない理由はたくさんあります。閉じたウィンドウとNagleアルゴリズムはすぐに思い浮かぶ2つのことです。

Nagleアルゴリズムを無効にするなど意味がある場合は、完全なポストを読んでください。かなり深く、いくつかのことを明確にしています。

関連する問題