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: 255Pre-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 4096TX 링 버퍼를 늘리려면 다음을 입력하십시오.
# nmcli connection modify Example-Connection ethtool.ring-tx 4096
NetworkManager 연결을 다시 로드합니다.
# nmcli connection up Example-Connection중요NIC가 사용하는 드라이버에 따라 링 버퍼를 변경하면 네트워크 연결이 곧 중단될 수 있습니다.
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 = 2000net.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-upNetworkManager 디스패치 스크립트를 만듭니다.#!/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삭제된 카운터가계속 증가하면 전송 대기열 길이를 다시 두 배로 늘립니다. 카운터가 더 이상 증가하지 않을 때까지 이 프로세스를 반복합니다.