漫画 | 看进程小 P 讲述它的网络性能故事!
今天给大家带来的是一个漫画故事!
01
大家好,我是一个进程,我的名字的小 P。我和很多其它小伙伴一样,都由老大操作系统创建和管理。
其实就是内核的开发都认为应用开发是傻逼,怕应用开发的代码把服务器给搞坏。就设计了我们进程出来,专门运行各种用户态的代码。
如果我们需要这些功能的时候,需要通过系统调用先陷入到内核态中。不过在陷入之前,系统调用入口要对我们执行严格的安检。
02
我们进程通过一个叫 socket 的哥们来和我们的用户通信。但是实际上所有的 socket 以及整台机器上的网络包都是在内核态来把控着的,我们只能拿到 socket 的编号。
我们通过一个叫 recvfrom 的系统调用来读取我们的用户发送过来的数据。假如运气好的话,我们 recvfrom 的时候就可以把数据取走!
如果 read 的时候数据包没有就绪,我们就得按照规矩主动把 CPU 让出来。
后来老板不断的压榨我们,让我们一个进程处理成百上千条连接。这时候 read 某条连接的时候,没有数据就把我们挂起来,我们哪儿受得了哇, 我们还有其它好多连接要处理呢。
后来我们就给操作系统老大求了个情,要求把连接设置成非阻塞。
我:“哥,我只是来看看这条连接上有没有数据哈,有就给我,没有也别阻塞我可以不?”操作系统:“准!”
这下就好了,我就可以用循环遍历的方式把我所有的 socket 挨个到内核中去看一遍。
“去看看 1 号 socket 上有数据了没?” “没有”
“去看看 2 号 socket 上有数据了没?” “没有”
“去看看 3 号 socket 上有数据了没?” “没有”
...
“去看看 1 号 socket 上有数据了没?” “没有”
“去看看 2 号 socket 上有数据了没?” “没有”
“去看看 3 号 socket 上有数据了没?” “终于有啦”
干这事可特么把我累坏个屁的了,运气不好的时候我得访问成千上万次才能等到数据真正到来!
03
终于!!!
后来操作系统老大在内核态搞出了各种支持多路复用的新系统调用,它们是 select、poll、和 epoll。
我把需要观察的 socket 都交给他,他替我都维护了起来了,据说是内部用了一个叫啥红黑树的高深技术。
我是终于不用再不断的轮询了,每次我想要知道哪个 socket 上有请求的时候,直接进入内核态查看一下就绪队列就行了。
这种爽歪歪的感觉,你们真的无法体会。这就是我喜欢用这个家伙的原因。
直到时间片耗尽被再次丢到就绪队列等待调度。
我的工作效率发挥到了极致,能处理的并发也越来越多。
在 redis 上,我最高能达到每秒 10W 的qps,怎么样厉害吧!
不过在所有的连接上都没有数据的时候,我也需要阻塞起来。
这个我是接受的,毕竟没活儿干的时候还占着 CPU 资源,我也会觉得怪不好意思。
看,我和 epoll、软中断、进程调度器等几兄弟配合的是不是天衣无缝!
结语
理解 epoll 这种内核级的技术会极大地提升你的内功能力。之前飞哥从源码级别讲了一遍,反响非常不错,在一万粉的情况下竟然达到了 5000 的阅读数。
飞哥今天又改进了一遍,把它抽象成了一个故事。以这样一种全新的方式表达,大家看起来应该会更轻松。不知道大伙儿是否喜欢这篇新文,如果喜欢的话就帮飞哥三连走起, 赞,再看,转发!另:飞哥建了技术群,另外我的电子书《理解了实现再谈网络性能》也分享到群里了。想要进技术群或者领取这本电子书的同学加我微信: zhangyanfei748527
Github: https://github.com/yanfeizhang/coder-kung-fu