1. 连接跟踪表设计
- 技术重点:DPDK ThreadLocal+哈希表+DPDK大页内存池
- Conntrack表就是很简单的5元组哈希表,哈希冲突利用双向链表来解决;
- 个人感觉为了开发方便可以直接用DPDK提供的rte_hash;
- Conntrack表使用了DPDK Threadlocal,提供无锁的Conntrack信息访问,每个核维护一个Conntrack表;

- Conntrack表key是五元组,value是连接上下文的地址,指向存储在DPDK的rte_mempool中连接上下文。利用内存池能加快申请和释放内存,内存池每一个socket一个。

2. 连接老化设计- 准确来说是定时器设计,使用了很经典的时间轮算法,空间换时间,比经典的WebServer中的小根堆要快。它会占用很大的内存来存储每个时间点,但是DPDK本身就会使用大页占很多系统内存,这点真的不算什么,哈哈哈哈哈;
- 轮子转动频率是1000HZ,就是1s会走1000次,就是每1ms走一下;
- 只用了两级时间轮,大概是为了提高运行效率(空间换时间),然后每一级轮子有2^18个格子,能够允许的超时时长还是很大的;
- 轮子使用rte_timer来驱动的,每1ms会驱动最低级的轮子走一格,这个也可以用
rte_rdtsc()获取cpu cycles来驱动。

本文探讨了如何通过DPDK技术实现高效的连接跟踪表设计,包括使用ThreadLocal和哈希表解决冲突,以及连接老化定时器和无锁通信设计。同时介绍了FullNAT的优势和DNAT的问题,以及资源分配对最大连接数的影响。
最低0.47元/天 解锁文章
5415





