0

vxworks 6.3 で LPD サーバーを実行しています。クライアント アプリケーション (制御できない) は、10 分の 1 秒ごとに LPQ クエリを送信しています。235 回のリクエストの後、クライアントは接続を試みるときに RST を受け取ります。しばらくすると、デバイスは再び RST の送信を開始するまで、いくつかのクエリ (約 300) を受け入れます。

RST の原因は TCP スタックであることを確認しました。気づいたことがいくつかあります。

1) 実行中の他のアプリケーションの数を変更すると、受け入れられるソケットの数をいくらか変更できます。たとえば、4 つのソケットを解放して、受け入れられる数を 235 から 239 に変更しました。 RST 開始の発生は 235 で一定の​​ままです。 3) TIME_WAIT を待機しているソケットが多数あります。
4) クライアントのモック バージョンがあります。クライアントの速度を 4 分の 1 秒ごとに 1 つのリクエストに落としても、サーバーは接続を拒否しません。5) サーバーの応答を遅くしても、接続が拒否されることはありません。

したがって、私の理論では、VxWorks が特定の時間に消費できる共有リソースがいくつかあるということです (私の推測では、ソケット ハンドルの総数です)。また、この数は 255 に達すると推測しています。

VxWorks がより多くの接続を受け入れ、閉じたときにそれらを TIME_WAIT のままにしておく方法を知っている人はいますか? カーネル構成を調べて、少しでも可能性が高いと思われるすべての値を変更しましたが、数値を変更できませんでした。

SO_LINGER を設定できることはわかっていますが、これは受け入れられる解決策ではありません。ただし、これにより、クライアント接続が拒否されるのを防ぐことができます。また、SO_LINGER のタイムアウト値を変更しようとしました。これは VxWorks ではサポートされていないようです。オンかオフのどちらかです。

ありがとう!ゲイル

4

1 に答える 1

0

私には、すべての LPQ クエリに対して新しい接続を作成しているように聞こえます。クエリが完了した後、接続を閉じていません。私の意見では、正しいことは 1 つの TCP 接続を受け入れ、それを使用してすべての LPQ クエリを取得することですが、それにはクライアント アプリケーションへの変更が必要になる場合があります。クライアントへの変更を回避するには、各 LPQ クエリの後に TCP 接続を閉じる必要があります。

さらに、#define NUM_FILES config.h (または configall.h またはそれらのファイルの 1 つ) を調整することにより、vxworks で開く FD の最大数を設定できますが、FD リークがある場合はエラーを延期するだけです。行う。

于 2013-10-28T22:12:09.350 に答える