大访问量下Apache和Nginx谁性能高?
为什么大访问量下Nginx性能更高?
两者采用的服务器的模式不一样
- Apache所采用的select网络I/O模型非常低效
- Nginx使用了最新的epoll(Linux 2.6内核)和kqueue(freebsd)网络I/O模型
两个网络模型的区别
select的优点:
select 目前几乎在所有的平台上支持,其良好跨平台支持也是它的一个优点。
select的缺点:
1. select 的一个缺点在于单个进程能够监视的文件描述符的数量存在最大限制,在Linux上一般为1024,可以通过修改宏定义甚至重新编译内核的方式提升这一限制,但是这样也会造成效率的降低。
2. 对socket进行扫描时是线性扫描,即采用轮询的方法,效率较低。当套接字比较多的时候,每次select()都要通过遍历FD_SETSIZE个Socket来完成调度,不管哪个Socket是活跃的,都遍历一遍。这会浪费很多CPU时间。如果能给套接字注册某个回调函数,当他们活跃时,自动完成相关操作,那就避免了轮询,这正是epoll与kqueue做的。
3. 需要维护一个用来存放大量fd的数据结构,这样会使得用户空间和内核空间在传递该结构时复制开销大 。
epoll介绍
epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。epoll使用一个文件描述符管理多个描述符,将用户关系的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次。
epoll的优点
1. 没有最大并发连接的限制,能打开的FD的上限远大于1024(1G的内存上能监听约10万个端口)
2. 效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用 callback 函数;即Epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,Epoll的效率就会远远高于select和poll。
3. 内存拷贝,利用 mmap() 文件映射内存加速与内核空间的消息传递;即epoll使用mmap减少复制开销。
如何选择
综上,在选择select,epoll时要根据具体的使用场合以及这两种方式的自身特点:
- 表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调
- select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
- 一般访问量网站优先选择Apache,它稳定可靠
- Apache模块非常丰富,为了用它的模块得选它
- Apache的rewrite非常强大,rewrite多就选择它
- 大访问量优先选择Nginx,它支持更多的并发连接
- 处理的都是静态内容(html,图片),首选Nginx
- Nginx本质上是反向代理服务器,需要反向代理就选它