epoll机制是Linux内核中的一种可扩展IO事件处理机制,可被用于代替POSIX select系统调用,在高并发场景下获得较好的性能提升。
select有如下缺点:
epoll改进后的机制:
使用epoll函数代替select,epoll函数有:epoll_create,epoll_ctl和epoll_wait。Linux-2.6.19又引入了可以屏蔽指定信号的epoll_wait: epoll_pwait。
函数简介:
int epoll_create(int size);
其中size表示监测的文件句柄的最大个数。
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);
参数说明如下:
int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); int epoll_pwait(int epfd, struct epoll_event *events, int maxevents, int timeout, const sigset_t *sigmask);
参数说明如下:
在网络高并发场景下,select调用可使用epoll进行替换。
使用如下命令确认是否调用epoll函数:
查看某个进程的系统调用信息
# strace -p $TID -T -tt 18:25:47.902439 epoll_pwait(716, [{EPOLLIN, {u32=1052576880, u64=281463144385648}}, {EPOLLIN, {u32=1052693569, u64=281463144502337}}, {EPOLLOUT, {u32=1052638657, u64=281463144447425}}, {EPOLLIN|EPOLLOUT|EPOLLRDHUP, {u32=1052673241, u64=281463144482009}}, {EPOLLIN|EPOLLOUT|EPOLLERR|EPOLLHUP|EPOLLRDHUP, {u32=1052636016, u64=281463144444784}}], 512, 1, NULL, 8) = 5 <0.000038>