Ring은 소프트웨어와 NIC간에 공유되는 메모리 배열이고, 각 ring의 엔트리는 ethernet 패킷을 저장할 수 있는 크기의 버퍼를 가르킴 (1.5
소프트웨어는 Tx ring에 Packet buffer 배치하고 NIC에 전송할 데이터 넘기고, NIC가 채워놓은 Rx ring에서 데이터를 수신함. 보통 Rx는 항상 버퍼들이 대기하고 있어서 메모리 소비 더 많음.
Rx ring은 1K 이상 엔트리로 구성되고, 각 엔트리는 ethernet 최대 전송 단위인 1500Byte라서 Rx Ring 하나당 1.5MiB이고 NIC는 수백 개의 ring을 지원한다 [12, 50, 66, 71] for Async. 병렬화
커널 [30, 33, 68, 77, 82, 84, 90] 및 유저 공간 [2,8, 24, 38, 52] 네트워크 스택 모두 동일
모든 코어에 걸쳐 존재하는 Rx 버퍼의 총합을 α 표기, α는 ring buffer라 다 똑같은 중요도 갖고 있고 결국 cache가 가져가야하는 lower bound 크기인데, 이게 LLC 초과해버리면 cache 활용 못함
특히 Data Direct I/O (DDIO)는 NIC가 DMA를 통해 LLC에 직접 접근해서 메인 메모리 접근 피하는데, 얘네가 메인 메모리 참여하면서 CPU와 경쟁해야됨
Network Function Virtualization (NFV)과 같이 us 단위 처리 시간 요구되는 workload에 흔히 쓰이는 run-to-completion 시스템 [6, 26, 35, 52…] 예시로 쓸 것
shRing은 여러 코어가 Rx ring 공유하게해서 α 줄이고, traffic이 집중된 code에 ring entry 동적으로 할당하면서 성능 저하 방지
shRing은 다음 조건 충족될 때 유리: DDIO로 cache miss 생기고 overhead 클 때 & 코어 imbalance가 시스템 기인 이슈가 아닌 형태일 때 (자칫 이상 core가 entry 다 점유할수도)
결국 working set 크기 줄여 LLC hit율 높임 Packet당 처리시간(Pt) 줄이고 throughput 증가시키는데, Pt가 packet 도착 간격보다 작아지면 ring이 비어 있는 상태가 유지되고 latency 확 줄음