非同期サーバー管理について質問があります。私はlibevent2と(私自身の学習経験のために)プレーンなANSI Cを使用しています。apache2ユーティリティのabでストレステストを行います。ほとんど-n 10000
と-c 400
。私のデータベースは、ローカル ネットワーク内の debian コンピューター上の SQL サーバーです。そのため、接続はかなり高速です。valgrind も使用してアプリをプロファイリングします ( --leak-check=full --show-reachable=yes
)
私は今、1つの問題を抱えています。SQLデータベースへの同期呼び出しを行うと、すべてが正常に機能します。ただし、すべてメイン スレッドで実行されるため、新しいクライアントがデータを受信するまでに時間がかかります (ストレスが発生している間)。SQLデータベースへの非同期呼び出しを行うと、SQL呼び出しが戻る前にクライアントが切断されない限り、すべてがうまく機能します。SQL呼び出しが戻り、クライアントがすでに切断されているとすぐに、バッファがすでに解放されている、ソケットが閉じられているなどの理由で、無効な読み取りエラーがたくさん発生します。すでにさまざまなことを試しましたが、できませんでした。適切な解決策が得られません。
一般的に、このようなものをどのように扱っているかお聞きしたかっただけです。たとえば、接続されているすべてのクライアントを含む BST を保持し、非同期呼び出しが返されたときにそれを検索しますか? まだそこにある場合は、コールバックを実行します。それ以外の場合は破棄しますか? これにより、パフォーマンスがかなり低下する可能性があると思います。ソケットがまだ開いているかどうかも確認しようとしましたが、ちょっと変でした。
recv(fd, buffer, 1, MSG_PEEK)
常にreturned -1
(オープンおよびクローズされたノンブロッキング ソケット上で)。
さて、私がすでに行ったことを説明するのはちょっと難しいので、皆さんが答えてくれるのを待ちます:-)
こんにちはマルクス
更新:接続ごとにミューテックスを使用するというクレイジーなアイデアがありました。非同期呼び出しに入ると、それをロックし、戻った後に解放します.. :-)しかし、私はこの方法を信頼していません..正しく聞こえません..誰もそのアプローチを推奨できますか?
更新 2: 私は自分のアイデアを試してみましたが、うまくいきました。それを正しくするのは少しトリッキーでしたが、ロックはそれをしました