分类:
2009-09-18 15:57:58
epoll, kqueue等单进程IO多路复用接口, 只在处理大批闲置连接时才能体现出优势. 如果每一个连接都很活跃, 请求的操作都是高IO和高CPU的, 那么瓶颈是机器本身的计算能力, 而不是连接的管理能力(这也是epoll等的作用). 这时, 如果能预先确定机器的计算能力所能处理的客户数量, 且数量较小的, 那么很多时候使用多线程/多进程(workers)更高效.
分析一下下面的攻击场景:
一种设想中的针对使用epoll模型的web服务器(如lighttpd)的攻击手法: 同服务器创建大量的连接, 在客户端禁用nagle算法, 以使客户端的数据立即发送到服务器. 然后, 客户端周期性地发送1个字节的数据.
这样, 导致服务器的每一个epoll_wait循环都会返回大量的就绪socket, 服务器迭代读取这些socket, 将导致一个循环消耗大量的时间, 最终影响对正常请求的响应.
这种场景设想, 大量慢速但不闲置的连接, 将导致服务器的计算资源消耗在对就绪连接的迭代和read调用上. 这种攻击只是一种设想, 有待实践验证.
你现在看的文章是: