8.2. 네트워크 설정 최적화
성능 튜닝은 일반적으로 선점 방식으로 이루어집니다. 종종 애플리케이션을 실행하거나 시스템을 배포하기 전 알려진 변수를 조정합니다. 조정이 효과과 없는 것으로 입증되면 다른 변수를 조정 시도합니다. 이러한 방법의 기초가 되는 논리는 기본적으로 시스템은 성능 최적의 수준에서 작동하지 않는다는 것입니다. 따라서 이에 따라 시스템을 적절히 조정해야 한다고 생각합니다. 일부 경우 계산된 추측을 통해 실행합니다.
이전에 설명했듯이 네트워크 스택은 대부분 자체 최적화됩니다. 또한 효과적으로 네트워크를 튜닝하는데는 네트워크 스택이 작동하는 방법 뿐 만 아니라 특정 시스템의 네트워크 리소스 요구 사항도 철저히 이해하고 있어야 합니다. 잘못된 네트워크 성능 구성을 통해 실제로 성능이 저하될 수 있습니다.
예를 들어 bufferfloat 문제에 대해 생각해 봅시다. 버퍼 큐의 깊이를 증가시키면 링크가 허용하는 것보다 큰 혼잡 윈도우가 있는 TCP 연결을 초래합니다 (깊은 버퍼링으로 인해). 그러나 이러한 연결은 프레임이 상당한 시간을 큐에서 소모하기 때문에 거대한 RTT 값을 가지게 됩니다. 이는 결국 혼잡을 감지할 수 없게 되므로, 차선의 출력을 얻게 되는 결과를 초래합니다.
네트워크 성능의 경우 특정 성능 문제가 명백한 경우 이외는 기본값 설정을 유지하는 것이 좋습니다. 이러한 문제에는 프레임 손실 및 처리량 대폭 감소 등과 같은 문제가 포함됩니다. 이러한 문제도 단순히 튜닝 설정을 상향 조정하는 것 (버퍼/큐의 길이를 늘리거나 인터럽트 대기 시간을 감소하는 등) 보다 문제를 세심하게 조사하는 것이 좋은 해결 방법이 되는 경우가 많습니다.
네트워크 성능 문제를 올바르게 진단하려면 다음과 같은 도구를 사용합니다:
- netstat
- 네트워크 연결, 라우팅 테이블, 인터페이스 통계, 마스커레이드 연결, 멀티캐스트 구성원을 인쇄하는 명령행 유틸리티입니다. 이는
/proc/net/
파일 시스템에서 네트워킹 서브시스템에 대한 정보를 검색합니다. 이러한 파일은 다음과 같습니다:/proc/net/dev
(장치 정보)/proc/net/tcp
(TCP 소켓 정보)/proc/net/unix
(Unix 도메인 소켓 정보)
netstat
및/proc/net/
에서의 관련 참조 파일에 대한 보다 자세한 내용은netstat
man 페이지인man netstat
에서 참조하십시오. - dropwatch
- 커널이 드롭한 패킷을 감시하는 모니터링 유틸리티입니다. 보다 자세한 내용은
dropwatch
man 페이지인man dropwatch
에서 참조하십시오. - ip
- 라우트, 장치, 정책 라우팅, 터널을 관리 및 모니터링하기 위한 유틸리티입니다. 보다 자세한 내용은
ip
man 페이지인man ip
에서 참조하십시오. - ethtool
- NIC 설정을 표시하거나 변경하기 위한 유틸리티입니다. 보다 자세한 내용은
ethtool
man 페이지인man ethtool
에서 참조하십시오. - /proc/net/snmp
snmp
에이전트의 IP, ICMP, TCP, UDP 관리 정보 베이스에 필요한 ASCII 데이터를 표시하는 파일입니다. 또한 이는 실시간 UDP-lite 통계도 표시합니다.
SystemTap 초보자 가이드에는 네트워크 성능을 프로파일링 및 모니터링에 사용할 수 있는 여러 스크립트의 예가 들어 있습니다. 이 가이드는 http://access.redhat.com/site/documentation/Red_Hat_Enterprise_Linux/에서 확인하실 수 있습니다.
네트워크 성능 문제에 관련된 데이터를 수집한 후 이론 — 바라건데 해결책을 고안할 수 있어야 합니다. [5] 예를 들어
/proc/net/snmp
에서 UDP 입력 오류가 증가하면 네트워크 스택은 새로운 프레임을 애플리케이션의 소켓으로 추가하려고 할 때 하나 이상의 소켓 수신 큐가 가득찼다고 나타납니다.
이는 패킷이 적어도 하나의 소켓 큐에서 병목 현상되는 것을 나타내고 있으며, 이는 소켓 큐가 너무 느리게 패킷을 배출하거나 소켓 큐에 대한 패킷 볼륨이 너무 큰 것을 의미합니다. 후자의 경우 손실된 데이터에 대한 네트워크 집약적 애플리케이션 로그를 확인합니다. 이 문제를 해결하려면 문제가 있는 애플리케이션을 최적화하거나 재구성해야 합니다.
8.2.1. 소켓 수신 버퍼 크기
소켓의 송수신 크기는 동적으로 조정되므로 수동으로 편집할 필요가 없습니다. SystemTap 네트워크 예
sk_stream_wait_memory.stp
에 있는 분석과 같이 추가 분석할 경우 소켓 큐의 소진 비율이 너무 느리므로 애플리케이션의 소켓 큐의 정도를 증가시키는 것이 좋습니다. 이를 위해 다음 값 중 하나를 설정하여 소켓이 사용하는 수신 버퍼 크기를 늘립니다:
- rmem_default
- 소켓이 사용하는 수신 버퍼의 기본값 크기를 제어하는 커널 매개 변수입니다. 이를 설정하려면 다음 명령을 실행합니다:
sysctl -w net.core.rmem_default=N
N
을 원하는 버퍼 크기 (바이트 단위)로 대체합니다. 이 커널 매개 변수의 값을 지정하려면/proc/sys/net/core/rmem_default
에서 확인합니다.rmem_default
값은rmem_max
(/proc/sys/net/core/rmem_max
)를 초과하지 않도록 주의합니다. 필요한 경우rmem_max
값을 늘립니다. - SO_RCVBUF
- 소켓의 수신 버퍼의 최대 크기를 바이트 단위로 제어하는 소켓 옵션입니다.
SO_RCVBUF
에 대한 자세한 내용은man 7 socket
의 man 페이지에서 참조하십시오.SO_RCVBUF
를 설정하려면setsockopt
유틸리티를 사용합니다. 현재SO_RCVBUF
값은getsockopt
로 검색할 수 있습니다. 이러한 두 가지 유틸리티에 대한 보다 자세한 내용은setsockopt
man 페이지인man setsockopt
에서 참조하십시오.