2.epoll的性能优势
前面说了epoll的特点,那么这些特点能带来什么好处呢?Epoll 在绝大多数情况下性能都远超 select 或者 poll,但是除了速度之外,三者之间的 CPU 开销,内存消耗情况又怎么样呢?
以下来自stackoverflow网友的问答翻译
问:
我读过所有的关于tornado的书告诉我在epoll是可以替代select和poll的,特别是对twisted(twsited是python的另一个十分有名的网络库)。查阅epoll以及其他的(select等)相关资料表明,epoll速度很快并且拓展性很强,这是否表明在CPU和内存消耗上,epoll仍然很强?
答:
在socket数量很少的时候,select在内存消耗以及运行效率上都超过epoll,当然,这个差距是非常小的,以至于在绝大多数环境下都可以忽略。但是,无论是选择select还是epoll,在不同场景下面临的api复杂度是不一样的。如果你选择了一个单一的fd,100,那么它的性能会高于两倍以上的fd,50.
Epoll的成本接近于fd(文件描述符),如果你监控200个fd,其中只有100个有IO事件,那么你只需要支付这100个fd的消耗,而不用在乎另外的100个,这就是epoll提供的优势。相反,当你使用select的时候,如果1000个fd都处于空闲,你仍然要监控这1000个fd(简单的来讲,就是epoll只为有io的fd支付。你干活,我付钱给你;你不干活,那么我就不给你钱)。那么这就意味着更少的CPU使用率。
关于内存使用率,简单来说,使用select的话,你要花384字节监视一个文件描述符,但它的价值是1024,而用epoll你只花20个字节。不过,所有这些数字都很小,所以没有太大的区别。