34장. 네트워크 성능 튜닝
네트워크 설정 튜닝은 복잡한 프로세스이며 고려해야 할 여러 가지 요소가 있습니다. 예를 들어 여기에는 CPU-메모리 아키텍처, CPU 코어 양 등이 포함됩니다. Red Hat Enterprise Linux는 대부분의 시나리오에 최적화된 기본 설정을 사용합니다. 그러나 특정 경우에는 처리량이나 대기 시간을 늘리거나 패킷 드롭과 같은 문제를 해결하기 위해 네트워크 설정을 튜닝해야 할 수 있습니다.
34.1. 네트워크 어댑터 설정 조정
40Gbps 이상의 고속 네트워크에서 네트워크 어댑터 관련 커널 설정의 특정 기본 값은 패킷 감소 및 성능 저하의 원인이 될 수 있습니다. 이러한 설정을 튜닝하면 이러한 문제가 발생하지 않을 수 있습니다.
34.1.1. nmcli
를 사용하여 높은 패킷 드롭 속도를 줄이기 위해 링 버퍼 크기를 늘리십시오.
패킷 드롭 비율로 인해 애플리케이션이 데이터, 시간 초과 또는 기타 문제가 발생하는 경우 이더넷 장치의 링 버퍼 크기를 늘립니다.
수신 링 버퍼는 장치 드라이버와 NIC(네트워크 인터페이스 컨트롤러) 간에 공유됩니다. 카드는 전송(TX) 및 수신(RX) 링 버퍼를 할당합니다. 이름에서 알 수 있듯이 링 버퍼는 오버플로가 기존 데이터를 덮어쓰는 순환 버퍼입니다. NIC에서 커널로 데이터를 이동하는 방법은 두 가지입니다. 하드웨어 인터럽트 및 소프트웨어 인터럽트(예: system-IRQ)라고도 하는 소프트웨어 인터럽트도 있습니다.
커널은 장치 드라이버가 이를 처리할 수 있을 때까지 RX 링 버퍼를 사용하여 들어오는 패킷을 저장합니다. 장치 드라이버는 일반적으로 SoftIRQs를 사용하여 RX 링을 드레이닝하여 들어오는 패킷을 sk_buff
또는 skb
라는 커널 데이터 구조에 배치하여 커널과 관련 소켓을 소유하는 애플리케이션까지 이동합니다.
커널은 TX 링 버퍼를 사용하여 네트워크로 전송해야 하는 발신 패킷을 보관합니다. 이러한 링 버퍼는 스택의 맨 아래에 있으며 패킷 드롭이 발생할 수 있는 중요한 지점이며, 이로 인해 네트워크 성능에 부정적인 영향을 미칩니다.
절차
인터페이스의 패킷 삭제 통계를 표시합니다.
# ethtool -S enp1s0 ... rx_queue_0_drops: 97326 rx_queue_1_drops: 63783 ...
명령 출력은 네트워크 카드 및 드라이버에 따라 다릅니다.
삭제
또는드롭
카운터의 높은 값은 사용 가능한 버퍼가 패킷을 처리할 수 있는 속도보다 빠르게 채워지는 것을 나타냅니다. 링 버퍼를 늘리면 이러한 손실을 피할 수 있습니다.최대 링 버퍼 크기를 표시합니다.
# ethtool -g enp1s0 Ring parameters for enp1s0: Pre-set maximums: RX: 4096 RX Mini: 0 RX Jumbo: 16320 TX: 4096 Current hardware settings: RX: 255 RX Mini: 0 RX Jumbo: 0 TX: 255
Pre-set maximums
섹션의 값이현재 하드웨어 설정
섹션에서보다 높은 경우 다음 단계에서 설정을 변경할 수 있습니다.인터페이스를 사용하는 NetworkManager 연결 프로필을 식별합니다.
# nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
연결 프로필을 업데이트하고 링 버퍼를 늘립니다.
RX 링 버퍼를 늘리려면 다음을 입력하십시오.
# nmcli connection modify Example-Connection ethtool.ring-rx 4096
TX 링 버퍼를 늘리려면 다음을 입력하십시오.
# nmcli connection modify Example-Connection ethtool.ring-tx 4096
NetworkManager 연결을 다시 로드합니다.
# nmcli connection up Example-Connection
중요NIC가 사용하는 드라이버에 따라 링 버퍼를 변경하면 네트워크 연결이 곧 중단될 수 있습니다.
추가 리소스
- ifconfig 및 ip 명령은 패킷을 보고
- 0.05% 패킷 감소율에 대해 우려해야 합니까?
-
ethtool(8)
도움말 페이지
34.1.2. 패킷이 손실되지 않도록 네트워크 장치 백로그 큐 조정
네트워크 카드가 패킷을 수신하고 커널 프로토콜 스택이 처리되기 전에 커널은 이러한 패킷을 백로그 큐에 저장합니다. 커널은 각 CPU 코어에 대해 별도의 대기열을 유지 관리합니다.
코어의 백로그 큐가 가득 차면 커널은 netif_receive_skb()
커널 함수가 이 큐에 할당하는 추가 수신 패킷을 모두 삭제합니다. 서버에 10Gbps 또는 더 빠른 네트워크 어댑터 또는 여러 개의 1Gbps 어댑터가 포함된 경우 이 문제를 방지하려면 백로그 큐 크기를 조정합니다.
사전 요구 사항
- 10Gbps 이상 또는 여러 개의 1Gbps 네트워크 어댑터
절차
백로그 큐가 필요한지 여부를 확인하고 카운터를
/proc/net/softnet_stat
파일에 표시합니다.# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t 221951548 0 0 0 0 0 0 0 0 0 0 0 0 192058677 18862 0 0 0 0 0 0 0 0 0 0 1 455324886 0 0 0 0 0 0 0 0 0 0 0 2 ...
이
awk
명령은/proc/net/softnet_stat
의 값을 16진수에서 10진수 형식으로 변환하고 테이블 형식으로 표시합니다. 각 행은 코어 0으로 시작하는 CPU 코어를 나타냅니다.관련 열은 다음과 같습니다.
- 첫 번째 열: 수신된 총 프레임 수
- 두 번째 열: 전체 백로그 큐로 인한 삭제된 프레임 수
- 마지막 열: CPU 코어 번호
/proc/net/softnet_stat
파일의 두 번째 열에 있는 값이 시간에 따라 증가하면 백로그 대기열의 크기를 늘립니다.현재 백로그 큐 크기를 표시합니다.
# sysctl net.core.netdev_max_backlog net.core.netdev_max_backlog = 1000
다음 콘텐츠를 사용하여
/etc/sysctl.d/10-netdev_max_backlog.conf
파일을 만듭니다.net.core.netdev_max_backlog = 2000
net.core.netdev_max_backlog
매개변수를 현재 값의 double로 설정합니다./etc/sysctl.d/10-netdev_max_backlog.conf
파일에서 설정을 로드합니다.# sysctl -p /etc/sysctl.d/10-netdev_max_backlog.conf
검증
/proc/net/softnet_stat
파일에서 두 번째 열을 모니터링합니다.# awk '{for (i=1; i<=NF; i++) printf strtonum("0x" $i) (i==NF?"\n":" ")}' /proc/net/softnet_stat | column -t
값이 여전히 증가하면
net.core.netdev_max_backlog
값을 다시 두 배로 늘립니다. 패킷 드롭 카운터가 더 이상 증가하지 않을 때까지 이 프로세스를 반복합니다.
34.1.3. 전송 오류 수를 줄이기 위해 NIC의 전송 대기열 길이 늘리기
커널은 패킷을 전송하기 전에 전송 대기열에 저장합니다. 기본 길이(1000 패킷)는 일반적으로 10Gbps에 충분하며 40Gbps 네트워크에도 적합합니다. 그러나 더 빠른 네트워크에서 또는 어댑터에서 전송 오류가 증가하는 경우 큐 길이를 늘립니다.
절차
현재 전송 대기열 길이를 표시합니다.
# ip -s link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 ...
이 예에서
enp1s0
인터페이스의 전송 대기열 길이(qlen
)는1000
입니다.네트워크 인터페이스의 소프트웨어 전송 큐의 드롭된 패킷 카운터를 모니터링합니다.
# tc -s qdisc show dev enp1s0 qdisc fq_codel 0: root refcnt 2 limit 10240p flows 1024 quantum 1514 target 5ms interval 100ms memory_limit 32Mb ecn drop_batch 64 Sent 16889923 bytes 426862765 pkt (dropped 191980, overlimits 0 requeues 2) ...
전송 오류 수가 높거나 증가하는 경우 더 높은 전송 대기열 길이를 설정합니다.
이 인터페이스를 사용하는 NetworkManager 연결 프로필을 식별합니다.
# nmcli connection show NAME UUID TYPE DEVICE Example-Connection a5eb6490-cc20-3668-81f8-0314a27f3f75 ethernet enp1s0
다음 콘텐츠를 사용하여
/etc/NetworkManager/dispatcher.d/99-set-tx-queue-length-up
NetworkManager 디스패치 스크립트를 만듭니다.#!/bin/bash # Set TX queue length on enp1s0 to 2000 if [ "$1" == "enp1s0" ] && [ "$2" == "up" ] ; then ip link set dev enp1s0 txqueuelen 2000 fi
/etc/NetworkManager/dispatcher.d/99-set-tx-queue-length-up
파일에서 실행 가능 비트를 설정합니다.# chmod +x /etc/NetworkManager/dispatcher.d/99-set-tx-queue-length-up
변경 사항을 적용합니다.
# nmcli connection up Example-Connection
검증
전송 대기열 길이를 표시합니다.
# ip -s link show enp1s0 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 2000 ...
삭제된 패킷 카운터를 모니터링합니다.
# tc -s qdisc show dev enp1s0
삭제된 카운터가
계속 증가하면 전송 대기열 길이를 다시 두 배로 늘립니다. 카운터가 더 이상 증가하지 않을 때까지 이 프로세스를 반복합니다.