ARP cache

ARP 캐시는 로컬 네트워크에서, 패킷을 효율적으로 전환할 수 있도록 도와줍니다. 시스템이 어떤 IPv4 주소가 어떤 MAC 또는 하드웨어 주소를 가지는지를 파악하는 방법입니다. 예를 든다면, “10.233.134.150” 라는 IP는 “fe:16:48:a9:a6:5b”는 하드웨어 주소를 가지고 있는것입니다.

이 캐시의 내용은 arp -n 또는 /proc/net/arp 또는 ip -4 neigh 를 실행하면 확인할 수 있습니다.

명령어 실행 결과

다음 명령어를 실행하면 결과입니다.

arp -n

# arp -n

Address                  HWtype  HWaddress           Flags Mask            Iface
10.233.134.149           ether   fe:16:48:a9:a6:5b   C                     eth0
10.233.176.254           ether   fe:16:48:a9:a6:5b   C                     eth0
...
10.233.134.150           ether   fe:16:48:a9:a6:5b   C                     eth0
10.233.134.119           ether   fe:16:48:a9:a6:5b   C                     eth0
10.244.4.0               ether   8e:c4:59:6d:ee:83   CM                    flannel.1
...

/proc/net/arp

# cat /proc/net/arp

IP address       HW type     Flags       HW address            Mask     Device
10.233.134.149   0x1         0x2         fe:16:48:a9:a6:5b     *        eth0
10.233.176.254   0x1         0x2         fe:16:48:a9:a6:5b     *        eth0
...
10.244.4.0       0x1         0x6         8e:c4:59:6d:ee:83     *        flannel.1
...

ip -4 heigh

# ip -4 neigh

10.233.134.149 dev eth0 lladdr fe:16:48:a9:a6:5b REACHABLE
10.233.176.254 dev eth0 lladdr fe:16:48:a9:a6:5b STALE
...
10.233.134.119 dev eth0 lladdr fe:16:48:a9:a6:5b REACHABLE
10.244.4.0 dev flannel.1 lladdr 8e:c4:59:6d:ee:83 PERMANENT
...

캐시 크기 기본값

대부분의 경우 이 캐시의 크기는 중요하지 않습니다. 하지만, 많은 디바이스가 있는 네트워크 세그먼트의 경우, 이 옵션을 조정해줘야 원활한 서비스를 할 수 있습니다.

쿠버네티스 같은 컨테이너 환경에서 많은 컨티이너를 사용하거나, 많은 대상과 네트워크 통신이 필요할 때 이 값을 조정해줘야합니다.

(저의 경우 쿠버네티스에서 flannel.1 TX dropped 이 발생하여, 원인을 찾던 중에 발견하게 되었습니다.)

ARP 캐시의 기본값을 1024입니다. /proc/sys/net/ipv4/neigh/default/gc_thresh3 에서 확인할 수 있습니다.

캐시 크기 조정하기

다음은 캐시값을 4096으로 조정한 예입니다.

# echo "net.ipv4.neigh.default.gc_thresh3 = 4096" > /etc/sysctl.d/95-gc_thresh3.conf
# /sbin/sysctl -p /etc/sysctl.d/95-gc_thresh3.conf

프로메테우스 사용값 확인하기

Prometheus와 NodeExporter를 사용하고 있다면, ARP 테이블 관련 메트릭을 확인할 수 있습니다.

NodeExporter는 ARP 캐시의 항목 수를 디바이스별로 구분하여 표시합니다.

node_arp_entries{device="flannel.1"}