
나는 가설을 가지고 있습니다: 때때로 TCP 연결이 내 서버보다 더 빨리 도착합니다 accept()
. 대기열이 넘칠 때까지 대기하다가 문제가 발생합니다.
이런 일이 발생하는지 어떻게 확인하나요?
승인 대기열의 길이나 오버플로 수를 모니터링할 수 있나요? 카운터가 노출되어 있나요?
답변1
대기열이 오버플로되는지 확인하려면 netstat 또는 nstat를 사용하십시오.
[centos ~]$ nstat -az | grep -i listen
TcpExtListenOverflows 3518352 0.0
TcpExtListenDrops 3518388 0.0
TcpExtTCPFastOpenListenOverflow 0 0.0
[centos ~]$ netstat -s | grep -i LISTEN
3518352 times the listen queue of a socket overflowed
3518388 SYNs to LISTEN sockets dropped
인용하다: https://perfchron.com/2015/12/26/investigating-linux-network-issues-with-netstat-and-nstat/
대기열 크기를 모니터링하려면 ss 명령을 사용하고 SYN-RECV 소켓을 찾으십시오.
$ ss -n state syn-recv sport = :80 | wc -l
119
인용하다: https://blog.cloudflare.com/syn-packet-handling-in-the-wild/
답변2
시스템 마이닝이러한 정보 중 일부는 각 시스템 호출이 끝날 때 매개변수 accept
로 제공됩니다 queuelen
. 또한 대기열의 길이를 로 표시합니다 queuemax
.
7598971 21:05:30.322229280 1 gunicorn (6451) < accept fd=13(<4t>127.0.0.1:45882->127.0.0.1:8003) tuple=127.0.0.1:45882->127.0.0.1:8003 queuepct=0 queuelen=0 queuemax=10
내가 아는 한, 대기열이 오버플로되는 시기와 횟수를 정확히 알 수 있는 메커니즘은 제공하지 않습니다. 이를 정기적인 모니터링이나 유사한 모니터링과 통합하는 것은 번거로운 일입니다 collectd
.
답변3
sysctl -a
당신이 찾고 있는 것은 다음과 같은 명령 출력 항목입니다 .
net.ipv4.tcp_max_syn_backlog = 4096
위의 예에서 SYN 상태 연결의 백로그는 최대 4096입니다. 서버의 RAM 양에 따라 이 양을 늘릴 수 있습니다. 내 생각에는 32K 백로그가 로드가 많은 웹 서버를 조정하는 데 좋은 시작이라고 생각합니다.
또한 다음 사항이 1로 설정되어 있지 않은지 확인하십시오.
net.ipv4.tcp_abort_on_overflow = 0
그렇지 않으면 백로그가 오버플로되면 패킷이 확실히 손실됩니다.
sysctl -a | grep backlog
또는 를 사용하여 값을 쉽게 확인할 수 있습니다 sysctl -a | grep overflow
.
또한 아래에서 "삭제됨" 태그를 찾을 수 있습니다.
ifconfig -a
명령의 출력입니다. 이는 다른 데이터 및 오류 등과 함께 인터페이스당 삭제된 패킷 수를 보여줍니다.
삭제된 패킷을 기록하려면 RHEL 7에 대한 [유료] 문서가 있습니다.https://access.redhat.com/solutions/1191593
추가 연구를 위해 다음을 읽을 수 있습니다.http://veithen.io/2014/01/01/how-tcp-backlog-works-in-linux.html
Steven의 저서 "TCP/IP Illustrated"에 따르면 다음과 같이 나와 있습니다.
대기열 제한은 [...] 불완전한 연결에 대한 대기열의 항목 수 [...] 및 [...] 완료된 연결에 대한 대기열의 항목 수 [...]에 적용됩니다. "
또한 다음과 같이 명시합니다.
완료된 연결 큐는 거의 항상 비어 있습니다. 왜냐하면 이 큐에 항목을 넣으면 서버의 수락 호출이 반환되고 서버는 완료된 연결을 큐에서 가져가기 때문입니다.
따라서 수락 대기열이 완전히 비어 있는 것처럼 보일 수 있으므로 Total Aggregate 대기열에 배치된 연결을 더 빨리 수락하도록 웹 서버를 조정해야 합니다.