论文阅读-Janus

C10M问题、Janus: user-level tcp stack.
诀窍:(1)分离I/O核。(2)每个应用是per-connection coroutine,并且有一个处理包的loop,这可以提高cache affinity、节约memory.
结果:每秒接受1.86M个新的连接(当前40M个)

问题背景:网站用户多、长TCP连接。
我们在已有技术基础上(包含user-level stack, no copying, batching, nothing shared这是不是分片?),使用了上面2个诀窍。
诀窍1:分离核:IO核,处理核。处理和会被load balancer(consistent stream balancer, CSB)进行复杂均衡话。
诀窍2:处理核运行处理线程,每个连接一个协程。提高数据局部性,节约内存(不懂??)。
实验:8核,64B信息。

相关工作:
(1)优化传统kernel
适用性强,可推广到各个协议特征。不可避免的:syscall, context-switch开销。
(2)绕过kernel
更加流行(例如DPDK IO引擎很好)。但是没有解决新建和维护百万计的连接的可扩展性。

结构:
在这里插入图片描述

首先,Packet IO是一堆线程,这些线程通过DPDK Poll Mode Driver(DPDK PMD)来收发包。其它核(TCP Processing cores)处理TCP流,这些核运行TCP栈与上面的应用层。CSB把流分发,并保证一个TCP流必被同一个核处理。Control plane会监测TCP的性能,并调整TCP处理线程的负载(通过修改CSB完成)。Packet Buffer在共享内存里。
下面介绍3个最关键的部件:
(1)Packet IO
我们把原始的DPDK改成Pipeline的了,只有这样才能实现IO在IO核上。好处1:应用隔离,可以根据目的地址把包放在不同的端口(也是一种资源?)上。好处2:动态调整谁来处理这个请求。好处3:安全配置方便。另外,可以增加线程数以防它成为性能瓶颈。
(2)调度
现有系统里,在处理多个客户端的时候,每个server thread有可能是(1)non-blocking io: 应用程序通过select 或者 epoll获取文件描述符的readiness(准备好) notifications, 如mtcp,会有内存拷贝、context switch开销 (2)asynchronous io: 把应用程序改成IO触发的事件handlers,但编程太复杂了。Janus使用coroutine来实现Blocking io.
Linux给每个程序限制的栈8MB. 由于每个coroutine处理一个连接,所以每个coroutine有自己的栈肯定不行,所以栈的需求在Inactive时是不大的,所以采用shared stack model,即copy into/out the 8MB per thread stack。当一个协程yield时,它的栈被存在内存其它地方。64ns进行coroutine切换,且协程由C++和汇编写出,
(3)CSB
DPDK和现有其它方法使用RSS来进行任务分配。这种方法使用固定HASH函数分配,所以不够灵活。我们提出一种细粒度的分发算法CSB,CSB把流分配到处理核上(根据consistent hashinghe和bloom filter),
在这里插入图片描述

有三个角色:IO线程,TCP处理线程,control plane线程。
控制面板线程会根据负载均衡程度动态修改HASH函数,并保证一个TCP连接(流)被同一个核处理。HASH函数:每个TCP处理线程有一个ID,根据这个ID,绑定到单位圆上随机的一些点。给定key(4元组:远程IP,远程端口,本地IP,本地端口),HASH函数返回单位圆上一个点,从这个点开始按照时钟方向走,直到碰到一个邻居,把它的tidfanhui 。CSB通过监测各个处理线程的recv queue size来得到它们的负载。并可能增删该tid对应的单位圆上的点来平衡负载。但是这带来了问题:一个TCP连接在修改HASH函数后可能会映射到不同的TCP处理线程上,此时原处理线程可能会终止连接,导致连接被错误断开。为了解决该问题,CSB利用如下数据结构:
2个一致的哈希结构:H_now,H_diff; 一个Bloom Filter BF, 一个flying connection集合 Set_fly,依据这些结构来决定给定一个包,哪个哈希函数要被使用。

在这里插入图片描述

In its entirety
使用socket API意味着使用原生的网络栈。
Mtcp的并行度被RSS Queue的数量限制了,所以需修改其IO引擎来提高并行度。
可扩展性方面同样出现了先上升后下降的曲线。CPS。是缓存MISS率上升超过了并行性。L3缓存是共享的,竞争导致的。(有没有thrashing的原因?)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值