環境: CentOS 6.6
この簡単なテストを実行するときmyclient
:
while true; do rsh myserver "echo OK"; done
約500回の繰り返し後、サーバーにポートが不足しました。
netstat -anp
サーバーに表示される内容:
tcp 0 0 myserver:1008 myclient:922 TIME_WAIT -
tcp 0 0 myserver:975 myclient:922 TIME_WAIT -
tcp 0 0 myserver:998 myclient:922 TIME_WAIT -
tcp 0 0 myserver:991 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1007 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1000 myclient:922 TIME_WAIT -
tcp 0 0 myserver:990 myclient:922 TIME_WAIT -
tcp 0 0 myserver:979 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1003 myclient:922 TIME_WAIT -
tcp 0 0 myserver:988 myclient:922 TIME_WAIT -
tcp 0 0 myserver:984 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1002 myclient:922 TIME_WAIT -
tcp 0 0 myserver:997 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1019 myclient:922 TIME_WAIT -
tcp 0 0 myserver:995 myclient:922 TIME_WAIT -
tcp 0 0 myserver:993 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1004 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1017 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1013 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1011 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1009 myclient:922 TIME_WAIT -
tcp 0 0 myserver:994 myclient:922 TIME_WAIT -
tcp 0 0 myserver:987 myclient:922 TIME_WAIT -
tcp 0 0 myserver:986 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1012 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1010 myclient:922 TIME_WAIT -
tcp 0 0 myserver:1014 myclient:922 TIME_WAIT -
tcp 0 0 myserver:996 myclient:922 TIME_WAIT -
922
RSH stderrポート(wiresharkを使用したモニタリング)。
約1分後、サーバーのソケットが閉じて新しい接続が確立されることがあります。
したがって、クライアントまたはサーバーがこれらのソケットを正しく閉じることができず、タイムアウトする可能性があります。
これはrshのバグですか?
この問題を解決する方法はありますか? BSDのrshには--no-stderr
オプションがありますが、Linuxにはオプションがないようです。
答え1
以前もこの問題がありました... TIME_WAITはTCP / IPのアーティファクトなので、使い続けるだけです。 / procで調整できます(参照:サーバー障害 23385)しかし、より良いアプローチは、必要なだけ長く動作する永久ソケットを開くソリューションです。
生成された行数ssh myhost '同時に行を読む。 echo ":$line" 完了;'
これにより、クライアントがサーバーに送信する内容に応じて、多くの接続を実行できるようになります。