이 글은 원래 다음 주소에 게시되었습니다.서버 장애그러나 커뮤니티에서는 주제에서 벗어난 투표를 했습니다.
나는 Linux 커널 소켓 상태의 이유/방법/위치/시기를 이해하고 있으며 Linux 커널이 내 특정 응용 프로그램 및 컨텍스트에 대해 특정 방식으로 작동하도록 강제하고 싶다는 점을 말함으로써 이 질문을 시작하겠습니다.
머신은 Raspbian을 실행하는 Pi 3 B+입니다.
내 목표는 아래 답변을 따르는 것입니다이 문제"쓸모없는 상태"*에서 소켓을 종료하므로 Python에서 다음과 같이 구현했습니다.
def kill_hanging_sockets(self):
default_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
subprocess.call(['sudo bash -c "echo 0 > /proc/sys/net/ipv4/tcp_max_orphans"'], shell=True)
new_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
print('new value is {}'.format(new_max_tcp_sockets))
time.sleep(3)
subprocess.call(['sudo bash -c "echo %s > /proc/sys/net/ipv4/tcp_max_orphans"' % default_max_tcp_sockets], shell=True)
함수는 매우 간단합니다. 값을 0으로 설정하고 값이 0인지 확인하기 위해 값을 인쇄하고 커널이 고아 소켓을 "종료"할 때까지 3초간 기다린 다음 max 매개변수를 다시 원래 값으로 설정합니다.
그러나 그것은 작동하지 않습니다. 소켓은 제가 생각했던 것처럼 커널에 의해 "죽이지" 않습니다. 동작은 동일하게 유지되고 소켓은 약 20초 내에 "종료"되는 것처럼 보입니다. 변경 사항이 max_tcp_orpahns
시스템에 영향을 미치지 않거나 문제의 소켓이 실제로 고아 소켓이 되지는 않는다고 생각합니다.
사용된 소켓을 확인했는데 sudo netstat --inet -p -c
여전히 FIN_WAIT 또는 CLOSE_WAIT 상태입니다. 이러한 일이 발생하지 않도록 노력하고 있습니다. 여기서 시도할 수 있는 다른 것이 있나요? 아니면 잘못된 트리를 짖고 있는 것인가요?
[*] "쓸모없는 상태"에 대한 나의 정의는 귀하나 Linux 커널의 정의와 다를 수 있지만 질문의 맥락을 고려하십시오. 위의 맥락에서 소켓은 사라질 때까지 다른 소켓을 바인딩할 수 없기 때문에 나에게 "무용지물"입니다.