-1

重複の可能性:
boost::async_writeに時間がかかりすぎる

私のサーバーアプリケーションでは、1回の読み取りでasioサービスを実行して、約100の接続を処理します。async_write()に時間がかかりすぎることがあり、約15ミリ秒かかることがわかりました(パケットは非常に小さいです)

私の質問は、なぜasync_write()に非常に長い時間がかかるのかということです。async_write()はすぐに戻るはずだと思います。非常にゆっくりと多くのデータを送信することは困難です。つまり、関数はすぐには返されません。送信がすぐに完了しないとは言われていません。15msは同期機能には長すぎます。そして、アプリケーションは本当にブロックされています。(GetTickCountは気にしないでください)

次のようなコードのテスト:

uint64_t TStart = 0, TEnd = 0;
TStart = GetTickCount();

async_write(*this->m_Socket,
    boost::asio::buffer(pSendData->m_buf.GetBuffer(), pSendData->m_buf.GetSize()),
    boost::bind(&SttSocketConnection::OnSended, this,
    pSendData, placeholders::error, placeholders::bytes_transferred));

TEnd = GetTickCount();
if (TEnd - TStart > 1) {
    __asm int 3;
    TStart = TEnd;
}
4

1 に答える 1

1

どこかでコンテキストスイッチが発生しているようです。15 ミリ秒は、マルチプロセッサ Windows マシンでのスケジューリング クォンタムです。

頻繁に発生するわけではない場合でも、心配する必要はありません。システム コールを実行したときにコンテキスト スイッチが発生しただけです。

すべての呼び出しで問題が発生する場合は、システム コールを追跡し、コンテキスト スイッチの原因となっているシステム コールを特定する必要があります。私は、IO 完了ポート、シリアル ポート、および小さなタイムアウトを使用しているときに、一部のシステム コールが常に 15 ミリ秒のレイテンシで終了するという同様の問題を見てきました。これを修正するには、非同期操作の完了にタイマーが関与しないようにコードを再構築する必要がありました。

asioでこの問題を引き起こしている原因が正確にはわかりません。システム コールをたどって、どれが遅延を引き起こしているかを調べる必要があります。

于 2012-09-13T05:13:02.057 に答える