netstat -apn 命令
netstat - apn | grep 8000
其中8000为端口号
poll 和 epoll 对于突破1024文件描述符设置是生效的
可以使用cat命令查看一个进程可以打开的socket描述符上限。
cat /proc/sys/fs/file-max :这个表示当前计算机所能打开的最大文件个数,受硬件影响。当前我们的计算机 是 393856
如有需要,可以通过修改配置文件的方式修改该上限值。
sudo vi /etc/security/limits.conf
在文件尾部写入以下配置,soft软限制,hard硬限制。如下图所示。
* soft nofile 65536 (默认是1024)对齐ulimit -a查看 open files
* hard nofile 100000
epoll
epoll是Linux下多路复用IO接口select/poll的增强版本,它能显著提高程序在大量并发连接中只有少量活跃的情况下的系统CPU利用率,因为它会复用文件描述符集合来传递结果而不用迫使开发者每次等待事件之前都必须重新准备要被侦听的文件描述符集合,另一点原因就是获取事件的时候,它无须遍历整个被侦听的描述符集,只要遍历那些被内核IO事件异步唤醒而加入Ready队列的描述符集合就行了。
目前epoll是linux大规模并发网络程序中的热门首选模型。
epoll除了提供select/poll那种IO事件的电平触发(Level Triggered)外,还提供了边沿触发(Edge Triggered),这就使得用户空间程序有可能缓存IO状态,减少epoll_wait/epoll_pwait的调用,提高应用程序效率。
epoll 的实现原理:
epoll本质上是 一个 平衡二叉树,更加具体的说:是一个红黑树。
epoll_create 函数的可以看成是生成红色框框里面的epfd,那么要生成一个红黑树,一般要告诉系统,我这个树上 预期有多少个节点。也就是epoll_create 的参数。但是注意的是:这是一个建议值,假设我们传递的是100,当超过90个客户端访问的时候,系统可能就已经将这个建议的值改成200了,前期这么简单的理解就好。
epoll 三个重要的API
epoll_create 创建一个epoll句柄,参数size用来告诉内核监听的文件描述符的个数,跟内存大小有关。
#include <sys/epoll.h>
int epoll_create(int size)
size:监听数目(内核参考值)
返回值:成功:非负文件描述符;失败:-1,设置相应的errno
epoll_ctl 控制某个epoll监控的文件描述符上的事件:注册、修改、删除。也就是说,有了这个红黑树了,就要给树上挂节点了,或者删除节点,或者修改节点了
因此第一个参数是 这个红黑树的根节点,就是告诉系统,我要对这个红黑树进行改动。
第二个参数是说明,我是挂节点/删除节点/修改节点的哪一种
第三个参数是说明,我要挂的节点的 fd,或者删除节点的fd,或者修改节点的fd
第四个参数说明:
我对第三个参数的什么事件进行监控:events表明了是对读:EPOLLIN,写:EPOLLOUT,错误EPOLLERR, 边缘触发模式:EPOLLET
然后做为传入参数,描述了我要做什么事情,里面还有一个fd,对应了epoll_ctl的第三个参数。学到这里的时候有一个想法,就是为什么在还需要第四个参数中有一个fd,且这个fd和第三个参数是一样的,网上也没有找到合理的说明,那么只有一种可能,就是epoll_event 做为参数使用的时候,要用到fd,但是epoll的开发者又不想依赖于外部条件,因此将这个参数再填写一遍
void *ptr //这个todo
#include <sys/epoll.h>
int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event)
epfd: 为epoll_creat的句柄
op: 表示动作,用3个宏来表示:
EPOLL_CTL_ADD (注册新的fd到epfd),
EPOLL_CTL_MOD (修改已经注册的fd的监听事件),
EPOLL_CTL_DEL (从epfd删除一个fd);
event: 告诉内核需要监听的事件
struct epoll_event {
__uint32_t events; /* Epoll events */
epoll_data_t data; /* User data variable */
};
typedef union epoll_data {
void *ptr;
i