- Today
- Total
Byeo
Understanding PCIe performance for end host networking 1 본문
Understanding PCIe performance for end host networking 1
BKlee 2024. 1. 6. 20:25해당 포스트는 Sigcomm '18의 Understanding PCIe performance for end host networking 을 번역하여 정리한 글입니다.
앞으로는 조금씩 요약하여 정리를 해볼까 합니다!
초록
최근 Programmable NIC의 등장과 발전으로 인해 end hosts는 점차 다양한 core network function (e.g., load balancing, congestion control, application specific offload) 들을 실행하는 지점으로 되어가고 있다. 그러나 programmable NIC을 구현하는 과정은 성능에 영향을 줄 수 있는 다양한 잠재적인 bottleneck이 존재하여 디자인을 어렵게 한다.
해당 논문은 PCIe (현대 서버에서의 de-facto I/O interconnect)로 인한 성능 영향에 집중하였다. 그리고 PCIe 모델의 이론적인 모델을 제안하는 pcie-bench를 개발하였다. 이는 오픈소스이며 개발자가 PCIe의 본질에 대해 정확하고 깊은 이해를 할 수 있도록 한다. 이를 이용하여 우리는 현대 서버들의 PCIe subsystem의 특징을 다룬다. 우리는 PCIe의 구현에서 놀라운 차이를 강조, IOMMUs 등의 다양한 요소로 인한 예기치 않은 PCIe 성능 영향을 평가, 그리고 40Gb/s NIC에서의 실질적인 성능 한계를 보인다. 나아가, pcie-bench를 통해서 우리는 상용 및 연구에서 사용하는 NIC과 DMA engine을 위한 software 및 미래 hardware 구조를 가이드 할 수 있는 통찰력을 얻는다.
1. 서론
- End host가 NF의 구현에 참여하는 것은 최근 데이터센터와 엔터프라이즈 네트워크에서 활발히 연구되고 있다.
- 특히, Programmable NIC, FPGA 등의 시장 확대는 소프트웨어 NF와 하드웨어 NIC 가속화 사이에서 performance, flexibility 등을 모두 고려하는 적절한 해결책을 요구한다.
- 해당 논문에서는 Host 구조와 device driver 사이의 상호작용하는 PCIe가 네트워크 애플리케이션 성능에 상당한 영향을 미칠 수 있음을 보인다.
- 기존의 연구들은 특정 애플리케이션에 집중하여 연구했다. (e.g., RDMA: Design Guidelines for High Performance RDMA Systems / GPU: Packet Shader / Key-Value-Store: KV-Driect, MICA) 이와 반대로, 우리는 특정 애플리케이션이나 고성능 Network에서 뿐만이 아니라, storage / Programmable NIC / Machine Learning (ML) 등에서도 일반적으로 중요하게 통용될 수 있는 PCIe를 다룬다.
- Section 3: PCIe의 이론적인 모델을 소개, Section 4: 실 시스템의 PCIe을 분석하기 위한 방법론 디자인, Section 5: 구현, Section 6: 우리 접근(pcie-bench)의 결과를 소개, Section 7: 영향력 분석 및 토론 순으로 구성된다.
해당 논문의 기여는 다음과 같다.
- PCIe model을 소개한다. 이 모델은 다양한 범위의 PCIe 설정값 하에서 PCIe throughput의 기대값을 제안한다. 따라서 custom NIC 기능을 구현하는 상황 등에서 device와 device driver의 설정들에 대한 성능을 폭넓게-빠르게 평가할 수 있다.
- pcie-bench를 제공한다. 이는 micro-benchmarks의 집합으로서, device의 DMA engine과 PCIe root complex의 성능을 시스템적으로 측정한다.
- 상용 PCIe 주변 장치를 기반으로 한 pcie-bench의 2가지 구현을 설명한다.: Netronome의 상용 NIC과 최신 NetFPGA boards. 해당 구현은 opensource이며, 결과 재생산 / 분석 / 다른 시스템으로의 확장 등이 가능하다.
- 상용 host system들에 적용된 다양한 세대들의 PCIe 성능을 자세하게 측정한다. 이는 우리로 하여금 PCIe root complex의 진화를 추적할 수 있게 해주고, 구현 간의 놀라운 차이 (심지어는 같은 vendor인데도)를 강조한다.
- pcie-bench의 실용적인 유즈케이스들과 함께 다양한 교훈들을 토론한다. Characterize, debug, 및 구현 개선의 필요성부터 programmable NIC을 이용한 특성화 된 solution 연구 분야의 평가와 도움을 위해서. 나아가, 결과들은 곧바로 specialized accelerator cards와 같은 성장하는 분야의 고성능 장비에 적용 가능하다.
2. 동기
- 전통적으로, I/O를 연결해주는 PCIe와 같은 상용시스템들은 그동안 잘 동작 해 왔기때문에 별로 연구가 이루어지지 않았다. 그리고 대부분 I/O의 성능을 초과하는 편이다. (실제로 PCIe 스펙을 위키피디아에서 검색해보면, 4.0 Gen 16 lanes만 해도 200Gbps를 감당할 수 있다!)
- 하지만 40, 100 Gbps NIC이 도입됨에 따라, 최적화 된 소프트웨어 스택과 결합해 PCIe 성능이 bottleneck이 될 가능성이 커졌다. 나아가 고성능 환경에서는 latency도 중요한데, PCIe device에 있는 DMA엔진과 PCIe end-host 구현 두 가지로부터 영향을 받을 수 있다.
- x86 기반 서버에서의 PCIe 구현은 급진적으로 변화해왔으며, 대안의 구조가 떠오르고 있다. 이를 추후에 깊이 다룬다.
PCIe impact on network application throughput
- PCIe Gen 3.0 x 8 (PCIe 3세대 8 레인을 의미한다.)은 62.96 Gbps의 성능을 갖고 있으며, 보통 40Gbps NIC을 위해서 사용된다.
- 하지만, PCIe protocol overhead (재밌는 사실이다!! Device와 Host resource가 데이터를 교환하는데, 네트워크 계층처럼 3개의 계층으로 구성되어 있다. 그리고 데이터 교환마다 header를 붙이며, 이에따라 overehad를 발생시킨다.) 는 가용할 수 있는 bandwidth를 약 50 Gbps까지 낮춘다. 혹은 PCIe 접근 패턴에 따라 더 낮아질 수 있다.
- Figure 1은 bi-directional bandwidth를 보여준다. Saw-tooth (상어 이빨 패턴. TCP Congestion Control에서도 종종 언급되는데, 이 분야에서 공식적으로 많이 쓰이는 용어인 듯 하다.) 패턴은 data가 교환될 때 packetized 하여 그 앞에 header를 붙임에 따라 발생한다.
- Server가 NIC을 통해서 다른 server와 data를 주고받을 때, NIC은 device driver에서 갖고있는 정보인 TX 및 freelist descriptor를 읽어야 하며 RX (혹은 때때로 TX) descriptor에 적어주고 interrupt를 발생시켜야 한다. Device driver (커널 모듈)는 또한 device (하드웨어)에 있는 queue pointer를 읽고 수정해야 한다.
- 이 모든 상호작용은 PCIe transaction을 통해 이뤄지며, 이는 PCIe bandwdith를 일부 사용한다.
Figure 1 설명
- 이 과정을 모든 packet마다 매번 수행하는, 최적화가 되지 않은 단순한 디자인의 경우에는 Figure 1에 나타난 simple NIC과 같은 양상을 보인다. 이 케이스에서는 Ethernet frame이 512B 이상인 경우에만 40Gbps를 달성할 수 있다는 것을 볼 수 있다.
- 최신 NIC 및 device driver는 몇 가지 최적화를 추가했다. Descriptor-queue에 추가하는 것을 batch로 하거나, descriptor를 pre-fetch하거나, interrupt를 줄이는 등의 예시가 있다. 이는 구현의 복잡도를 상당히 증가시키지만, 그만큼 성능을 얻을 수 있다. (Modern NIC - Kernel driver)
- DPDK driver와 같이 NIC은 그대로지만 device driver를 최적화 한 경우에도 추가적인 성능 향상이 있다. interrupt를 끄고, device register 대신에 host memory의 write-back descriptor를 polling함에 따라 PCIe transaction의 수가 추가로 감소한 것이다.
- 자세한 내용은 Section 3에서 다룬다. 우선 Figure 1이 주는 교훈은 custom NF를 programmable NIC에 구현하기 위해서는 개발자와 연구자가 PCIe transaction에 의해서 발생되는 비용을 잘 인지하고 있어야 한다는 점이다.
PCIe import on network application latency.
- PCIe가 end-host에서 유발하는 latency 비용을 ExaNIC을 사용해 측정하였다. 실험 방법은 host에서 loopback으로 돌아오는 (host - NIC - host) 과정을 packet size를 변화해가며 측정하였다.
- 이 실험은 packet을 driver의 buffer에다가 쓴 뒤, device driver에서 PCIe를 통하여 NIC에 쓰여지는 시점과 NIC으로부터 다시 packet이 돌아오는 그 사이의 시간을 측정하였다. 이 과정은 ExaNIC의 firmware를 Exablze firmware development kit을 이용해 수정하여 측정하였다.
- Kernel을 byapss하도록 구성하였으며, 따라서 kernel의 overhead는 포함되지 않았다.
- Figure 2에서 볼 수 있듯, 1500 Bytes packet에서 PCIe subsystem이 latency에 기여하는 비용은 77%나 된다. 작은 사이즈의 packet에서는 90%까지 증가하였다. (여기서 비율이 유의미한가? 다른 오버헤드를 거의다 제거해버렸는데...)
- 이러한 latency는 datacenter의 여러 application에서 악영향을 주고있는 그 값으로 알려져있다.
Measurement of NIC PCIe latency
- Figure 2가 보여주듯, 128 Bytes packet은 loopback이 1000 ns인데 그 중에서 PCIe만 900 ns를 차지한다.
- 128 bytes packet을 교환할 때 40 Gbps NIC에서 line rate를 달성하기 위해서는 packet들을 매 30ns마다 처리해야 한다. PCie latency가 (rx, tx에 대해) 대칭이라면, 128 bytes로 40 Gbps를 달성하기 위해 NIC이 30개 (900ns / 30ns)의 DMA를 동시에 처리해야 한다는 것을 의미한다.
- NIC 또한 descriptor 정보 교환을 위해 DMA를 발주해야 한다는 것을 감안하면, 이 30개라는 값은 실제로 더 높을 수 있다. 나아가 latency가 실사용 환경에서는 편차가 있기때문에 더 증가한다.
- 이는 개발자가 NF를 programmable NIC에 구현할 때 상당한 복잡도를 야기할 뿐만 아니라, NIC에게 충분한 batching을 제공하기 위해서 device driver가 host에 많은 양의 buffer를 갖고있어야 하는 제약을 부과한다.
PCIe root complex is evolving
- 최신 x86 기반의 서버에서는 PCIe root complex가 최근 몇년간 급진적으로 발전해왔다. 특히, memory controller와 함께, DDIO와 같이 PCIe device가 CPU cache바로 접근 할 수 있도록 CPU core와 매우 밀접하게 통합되어왔다.
- NUMA system에서는 PCIe device도 NUMA의 영향을 받으며, NUMA-Pcie device 연결 상황에 따라서 몇몇 DMA request는 local로, 몇몇은 CPU interconnect를 거쳐가도록 구성이 될 수 있다.
- 최근 시스템이 갖고 있는 IOMMU는 PCIe device와 host 사이의 data path에서 간섭한다. IOMMU는 PCIe transaction 안에 적혀있는 address에 대해 address translation을 수행하며, 이 과정에서 내부 TLB가 캐시로서 사용도니다.
- IOMMU의 TLB miss가 발생하는 경우, IOMMU는 full page table walk를 실행해야 하며, 이는 PCIe transaction의 비용을 증가시켜 latency를 증가시키고 throughput에 영향을 주게 된다.
- 현재 동향에서는 x86 서버 뿐만 아니라 ARM64와 같은 다양한 종류의 아키텍쳐가 등장하고 있다. 이들은 I/O subsystem을 구현 및 관리하는데 크나큰 차이가 있다. 그러나 이들에 대한 자세한 사항은 공개 되어있지 않아서 연구자로 하여금 이들의 차이를 이해하기 어렵게 만들고 있다.
- Hardware와 software가 data를 교환하는 과정에서 겪을 수 있는 PCIe throughput, PCIe가 주는 latency, PCIe root complex에 대한 새로운 기술의 도입, 그리고 새로운 architecture의 등장은 우리로 하여금 pcie-bench를 제작토록 하였다.
- 이 pcie-bench를 통해서 PCIe 구현에 대한 더 좋은, 더 자세한, 시스템적인 이해를 얻고 개발자로 하여금 기반 시스템을 효율적으로 활용하여 애플리케이션을 더 자세히 튜닝할 수 있도록 하는 것에 목표가 있다.