区分select/poll/epoll
- 本质上都是同步阻塞I/O,在I/O事件就绪后自己负责将数据从内核拷贝到用户空间;
- select和poll比较类似,在内核空间和用户空间之间需要每一次拷贝传递所有文件描述符;
- epoll是Linux2.6内核提出的对select和poll的优化,将用户的文件描述符存放在内核的一个事件表中,这样在系统内核空间与用户空间只需要拷贝一次;
- 表面上看epoll的性能最好,但在连接数少且都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调;
- select低效是因为它每次都需要轮询,但这是可以通过设计该删的。
C10K/C10M问题
- 由于硬件资源耗尽导致网络服务器无法提供同时服务超过10,000连接或客户端的能力;
- 并不是因为TCP/IP的Socket Port端口最大值(65535)引起的,两者可以说毫无关系。端口可以复用,而且可以使用多个(虚拟)网卡;
- 操作系统最大可打开文件数:单进程,以及全系统,两个地方都可以修改以增大限制;
- 系统跟踪的最大TCP连接数;此限制值应尽量小,以节省对内核内存的占用,例如设置为net.ipv4.ip_conntrack_max = 10240
- 内存只有:一个socket在内核可能占用2~4M空间,一个线程可能占用1M左右空间。