环境: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 进行监控)。
大约一分钟后,服务器上的套接字将关闭,并且可以建立新的连接。
因此,客户端或服务器似乎无法正确关闭这些套接字,并且它们只是超时。
这是 rsh 中的错误吗?
有办法解决这个问题吗?我可以看到BSD的rsh有一个--no-stderr
选项,但Linux似乎没有。
答案1
我以前遇到过这个问题...TIME_WAIT 是 TCP/IP 的一个产物,所以你只能坚持使用它。它可以通过 /proc 进行调整(参见服务器故障 23385)但更好的方法是打开一个只要需要就可以工作的持久套接字的解决方案。
生成行数 | ssh myhost '同时读取行;执行 echo ":$line";完毕;'
通过这种方式,您可以让一个连接根据客户端向服务器发送的内容执行许多操作。