概要
- 海量长链接 epoll 内存
epoll
- 底层实现是一个特殊的文件系统,保存了一棵红黑树和就绪的被侦听文件列表rdllist,红黑树的节点是被侦听文件对象。
- epoll_ctl把一个文件加入到epoll的时候,会创建两个数据结构epitem、eppool_entry,epitem关联到被侦听的文件fd,eppool_entry保存了事件就绪时设置rdllist的回调函数ep_poll_callback。
- 网卡接收完数据会产生一个硬中断,数据通过DMA拷贝到内存。系统通过软中断守护进程,调用网卡的驱动来完成数据包的解析并最终调用poll方法。poll方法会回调设置好的ep_poll_callback,即把fd挂到rdllist中,当调用的epoll_wait时候,即可获取到就绪的fd集合。
-
系统优化
配置 配置 值 系统文件打开数 /proc/sys/fs/file-max 2500000 进程文件打开数 /proc/sys/fs/nr_open 2500000 Epoll监听fd数 ../epoll/max_user_watches 2500000 内核TCP内存 ../net/ipv4/tcp_mem 75475210063361509504 listen排队最大 ../net/core/somaxconn 1024 tcp快速回收 ../net/ipv4/tcp_tw_recycle 1 tcp端口重用 ../net/ipv4/tcp_tw_reuse 1 westwood拥塞算法 ../net/ipv4/tcp_westwood 0 scatter-gather 推送包很小 0 generic-segmentation-offload 包很小 0 - 减少内存拷贝
- 无锁共享内存、协程
- 减少用户态内核态切换
- SSE4.2 指令集自带CRC32校验