문제 해결 및 조정 중에 다음 Linux 커널 설정을 자주 고려합니다.
net.core.netdev_max_backlog
net.ipv4.tcp_max_syn_backlog
net.core.somaxconn
fs.file-max
, net.ipv4.ip_local_port_range
, net.core.rmem_max
, net.core.wmem_max
및 외에도 높은 동시성 net.ipv4.tcp_rmem
을 net.ipv4.tcp_wmem
위해 상자를 조정할 때 조정해야 할 중요한 손잡이인 것 같습니다.
내 질문: 각 대기열에 몇 개의 항목이 있는지 어떻게 확인할 수 있나요? 일반적으로 사람들은 이 값을 매우 높게 설정하지만 저는 이러한 대기열 크기를 기록하여 향후 오류를 예측하고 사용자에게 명확한 방식으로 나타나기 전에 문제를 파악하는 데 도움을 주고 싶었습니다.
답변1
저도 이게 궁금했는데 님의 질문에 감동받았어요!
나열된 각 대기열에 대해 어떤 정보를 얻을 수 있는지, 그리고 각 대기열과 관련된 일부 정보를 수집했습니다. 의견/피드백을 환영합니다. 모니터링이 개선되면 관리가 더 쉬워질 것입니다!
네트워크코어.somaxconn
net.ipv4.tcp_max_syn_backlog
net.core.netdev_max_backlog
$ netstat -an | grep -c SYN_RECV
대기열의 현재 전역 연결 수가 표시됩니다. 모니터링 응용 프로그램에서 이를 폴링하려는 경우 포트별로 분류하여 snmpd.conf의 exec 문에 넣을 수 있습니다.
에서:
netstat -s
대기열에서 요청이 들어오는 빈도를 보여줍니다.
146533724 packets directly received from backlog
TCPBacklogDrop: 1029
3805 packets collapsed in receive queue due to low socket buffer
fs.파일 최대값
에서:
http://linux.die.net/man/5/proc
$ cat /proc/sys/fs/file-nr
2720 0 197774
이(읽기 전용) 파일은 현재 열려 있는 파일 수를 제공합니다. 여기에는 할당된 파일 핸들, 사용 가능한 파일 핸들 및 최대 파일 핸들의 세 가지 숫자가 포함됩니다.
net.ipv4.ip_local_port_range
서비스 제외 목록을 작성할 수 있는 경우(netstat -an | grep LISTEN) 임시 활동에 사용되는 연결 수를 추론할 수 있습니다.
netstat -an | egrep -v "MYIP.(PORTS|IN|LISTEN)" | wc -l
또한 다음을 모니터링해야 합니다(SNMP에서):
TCP-MIB::tcpCurrEstab.0
이 트리(build/time_wait/fin_wait/etc)에 표시된 모든 상태에 대한 통계를 수집하는 것도 흥미로울 수 있습니다.
TCP-MIB::tcpConnState.*
네트워크코어.rmem_max
네트워크코어.wmem_max
setockopt 요청을 받으려면 시스템을 dtrace/strace해야 합니다. 이러한 요청에 대한 통계는 다른 방식으로 추적되지 않는다고 생각합니다. 내가 이해한 바로는 이것은 실제로 변화하는 가치가 아닙니다. 배포하는 애플리케이션에는 표준 금액이 필요할 수 있습니다. strace를 사용하여 애플리케이션을 "프로파일"하고 이에 따라 값을 구성할 수 있다고 생각합니다. (논의하다?)
net.ipv4.tcp_rmem
net.ipv4.tcp_wmem
한계에 얼마나 근접했는지 추적하려면 tx_queue 및 rx_queue 필드의 평균 및 최대값을 (정기적으로) 확인해야 합니다.
# cat /proc/net/tcp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode
0: 00000000:0FB1 00000000:0000 0A 00000000:00000000 00:00000000 00000000 500 0 262030037 1 ffff810759630d80 3000 0 0 2 -1
1: 00000000:A133 00000000:0000 0A 00000000:00000000 00:00000000 00000000 500 0 262029925 1 ffff81076d1958c0 3000 0 0 2 -1
이와 관련된 오류를 추적하려면:
# netstat -s
40 packets pruned from receive queue because of socket buffer overrun
전역 "버퍼" 풀도 모니터링해야 합니다(SNMP를 통해).
HOST-RESOURCES-MIB::hrStorageDescr.1 = STRING: Memory Buffers
HOST-RESOURCES-MIB::hrStorageSize.1 = INTEGER: 74172456
HOST-RESOURCES-MIB::hrStorageUsed.1 = INTEGER: 51629704
답변2
내 생각에는 SystemTap을 사용하여 해당 데이터를 얻을 수 있을 것 같습니다. 여기있어Red Hat 참조 매뉴얼(PDF) . 아직 하나 있어요초보자 가이드(PDF) .
이 도구는 해당 데이터를 얻을 수 있을 만큼 일반적으로 보입니다. 특히 probe::netdev.rx
들어오는 항목에 대한 정보를 제공할 수 있는 것처럼 보입니다. 이제 버퍼에 있는 대기열의 순 크기를 찾거나 무언가가 떠난 것을 계산하기만 하면 됩니다. 대기열…