原创:小姐姐滋味(微信大众号ID:xjjdog),欢迎同享,非大众号转载保留此声明。
大家都知道BIO十分的低效,而网络编程中的IO多路复用遍及比较高效。
现在,io_uring已经能够挑战NIO的,功用十分强壮。io_uring在2019加入了Linux内核,目前5.1+的内核,能够选用这个功用。
跟着一步步的优化,体系调用这个大家伙,调用次数越来越少了。
一、功能消耗在哪里?
在Linux的功能指标里,有us
和sy
两个指标,运用top
命令能够很方便的看到。
us
是用户进程的意思,而sy
是在内核中所运用的cpu占比。假如进程在内核态和用户态切换的十分频繁,那么功率大部分就会糟蹋在切换之上。
一次内核态和用户态切换的时刻,遍及在微秒
级别以上,能够说十分贵重了。
cpu的功能是固定的,在无用的东西上糟蹋越小,在真正业务上的处理就功率越高。影响功率的有两个方面。
-
进程或者线程的数量,引起过多的上下文切换。进程是由内核来管理和调度的,进程的切换只能产生在内核态。所以,假如你的代码切换了线程,它必然伴跟着一次用户态和内核态的切换。
-
IO的编程模型,引起过多的体系态和内核态切换。比方同步堵塞等候的模型,需求经过数据接纳、软中止的处理(内核态),然后唤醒用户线程(用户态),处理完毕之后再进入等候状态(内核态)。
关于mmap,能够参考这篇文章。
《OS近距离:mmap给你想要的快!》
二、BIO
能够说,BIO这种形式,在线程数量上爆破,编程模型陈旧,把功能低的原因全给占了。
通常情况下,BIO一条衔接就对应着一个线程。BIO的读写操作是堵塞的,线程的整个生命周期和衔接的生命周期是一样的,而且不能够被复用。
假如衔接有1000条,那就需求1000个线程。线程资源是十分贵重的,除了占用许多的内存,还会占用十分多的CPU调度时刻,所以BIO在衔接十分多的情况下,功率会变得十分低。
BIO的编程模型,也存在许多缺陷。因为它是堵塞性编程形式,在有数据的时分,需求内核告诉它;在没有数据的时分,需求堵塞wait在相应的socket上。这两个操作,都涉及到内核态和用户态的切换。假如数据报文十分频繁,BIO就需求这么一向切换。
三、NIO
说到NIO,Java中运用的是Epoll,Netty运用的是改良后的Epoll,它们都是多路复用,只不过叫惯了,所以称作NIO。
选用Reactor编程模型,能够选用十分少的线程,就能够应对海量的Socket衔接。
一旦有新的事情到达,比方有新的衔接到来,主线程就能够被调度到,程序就能够向下履行。这时分,就能够依据订阅的事情告诉,持续获取订阅的事情。
NIO是基于事情机制的,有一个叫做Selector的选择器,堵塞获取关注的事情列表。获取到事情列表后,能够经过分发器,进行真正的数据操作。
熟悉Netty的同学能够看到,这个模型便是Netty设计的根底。在Netty中,Boss线程对应着对衔接的处理和分配,相当于mainReactor;Work线程 对应着subReactor,运用多线程担任读写事情的分发和处理。
经过Selector选择器,NIO将BIO中频繁的wait和notify操作,集中在了一同,许多的削减了内核态和用户态的切换。在网络流量比较高的时分,Selector乃至都不会堵塞,它将一向处于处理数据的过程中。
这种形式将每个组件的职责分的更细,耦合度也更低,能有效的处理C10k
问题。
四、io_uring
但是,NIO依然有许多的体系调用,那便是Epoll的epoll_ctl。别的,获取到网络事情之后,还需求把socket的数据进行存取,这也是一次体系调用。虽然相对于BIO来说,上下文切换次数已经削减许多,但它依然花费了比较多的时刻在切换之上。
IO只担任对产生在fd描述符上的事情进行告诉。事情的获取和告诉部分对错堵塞的,但收到告诉之后的操作,却是堵塞的。即使运用多线程去处理这些事情,它依然是堵塞的。
假如能把这些体系调用都放在操作体系里完结,那么就能够节省下这些体系调用的时刻,io_uring便是干这个的。
如图,用户态和内核态同享提交行列(submission queue)和完结行列(completion queue),这两条行列经过mmap同享,高效且安全。
(SQ)给内核源源不断的布置任务,然后从别的一条行列(CQ)获取成果;内核则按需进行 epoll(),并在一个线程池中履行就绪的任务。
用户态支撑Polling形式,不会产生中止,也就没有体系调用,经过轮询即可消费事情;内核态也支撑Polling形式,相同不会产生上下文切换。
能够看出关键的设计在于,内核经过一块和用户同享的内存区域进行音讯的传递,能够绕过Linux 的 syscall 机制。
rocksdb、ceph等应用,已经在尝试这些功用,跟着内核io_uring的成熟,信任网络编程在功率上会更上一层楼。
作者简介:小姐姐滋味 (xjjdog),一个不允许程序员走弯路的大众号。聚集根底架构和Linux。十年架构,日百亿流量,与你探讨高并发国际,给你不一样的滋味。我的个人微信xjjdog0,欢迎添加老友,进一步沟通。
引荐阅读:
1. 玩转Linux
2. 什么滋味专辑
3.蓝牙如梦
4.杀机!
5.失联的架构师,只留下一段脚本
6.架构师写的BUG,非比寻常
7.有些程序员,实质是一群羊!