Home High Performance OS - shanango
Post
Cancel

High Performance OS - shanango

一、论序

1
2
3
4
5
6
7
8
9
Shenango  Achieving High CPU Efficiency for latency-sensitive dc workloads.pdf (526.36KB)
https://github.com/shenango/shenango

IX A Protected Dataplane Operating System for High Throughput and Low Latency.pdf (2.28MB)
The IX Operating System Combining Low Latency, High Throughput, and efficiency in a protected dataplane.pdf (1.18MB)
IX  A Protected Dataplane Operating System for High Throughput and Low Latency.pdf (371.23KB)
https://github.com/ix-project/ix

ZygOS Achieving Low Tail Latency for microsecond-scale networked tasks.pdf (694.61KB)

二、shenango

1
2
3
4
5
https://zhuanlan.zhihu.com/p/360075148 知乎谬赞shenango

https://tongtianta.site/paper/68031 论文中英翻译

https://nan01ab.github.io/2019/03/Shinjuku-and-Shenango.html  Shinjuku and Shenango, New Network Stack and Optimizations
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//基本介绍	
	Shenango核心的重新分配的目的是为了给应用尽可能分配少的CPU核心,但是有不至于导致compute congestion的现象。
    Shenango同时考虑线程和packet来探测compute congestion的信号,另外引入一个congestion detection algorithm来探明一个应用是否能从分配更多的核心中受益。这个算法要求细粒度的,高频率的观察每个应用的线程和packet排队情况。 所以这里Shenango引入了一个IOKernelIOKernel指定一个核心运行的、忙轮询的进程,IOKernel运行在特权态。IOKernel通过忙轮询的方式在微秒级别的粒度观察观察每个应用的线程和packet排队情况。
	1 Shenango引入了一种packet steering机制。通过使用packet steering rules机制来快速实现核心的重新分配。
	2 应用运行在一个runtime中,通过共享内存和IOKernel交互。在应用启动的时候,runtime会创建多个内核线程(pthread),每个内核线程有一个本地的runqueue。应用的逻辑使用一些保存在这些runqueue中的轻量级的用户基本的线程来运行。不同核心之间的负载均衡通过任务窃取的方式来处理。这里与go runtime有些类似,不过没有IOKernel,用户态线程这里称之为uthread,而内核态线程称之为kthread
    
//IOKernel	
	IOKernel组件运行在一个指定的核心上面,主要的作用有两个,一个是决定一个应用需要分配多少的CPU核心,要分配的话分配那一个CPU核心;另外一个就是Bypass Kernel的方式处理所有的网络IO。它通过忙轮询的方式直接轮询NIC的接受队列,然后将收到的数据包。由于IOKernel既要处理CPU核心的分配,又要处理网络数据包的转发,所以CPU核心的分配必须处理得很快,否则会降低数据处理的性能。

 	1 每个应用会有guaranteed cores以及burstable cores。前者可以理解为固定分配的,不用担心被抢占,而后者是根据需要分配的。一个kthread在自己的本地的runqueue中没有工作可以做的时候,代表这个进程在这个时间段内不需要这么多的CPU核心。应用会主动让出kthread,并通知IO KernelIOKernel可以在任何时候抢占一个burstable核心。
	2 在一个数据包达到一个应用的时候,如果没有被分配的核心,IO Kernel会立即分配一个。IOKernel使用congestion detection算法。这个计算基于两个元素,排队的线程和排队的ingress的数据包。任何一个队列中的item出现在连续的两个interval的时候,表明这个item至少排队了5us。对于发现可能处理拥塞状态的应用,IO Kernel会分配额外的核心。这些队列就使用ring buffer实现。在这之中通过头尾指针就可以其队列中表现出不同的interval
	3 在具体分配给那一个核心的时候,IOKernel主要考虑三个因素。1. Hyper-threading efficiencyIO Kernel趋向于将分配在同一个物理核心的HyperThread上面,因为这样的缓存局部性更好。2. CaChe Locality,如果一个应用的数据已经在一个CPU核心的L1/L2中,则IOKernel会倾向于将其分配到对应的核心上面,3. Latency,在可能的情况下,肯定是优先选择分配空闲核心而不是忙的核心。
        
	IOKernel忙轮询NIC的收入包队列,和应用的出队列,IOKernel可以直接将数据包传递给对应的应用。Shenango中,每个runtime都会配置自己的IP地址和Mac地址。在一个新的数据包达到的时候,通过参看数据包中的Mac地址即可得知对应的runtimeIOKernel通过RSS的方式在这个runtime中的CPU核心之间选择,将数据包放入其 ingress packet queueengress队列也使用,轮询的方式可能导致很多的CPU占用,由于IOKernel可知kthread的活跃情况,它只需要轮询活跃的那一部分即可。
        
//runtime
	runtimeIOKernel动态分配的CPU核心上面进行调度操作。在runtime初始化的时候,它会注册若干的kthreadsIO Kernel和对应的共享内存的区域作为packet queue。在IOKernel分配一个新的核心的时候,它会唤醒一个对应rumtimekthread,并绑定到指定CPU核心上面。这个的runtime的结构是每个thread一个队列,并加上work stealing机制来实现负载均衡。这个和GOruntime类似。
————————————————————————————————————————————
引用:https://nan01ab.github.io/2019/03/Shinjuku-and-Shenango.html
1
2
3
Shenango致力于实现三个目标的系统:1)微秒级的端到端延迟和数据中心应用程序的高吞吐量;2)多核机器上应用程序的CPU高效能;3)应用程序开发人员的高生产率,由于同步I/O和标准编程抽象,例如轻量级线程和阻塞TCP网络套接字。
————————————————————————————————————————————
引用:https://zhuanlan.zhihu.com/p/360075148

1、Shenango实现cpu的动态分配,提高cpu的利用率。cpu均衡的时间在5us以内,而内核通用的均衡是在ms级。

2、网络bypass kernel, IOKernel通过IP+Mac将数据包转发给对应的应用。

总之、实现CPU高利用率和保持低尾延迟。

三、 数据中心应用特性

1、what is Datacenter workloads?

2、具备的特点:

四、代码分析

1、iokernel

1
2
3
4
//iokernel 独立核跑的后面进程
    //main
    	-> dataplane_loop
    		-> cores_adjust_assignments //每5us执行一次

2、runtime

1
2
3
4
5
//runtime 链接时使用
__real_main __wrap_main //what is? https://blog.csdn.net/gzxb1995/article/details/119880109 包装函数

__wrap_main //shim/entry.c
    ->runtime_init //runtime/init.c

3、iokernel和runtime联系 – AF_UNIX socket

1
2
//\0/control/iokernel.sock
ioqueues_register_iokernel //runtime/ioqueues.c  

五、总结

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
1 场景痛点
    目前数据中心的微妙级延迟的解决方案是bypass-kernel,但是需要专用的cpu自旋轮询网卡,在中低负载下,会存在cpu浪费。Shenango实现了低延迟,但CPU使用效率更高。
    
2 技术思路    
	以非常精细的粒度(每5µs)在应用程序之间重新分配内核,从而使对延迟敏感的应用程序未使用的周期可以处理其他事。它可以通过一种高效的算法来检测应用程序何时从更多的内核中受益,以及一种运行在专用内核上的特权组件,称为IOKernel,协调内核的重新分配,从而实现如此快速的重新分配速率。
    
3 方案细节
     Shenango引入一个congestion detection algorithm来探明一个应用是否能从分配更多的核心中受益。这个算法要求细粒度的,高频率的观察每个应用的线程和packet排队情况。 所以这里Shenango引入了一个IOKernelIOKernel指定一个核心运行的、轮询的进程,IOKernel运行在特权态。IOKernel通过忙轮询的方式在微秒级别的粒度观察观察每个应用的线程和packet排队情况。
	1 cpu重新分配:引入了一种packet steering机制。通过使用packet steering rules机制来快速实现核心的重新分配。
	2 Lightweight Threading:运行在一个runtime中,通过共享内存和IOKernel交互。在应用启动的时候,runtime会创建多个内核线程(pthread),每个内核线程有一个本地的runqueue。应用使用一些保存在这些runqueue中的轻量级的用户线程来运行。不同核心之间的负载均衡通过任务窃取的方式来处理。
    
IOKernel   
	IOKernel组件运行在一个指定的核心上面,主要的作用有两个,一个是决定一个应用需要分配多少的CPU核心,要分配的话分配那一个CPU核心;另外一个就是Bypass Kernel的方式处理所有的网络IO。它通过忙轮询的方式直接轮询NIC的接受队列,然后将收到的数据包。由于IOKernel既要处理CPU核心的分配,又要处理网络数据包的转发,所以CPU核心的分配必须处理得很快,否则会降低数据处理的性能。
    
 runtime:
    runtime初始化之后,一般的syscall也是可以使用的,但是最好不要使用会BlockingsyscallruntimeIOKernel动态分配的CPU核心上面进行调度操作。在runtime初始化的时候,它会注册若干的kthreadsIO Kernel和对应的共享内存的区域作为packet queue。在IOKernel分配一个新的核心的时候,它会唤醒一个对应rumtimekthread,并绑定到指定CPU核心上面。runtime使用run-to-completion的机制,可以让一个uthread一直运行到资源地让出。
        
4 有益效果
+───────────+────────────────────+────────────────────────+─────────────────────+
| system    | Kernel-bypass net  | Lightweight Threading  | Balancing Interval  |
+───────────+────────────────────+────────────────────────+─────────────────────+
| Linux     | N                  | N                      | 4ms                 |
| Arachne   | N                  | Y                      | 50ms                |
| ZygOS     | Y                  | N                      | N/A                 |
| Shenango  | Y                  | Y                      | 5us                 |
+───────────+────────────────────+────────────────────────+─────────────────────+
有比Arachne较低的Balancing Interval 
kernel-bypass net借鉴ZygOS低延。
    
5 方案缺陷
 runtime来实现Lightweight Threading, hack pthreadmutexsem, 比较定制。
 系统本身要保证无其他应用和业务进程的干扰。cpu的动态分配其实就thread的分配和绑定。
        
6 借鉴意义
        
    
   

other、补充

1、go runtime

1
https://zhuanlan.zhihu.com/p/95056679  万字长文深入浅出 Golang Runtime

2、dpdk

1
https://zhuanlan.zhihu.com/p/272722355 DPDK 分析,原理以及学习路线

3、Arachne

1
https://nbjl.nankai.edu.cn/2020/0306/c12124a266839/page.htm NBJL 2020论文导读7:Arachne Core Aware Thread Management

4、gc Garbage Collection

This post is licensed under CC BY 4.0 by the author.