穿透IO性能瓶颈:从操作系统到Netty的高并发架构演进
2025-05-29 20:43:36 0 举报
揭秘Linux内核机制、多路复用器设计与Java生态实战
作者其他创作
大纲/内容
Kernel Space
标记可读
网卡
复制到对应 Socket 的接收缓冲区
Worker 线程1
accept
selector.select
Client
Kernel(Kernel Space)
Buffer
Worker1----------
DMA
应用程序(Reactor多线程)
step2:processSelectKeys
环形接收队列(RX Ring)
应用程序(Reactor主从多线程)
Worker 线程2
切换用户态->内核态
多路复用器EPOLL
Text Segment
TaskQueue
Thread
client
Worker Group
建立链接
Clone
epoll_create(fd4)
Worker2----------
多路复用器:select poll的弊端,问题1,每次都要重新,重复传递fds (内核开辟空间)2,每次,内核被调了之后,针对这次调用,触发一个遍历fds全量的复杂度
多路复用器(SELECT,POLL)
add
业务处理
调用回调函数
Socket
<链表>
Pagecache4k
NioEventLoop
通知内核有数据到达
返回结果或错误码
Stack
Worker线程池
read/write
多路复用器(epoll)
NioEventGroup
selector
将数据包直接写入内存中的 环形接收队列
Memory Mapping Segment
创建红黑树
协议栈解析(走一边协议栈)
处理请求
Boss Group
Data Segment
遍历FD检查状态
中断
PageCache填充
register
CPU
ChannelHandlers
acceptHandler
read
拷贝数据到APP缓冲区
copy到链表中
遍历fd,查看是否可读
select
唤醒被阻塞的线程
send
系统调用(open/read/write)
Read Handler
User Space APP1
未命中
缺页
dispatch
step1:select
非阻塞Read
Reactor单线程
Reactor子线程
非阻塞accept
cpu
返回fd
User Space
mmap
heap
system_call(如read)
helloworld.txt
内核检查Socket接收缓冲区:数据已存在:若内核Socket缓冲区有数据,直接复制到用户缓冲区,返回读取的字节数。数据未到达:内核立即返回错误(如Java 中的返回 0),线程继续执行
Java BIO
文件IO
VFS 抽象层
中断描述符表(IDT)
Handler-----------
硬盘读取
Reactor主线程
阻塞accept
磁盘
内核保存用户态寄存器值
SubReactor------------
select.open创建fd_set
step3:runAllTask
阻塞read
readHandler
Reactor------------
fd3.registerset.add
Acceptor-----------
硬件接口
触发软中断
Pipeline
Java NIO
Netty 模型
epoll_ctl
poll
APP(User Space)
检查 PageCache
epoll_wait
copy到用户空间
register channel Selector
select.open()
内核检查Socket接收缓冲区:数据已存在:若内核Socket缓冲区有数据,直接复制到用户缓冲区,返回读取的字节数。数据未到达:若缓冲区为空,线程被阻塞,释放CPU资源,进入休眠状态。
命中

收藏
0 条评论
下一页