1.
레이턴시 측정, Packet Capture부터 – 개념과 도구 선택에 이어지는 글입니다.
Packet Capture를 위한 시험을 하려면 하드웨어를 준비해야 합니다. tcpdump와 같은 프로그램도 가능하지만 시스템에 대한 영향이 무척 크기 때문에 사용할 수 없습니다. ntop이 제공하는 pf_ring을 사용하려면 별도의 네트워크 카드가 필요합니다. pf_ring을 지원하는 네트워크 카드들입니다. 국내에서 판매하는 제품들만 추렸습니다. Myricom이나 Mellanox의 경우 FPGA회사가 인수한 것으로 들었지만 국내 판매를 하고 있고 Napatech도 국내 대리점이 있습니다.
Exablaze support
Intel Support
Mellanox Support
Myricom Support
Napatech Support
Solarflare제품은 빠져있습니다. sourceforge에 올라온 소스코드를 보면 초기에는 지원을 하였는데 어느 때부터 빠진 듯 합니다. SolarCapture때문이 아닐까 합니다. 위 제품들중 Mellanox는 고객이 실거래를 위해 사용하고 있어서 시험단계에서 사용할 수는 없습니다. Intel은 온보드 형태로 사용하고 있습니다. 다만 수많은 Intel driver중 e1000e만을 지원하는 네트워크 카드입니다. 기능상에 한계가 많습니다.
e1000e | igb | ixgbe | ixgbevf | i40e | iavf | fm10k | ice | |
---|---|---|---|---|---|---|---|---|
Status | Supported | Supported | Supported | Supported | Supported | Supported | Deprecated | Supported |
Max Port Speed (Gbit) | 1 | 1 | 10 | 10 | 40 | 40 | 100 | 100 |
Symmetric RSS | No RSS | Yes | Yes | Yes | Dep on Fw | Dep on Fw | Yes | Yes |
RX Hardware Timestamp | 82580/i350 | Yes | ||||||
Read/Set Device Clock | Yes | |||||||
TX Timestamp | Yes | |||||||
ZC only (no kernel func.) | Yes |
2.
Intel의 네트워크 카드를 가진 서버의 OS는 Pop!os입니다. Ubuntu를 기반으로 하여 만든 배포판입니다. 현재 22.04를 배포하고 있습니다. 설치는 두가지로 가능합니다. 소스를 이용하거나 패키지를 설치하는 방법이 가능합니다. 손 쉽게 하려고 패키지 설치를 하였습니다. 아래가 설치와 관련한 문서입니다.
서버용 OS로 많이 사용하는 Ubuntu, Debian, CentOS 및 Rocky Linux에서 패키지로 설치가능합니다. 설치 안내에 따라 설치를 한 후 로그를 확인하니까 에러가 발생하였네요. 그래서 Git에서 소스를 받아서 컴파일 설치를 하는 방식으로 변경하였습니다. 우선 github에서 소스를 받고 컴파일을 위한 준비물을 설치합니다.
1 2 3 |
# git clone https://github.com/ntop/PF_RING.git # apt-get install build-essential bison flex linux-headers-$(uname -r) libnuma-dev libnl-genl-3-dev # apt-get install net-tools ethtool |
ethtool은 서버에 있는 네트워크 카드의 드라이버를 확인하기 위함입니다. 그리고 이상의 내용은 소스중 README.FIRST에 있는 내용입니다. 컴파일을 하였습니다. 부가적인 기능을 빼면 두가지가 중요합니다. 또한 kernel 디렉토리를 보면 다음과 같이 안내합니다.
– RedHat/CentOS
# yum install kernel-devel– Debian/Ubuntu
# apt-get install linux-headers-$(uname -r)
첫째는 pf_ring.ko입니다. 리눅스 커널모듈입니다.
둘째는 e1000e.ko입니다. 서버의 인텔 어댑터가 사용하는 드라이버를 위한 커널모듈입니다.
POP!OS 22.40에서 컴파일하는데 계속 오류가 발생하면서 무한반복을 합니다.
make[1525]: Entering directory ‘/usr/src/linux-headers-6.0.12-76060006-generic’
warning: the compiler differs from the one used to build the kernel
The kernel was built by: x86_64-linux-gnu-gcc-11 (Ubuntu 11.2.0-19ubuntu1) 11.2.0
You are using: gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
혹시나 해서 gcc 버전을 11.2로 변경하여 설치를 하였습니다. gcc를 git로 설치하는 과정이 생각보다 복잡하고 시간이 많이 걸리더군요. 어찌되었든 컴파일을 한 후 복수의 gcc를 사용하는 환경을 만들었습니다. 관련한 과정은 GNU/Linux Pop!_OS Installing GCC 11.2 from Source – Quick-Start Guide의 도움을 받았습니다. 어찌되었든 결과는 동일합니다. 그렇다고 커널소스 패키지를 변경하는 것은 너무 복잡해서 그냥 Ubuntu 22.04를 설치하였습니다.
3.
허망하다고 할까요? POP! OS가 Ubuntu 22.04를 기반으로 하였다고 하지만 빌드하는 과정에서 커널등을 변경하여 배포판을 만든 듯 합니다. 모든 것이 쉽게 끝났습니다.
1 2 3 |
smallake@ubuntu:~/Downloads/PF_RING/kernel$ sudo insmod ./pf_ring.ko min_num_slots=65536 enable_tx_capture=0 smallake@ubuntu:~/Downloads/PF_RING/kernel$ sudo lsmod | grep pf pf_ring 204800 0 |
다음은 Driver설치입니다. Driver/intel/e1000e에 있는 소스를 컴파일한 후 설치합니다. load_driver.sh을 실행합니다. 소스를 보면 커널모듈을 등록합니다.
1 2 3 4 5 6 7 8 9 10 |
# Remove old modules (if loaded) rmmod e1000e rmmod pf_ring modprobe ptp # We assume that you have compiled PF_RING insmod ../../../../../kernel/pf_ring.ko insmod ./e1000e.ko |
1 2 |
smallake@ubuntu:~/Downloads/PF_RING/drivers/intel/e1000e/e1000e-3.8.7-zc/src$ sudo ./load_driver.sh Configuring eno1 |
이제 pf_ring이 어떤 환경인지 확인할 차례입니다. 이를 위한 명령어는 pf_ringcfg입니다.
1 2 3 4 |
smallake@ubuntu:~/Downloads/PF_RING/package/usr/bin$ sudo ./pf_ringcfg --list-interfaces Name: enp2s0f4 Driver: cxgb4 RSS: 8 [Linux Driver] Name: enp2s0f4d1 Driver: cxgb4 RSS: 8 [Linux Driver] Name: eno1 Driver: e1000e RSS: 1 [Running ZC] |
이를 pf_ring 설치이전과 비교해보겠습니다.
1 2 3 4 |
smallake@ubuntu:~/Downloads/PF_RING/package/usr/bin$ sudo ./pf_ringcfg --list-interfaces Name: enp2s0f4 Driver: cxgb4 RSS: 8 [Linux Driver] Name: enp2s0f4d1 Driver: cxgb4 RSS: 8 [Linux Driver] Name: eno1 Driver: e1000e RSS: 1 [Supported by ZC] |
eno1 interface를 통해 pf_ring이 제공하는 기능을 사용할 수 있는 상태로 바뀌었음을 알 수 있습니다. 환경을 만들었으니까 어떤 동작하는지를 확인할 차례입니다. userland/examples에 가면 pf_ring을 이용하여 만든 예제 프로그램을 제공합니다. 그중 하나가 pfcount입니다. 캡처하는 프로그램입니다. 이를 실행한 결과입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
smallake@ubuntu:~/Downloads/PF_RING/userland/examples$ sudo ./pfcount -i eno1 -v 1 Using PF_RING v.8.3.0 Dumping statistics on /proc/net/pf_ring/stats/172578-eno1.1 Capturing from eno1 [mac: E0:D5:5E:F6:B4:A3][if_index: 6][speed: 1000Mb/s] # Device RX channels: 1 # Polling threads: 1 10:25:10.360398165 [TX][if_index=6][hash=1298931564][E0:D5:5E:F6:B4:A3 -> 70:30:5D:7A:84:18] [IPv4][121.166.192.199:22 -> 211.196.183.109:42780] [l3_proto=TCP][hash=1298931564][tos=16][tcp_seq_num=3666386729] [caplen=310][len=310][eth_offset=0][l3_offset=14][l4_offset=34][payload_offset=66] 10:25:11.443980096 [RX][if_index=6][hash=1298931564][70:30:5D:7A:84:18 -> E0:D5:5E:F6:B4:A3] [IPv4][211.196.183.109:42780 -> 121.166.192.199:22] [l3_proto=TCP][hash=1298931564][tos=16]..... [tcp_seq_num=959240893] [caplen=66][len=66][eth_offset=0][l3_offset=14][l4_offset=34][payload_offset=66] ..... 10:25:11.443981447 [RX][if_index=6][hash=1298931564][70:30:5D:7A:84:18 -> E0:D5:5E:F6:B4:A3] [IPv4][211.196.183.109:42780 -> 121.166.192.199:22] [l3_proto=TCP][hash=1298931564][tos=16][tcp_seq_num=959240893] [caplen=66][len=66][eth_offset=0][l3_offset=14][l4_offset=34][payload_offset=66] ========================= Absolute Stats: [9'787 pkts total][0 pkts dropped][0.0% dropped] [9'787 pkts rcvd][4'001'744 bytes rcvd] ========================= |
pf_ring zc(Zero Copy)기능을 이용한 시험입니다. zcount라는 예제프로그램입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
smallake@ubuntu:~/Downloads/PF_RING/userland/examples_zc$ sudo ./zcount -h zcount - (C) 2014-23 ntop Using PFRING_ZC v.8.3.0.221115 A simple packet counter application. Usage: zcount -i <device> -c <cluster id> [-h] [-g <core id>] [-R] [-H] [-S <core id>] [-v] [-a] [-t] -h Print this help -i <device> Device name -c <cluster id> Cluster id -g <core id> Bind this app to a core -a Active packet wait -f <bpf> Set a BPF filter -R Test hw filters adding a rule (Intel 82599) -H High stats refresh rate (workaround for drop counter on 1G Intel cards) -X Enable hardware timestamp (when supported) -s <time> Set hardware timestamp (when supported). Format example: '2022-09-23 14:30:55.123456789' -d <nsec> Adjust hardware timestamp using a signed nsec delta (when supported)' -S <core id> Pulse-time thread for inter-packet time check -T Capture also TX (standard kernel drivers only) -t Touch payload (to force packet load on cache) -D Debug mode -C Check license -M Print maintenance -v <level> Verbose (1 to print packet headers, 2 to print hex) smallake@ubuntu:~/Downloads/PF_RING/userland/examples_zc$ sudo ./zcount -i eno1 -D [PF_RING-ZC][DEBUG] 32800 1536-byte (1600-byte) buffers requested [PF_RING-ZC][DEBUG] 71799296 bytes approximated memory required [PF_RING-ZC][DEBUG] 1024 2097152-byte pages available at /dev/hugepages [PF_RING-ZC][DEBUG] 35 2097152-byte pages requested (cluster id = 99) [PF_RING-ZC][DEBUG] 35 2097152-byte pages allocated with va = 0x7fa26c000000 pa = [ 12660506624, 12658409472, 12656312320, 12654215168, 12652118016, 12650020864, 12647923712, 12645826560, 12643729408, 12641632256, 12639535104, 12637437952, 12635340800, 12633243648, 12631146496, 12629049344, 12626952192, 12624855040, 12622757888, 12620660736, 12618563584, 12616466432, 12614369280, 12612272128, 12610174976, 12608077824, 12605980672, 12603883520, 12601786368, 12599689216, 12597592064, 12595494912, 12593397760, 12591300608, 12589203456 ] [PF_RING-ZC][DEBUG] Initialising memory segment [PF_RING-ZC][DEBUG] Memory allocation completed successfully ========================= Absolute Stats: 69 pkts (0 drops) - 5'796 bytes ========================= |
4.
pf_ring을 설치하면 레이턴시 측정을 바로 할 수 있을까요? 유심히 보신 분들은 아시겠지만 당연히 ‘아닙니다’입니다. pf_ring을 프레임워크입니다. 어떤 목적을 이룰 수 있도록 도와주는 기반기술이라고 할 수 있습니다. pf_ring 소스를 보면 example이 자세히 소개한 이유입니다. 그리고 개발자를 위하여 API Documentation를 자세히 제공합니다. example을 API를 이용하여 만든 예제입니다.
Pf_ring으로 레이턴시측정을 하려면 무엇이 더 필요할까요? PF_Ring을 이용한 대용량 트래픽 처리 시스템이라는 논문을 소개합니다.
위 구조를 보면 수집,저장,분석과 같은 추가기능이 있습니다. pf_ring은 수집(Capture)를 목적으로 합니다. 저장과 분석은 별도의 영역입니다. ntop이 공급하는 n2disk는 저장까지의 기능을 제공합니다.
그렇지만 레이턴시측정, 그중에서 자본시장에서 레이턴시 측정이라는 목적에 부합하도록 설계를 하여야 합니다. quote to order, singnal to order, quote to trade를 위한 추가작업이 필요합니다. 여기에 pcap 데이타를 쉽게 분석할 수 있도록 DBMS를 사용하는 것 등의 작업을 하여야 합니다. 이를 위한 개발이야 가능하지만 투자는 쉽지 않을 듯 하고 최초 목적에 부합하는 가장 저렴한 방법을 찾으려고 합니다.
Github에는 수많이 많으면서 도움이 되는 오픈소스 프로젝트가 있으므로…(^^)