看进程小 P 讲述它的网络性能故事!

网络 通信技术
我们进程通过一个叫 socket 的哥们来和我们的用户通信。但是实际上所有的 socket 以及整台机器上的网络包都是在内核态来把控着的,我们只能拿到 socket 的编号。

[[394922]]

本文转载自微信公众号「开发内功修炼」,作者张彦飞allen  。转载本文请联系开发内功修炼公众号。

大家好,我是飞哥!

今天给大家带来的是一个漫画故事!

01

大家好,我是一个进程,我的名字的小 P。

我和很多其它小伙伴一样,都由老大操作系统创建和管理。

要问我是怎么来的,嘘小点声,不能让那帮应用开发们听见。

其实就是内核的开发都认为应用开发是傻逼,怕应用开发的代码把服务器给搞坏。就设计了我们进程出来,专门运行各种用户态的代码。

我们天然和内核里的小伙伴们被隔离开来。我们大部分时间都运行在用户态,其它的兄弟们都一直运行在内核态。

我们没有权限访问硬盘、网卡等设备。

如果我们需要这些功能的时候,需要通过系统调用先陷入到内核态中。不过在陷入之前,系统调用入口要对我们执行严格的安检。

好了背景就是这样,今天我给大家讲讲我和我的好朋友们之间是怎么配合处理网络IO的。

02

我们进程通过一个叫 socket 的哥们来和我们的用户通信。但是实际上所有的 socket 以及整台机器上的网络包都是在内核态来把控着的,我们只能拿到 socket 的编号。

在很久很久以前,我们一般只处理一条 TCP 连接。

我们通过一个叫 recvfrom 的系统调用来读取我们的用户发送过来的数据。假如运气好的话,我们 recvfrom 的时候就可以把数据取走!

但是其实根本我们不知道用户那边啥时候给我们打数据包过来,所以大部分情况下都不会运气那么好。

如果 read 的时候数据包没有就绪,我们就得按照规矩主动把 CPU 让出来。

不过那时我们也确实只处理一条连接,连接上没请求被阻塞掉也正常。

后来老板不断的压榨我们,让我们一个进程处理成百上千条连接。这时候 read 某条连接的时候,没有数据就把我们挂起来,我们哪儿受得了哇, 我们还有其它好多连接要处理呢。

而且频繁的阻塞导致我的工作效率特别低下。 第一我们阻塞要花不少的时间保存我们当前的工作状态,第二我们在 L1/L2/L3 等 cache 里准备了好多工作时要用的缓存这下全没用了。

后来我们就给操作系统老大求了个情,要求把连接设置成非阻塞。

我:“哥,我只是来看看这条连接上有没有数据哈,有就给我,没有也别阻塞我可以不?”

操作系统:“准!”

这下就好了,我就可以用循环遍历的方式把我所有的 socket 挨个到内核中去看一遍。

但是我的问题是我还是不知道用户啥时候把数据发过来。如果没有就绪的,那我只能就频繁循环地不断地来内核询问。

“去看看 1 号 socket 上有数据了没?” “没有”

“去看看 2 号 socket 上有数据了没?” “没有”

“去看看 3 号 socket 上有数据了没?” “没有”

...

“去看看 1 号 socket 上有数据了没?” “没有”

“去看看 2 号 socket 上有数据了没?” “没有”

“去看看 3 号 socket 上有数据了没?” “终于有啦”

干这事可特么把我累坏个屁的了,运气不好的时候我得访问成千上万次才能等到数据真正到来!

03

终于!!!

后来操作系统老大在内核态搞出了各种支持多路复用的新系统调用,它们是 select、poll、和 epoll。

不过嘿嘿,我最喜欢 epoll 这个新家伙。

我把需要观察的 socket 都交给他,他替我都维护了起来了,据说是内部用了一个叫啥红黑树的高深技术。

不过其实爱用啥用啥,我只关注能解放我的体力就行。

我是终于不用再不断的轮询了,每次我想要知道哪个 socket 上有请求的时候,直接进入内核态查看一下就绪队列就行了。

这种爽歪歪的感觉,你们真的无法体会。这就是我喜欢用这个家伙的原因。

如果请求很多,那我就可以一直 epoll_wait 获取请求,一直处理,而不用阻塞。

直到时间片耗尽被再次丢到就绪队列等待调度。

我的工作效率发挥到了极致,能处理的并发也越来越多。

在 redis 上,我最高能达到每秒 10W 的qps,怎么样厉害吧!

不过在所有的连接上都没有数据的时候,我也需要阻塞起来。

这个我是接受的,毕竟没活儿干的时候还占着 CPU 资源,我也会觉得怪不好意思。

等网卡收到我的数据请求包的时候,我的另外一个兄弟软中断会从 epoll 的 wq 上找到我,把我叫醒。

不过我所谓的叫醒,其实只是推入到就绪队列而已。真正的调度还得等进程调度器老哥把我拉起来。

看,我和 epoll、软中断、进程调度器等几兄弟配合的是不是天衣无缝!

结语

理解 epoll 这种内核级的技术会极大地提升你的内功能力。之前飞哥从源码级别讲了一遍,反响非常不错,在一万粉的情况下竟然达到了 5000 的阅读数。

 

责任编辑:武晓燕 来源: 开发内功修炼
相关推荐

2009-08-14 13:58:43

数字证书通信加密身份验证

2009-05-22 10:18:44

C指针OO

2010-10-14 10:28:36

Ubuntu 10.1

2021-06-08 10:18:18

数字化转型IT领导者

2009-11-24 11:35:59

2018-07-06 10:56:49

CIO

2015-09-14 17:55:40

戴尔PowerEdge二十周年

2020-06-17 16:43:40

网络IO框架

2015-11-30 17:00:25

深信服老友记

2009-12-18 14:50:43

Fedora进程管理

2018-11-06 15:56:25

西门子工业网络智能制造

2009-09-14 18:34:32

C# List排序

2012-03-08 09:45:17

Windows8消费者预览版

2021-06-10 10:27:08

SD-WANSASE智能网络

2018-06-23 08:02:31

程序员代码故事

2015-09-29 17:06:24

戴尔

2021-08-16 05:34:28

Windows 11操作系统微软

2020-05-15 14:53:37

戴尔

2018-05-10 16:21:19

产品

2009-10-15 15:31:49

网络布线系统
点赞
收藏

51CTO技术栈公众号