환경: 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" 완료;'
이렇게 하면 클라이언트가 서버에 보내는 내용에 따라 연결이 많은 작업을 수행하도록 할 수 있습니다.