Cloudflare 优化 Nginx 性能
本文是 Cloudflare 的博客,关于如何让 Nginx 接收更多流量。
- Nginx 使用 event loops 解决 c10k 问题 (epoll_wait)
read(epoll_fd)
如果遇到 EWOULDBLOCK 意味着 local read buffer 已经读完,Nginx 就停止从 socket 中读数据直到来更多数据。- 由于 disk I/O 不同于 network I/O, 不存在等数据来这么一回事,直接
read(epoll_fd)
直到读完即可。- 如果场景是读取静态文件,完全可以去掉处理 network I/O 的逻辑。配上 SSD 硬盘,速度会更快。
- SSD 不是永远最快的。因为比较复杂,涉及到 queue up, re-order I/O, gc, defragmentation, 最差的 case 会非常非常慢。
- socket 开启
SO_REUSEPORT
可以改善性能。关于 SO_REUSEPORT, 这个参数可以让多个 servers 都监听同一个端口,这样一旦前面卡住了,后面的服务器也能处理请求。 - Nginx
aio threads; aio_write on;
可以将读写转到 thread pool 里面去执行,从而不卡住 event loop。但不是所有场景都适合这个优化,它也有可能导致最差场景变得比不开启这个特性性能更差。read
本身并不慢,慢的是open
,因为要对从 root 开始的一级一级目录做 check,也许可以将 open 也挪到 thread pools 里面。
衍生思考:基本思路:找准指标,发现病灶,特别处理。不仅要注意平均,也要注意百分位(那些最差场景是否得到了优化)。