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 里面。

衍生思考:基本思路:找准指标,发现病灶,特别处理。不仅要注意平均,也要注意百分位(那些最差场景是否得到了优化)。