
많은 TCPIP 및 웹 튜닝 가이드에서는 "열린 파일이 너무 많습니다." 오류가 발생하면 최대 파일 설명자 수를 늘리는 것이 좋습니다.
하지만 "lsof -i" 출력에서 TIME_WAIT를 볼 수 없습니다.
TIME_WAIT가 파일 설명자를 소비한다는 것을 아는 사람이 있습니까? 아니면
답변1
파일 설명자는 애플리케이션이 소켓에서 읽고 쓰는 데 사용됩니다. 따라서 응용 프로그램이 close()를 호출하면 파일 설명자가 즉시 해제됩니다.
반면, 응용 프로그램이 shutdown()을 호출하면 응용 프로그램이 소켓에서 계속 읽고 쓸 수 있도록 파일 설명자가 유효하게 유지됩니다.
인용문https://oroboro.com/file-handle-leaks-server/:
오해: TCP TIME_WAIT의 소켓이 파일 핸들을 보유하고 있습니다.
TCP/IP 소켓을 닫을 때 운영 체제는 소켓을 즉시 해제하지 않습니다. 복잡한 이유로 인해 소켓 구조는 닫힌 후 해당 소켓에 IP 패킷이 도착할 가능성이 적기 때문에 몇 분 동안 순환되지 않는 상태로 유지되어야 합니다. 운영 체제가 소켓을 재사용하는 경우 해당 연결의 새 사용자는 다른 사람의 손실된 패킷으로 인해 세션이 영향을 받게 됩니다.
그러나 이것은 파일 핸들을 열어두지 않습니다. 소켓의 파일 설명자를 닫으면 파일 설명자 자체도 닫힙니다. "열린 파일이 너무 많습니다." 오류가 발생하지 않습니다. 열려 있는 소켓이 너무 많으면 서버가 새 연결 수락을 중지할 수 있습니다. 이를 처리할 수 있는 방법이 있습니다(소켓을 재사용하도록 허용하거나 TCP TIME_WAIT를 낮추는 것). 그러나 파일 핸들 제한을 높이는 것은 그 중 하나가 아닙니다.
오해: 파일 핸들이 해제되는 데 시간이 걸립니다
이는 TCP TIME_WAIT 신화와 관련이 있습니다. 파일 핸들을 닫을 때 운영 체제가 핸들을 해제할 때까지 잠시 기다려야 한다는 잘못된 믿음.
파일 핸들을 닫으면 os 메서드가 리소스를 해제하는 모든 것을 호출하고 OS는 해당 리소스를 즉시 해제하거나 때로는 소켓의 경우처럼 나중에 해제하지만 close()는 파일 핸들 테이블의 파일 핸들을 즉시 해제합니다. 귀하의 프로세스는 파일 핸들 테이블을 완전히 제어하며 자체 파일 설명자 테이블에서 슬롯을 비울 때까지 기다릴 필요가 없습니다.
답변2
TIME_WAIT는 TCP 상태이며 파일 설명자를 사용하지 않습니다. 그러나 TIME_WAIT의 소켓은 파일 설명자를 사용합니다. 소켓은 유닉스의 다른 모든 것과 같은 파일입니다. Linux인 경우 소켓의 만료 시간(대기 시간)을 조정할 수 있을 뿐만 아니라 .NET에서 소켓 재활용을 활성화할 수도 있습니다 /proc/sys/net/ipv4/
.
특히 관심을 끄는 두 가지 항목은 다음과 같습니다.
sysctl -w net.ipv4.tcp_tw_recycle=1
sysctl -w net.ipv4.tcp_tw_reuse=1
항상 그렇듯이 가능하다면 미리 테스트해 보세요.