高性能网络设计秘笈:深入剖析Linux网络IO与epoll

2023年 7月 18日 109.5k 0

本文分享自华为云社区《高性能网络设计秘笈:深入剖析Linux网络IO与epoll》,作者: Lion Long 。

一、epoll简介

epoll是Linux内核中一种可扩展的IO事件处理机制,可替代select和poll的系统调用。处理百万级并发访问性能更佳。

二、select的局限性

(1) 文件描述符越多,性能越差。 单个进程中能够监视的文件描述符存在最大的数量,默认是1024(在linux内核头文件中定义有 #define _FD_SETSIZE 1024),当然也可以修改,但是文件描述符数量越多,性能越差。

(2)开销巨大 ,select需要复制大量的句柄数据结构,产生了巨大的开销(内核/用户空间内存拷贝问题)。

(3)select需要遍历整个句柄数组才能知道哪些句柄有事件。

(4)如果没有完成对一个已经就绪的文件描述符的IO操作,那么每次调用select还是会将这些文件描述符通知进程,即水平触发。

(5)poll使用链表保存监视的文件描述符,虽然没有了监视文件数量的限制,但是其他缺点依旧存在。

由于以上缺点,基于select模型的服务器程序,要达到十万以上的并发访问,是很难完成的。因此,epoll出场了。

三、epoll的优点

(1)不需要轮询所有的文件描述符

(2)每次取就绪集合,都在固定位置

(3)事件的就绪和IO触发可以异步解耦

四、epoll函数原型

4.1、epoll_create(int size)

#include 

int epoll_create(int size);

功能:创建epoll的文件描述符。

参数说明:size表示内核需要监控的最大数量,但是这个参数内核已经不会用到,只要传入一个大于0的值即可。 当size 0)

{

rbuff[ret] = '\0';

printf("recv buffer: %s\n", rbuff);

/*

int j;

for (j = 0; j %s\n",wbuff);

ev.events = EPOLLIN;

ev.data.fd = clientfd;

epoll_ctl(epfd, EPOLL_CTL_MOD, clientfd, &ev);

}

}

}

return 0;

}

七、epoll的缺点

读写使用相同的缓冲区。比如上述的示例中,wbuffer和rbuffer是使用同一个缓冲区的,所以需要rbuff[ret] = ‘\0’;去除杂数据。

八、水平触发(LT)与边沿触发(ET)

8.1、两者差异

1、水平触发可以一次recv,边沿触发需要用循环来recv;

2、水平触发可以使用阻塞模式,边沿模式不能

3、两者性能差异非常小,一般小数据使用水平触发LT,大数据使用边沿触发ET

4、listen fd最好使用水平触发,尽量不要边沿触发

5、当当recv的buffer小于接受的数据时:

(1)水平触发是只要有数据就一直触发,直到数据读完;

(2)边沿触发是来一次连接触发一次,如果接受数据的buffer不够大,则数据会保留在缓冲区,下次触发继续从缓冲区读出来;

6、一般,水平触发只需要一个recv,边沿触发需要搭配while从缓冲区读完数据

8.2、设置触发模式

默认是水平触发模式,在事件中设置中 | EPOLLET 就可以设置边沿触发,不设置则默认是水平触发。

例如:

ev.events=EPOLL_IN | EPOLLET

九、常见疑惑问题

9.1、为什么提前先定义一个事件?

我们需要注册,内核才会有事件来的时候通知进程。比如生活中要退一个快递,那么我们需要注册一个快递公司的账户,然后发送一个退快递请求时快递公司才能找到你并取快递。

9.2、epoll events超出EVENTS_LENGTH?

epoll会循环拷贝红黑树结构体中的双向链表节点,读取节点数据,直到没有事件。

9.3、缓冲区有多大空间时才返回可读/可写?

只要缓冲区有空间就返回可读、可写,不管空间多少。比如缓冲区是1024,但是有1023有数据了,这种极端条件也会返回可读、可写。

9.4、recv和send放在一起时,有什么问题?

发送给客户端数据很大的时候(大于内核缓冲区),就可能出现send不全,客户端recv不全,最好用EPOLLOUT单独处理发送数据事件。

总结

本文介绍了网络IO模型,引入了epoll作为Linux系统中高性能网络编程的核心工具。通过分析epoll的特点与优势,并给出使用epoll的注意事项和实践技巧,该文章为读者提供了宝贵的指导。通过掌握这些知识,读者能够构建高效、可扩展和稳定的网络应用,提供出色的用户体验。

点击关注,第一时间了解华为云新鲜技术~

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论