add article about nginx performance optimization
This project is maintained by wangfakang
从运维的角度来进行系统优化一般是我们对系统优化的首选方案。主要是由于风险小、成本低、见效快;
* 首选是内核配置的优化:
* 1. net.ipv4.tcp_syncookies = 1 防止syn flood攻击
* 2. net.core.somaxconn 已连接队列大小
* 3. net.ipv4.tcp_max_syn_backlog 半连接队列大小
* 4. net.ipv4.tcp_tw_recycle = 0 不开启tw状态的fd循环使用,线上环境 tw_recycle 不要打开
* 5. net.ipv4.tcp_tw_reuse = 1 开启tw状态的fd重复使用,tw_reuse 只对客户端起作用,开启后客户端在1s内回收
* 6. net.ipv4.tcp_timestamps = 0 关闭tcp时间戳
注意: 注意观察4、5、6三个配置;
* 然后是nginx配置的优化:
* 1. worker_processes auto; cpu个数自动适配;
* 2. worker_cpu_affinity auto; cpu亲和性绑定、避免cpu cache失效、上下文切换等等;
* 3. tcp_nodelay on; 减少数据延迟;
* 4. tcp_nopush on; 在sendfile开启的时候生效,避免频繁net操作;
* 5. pcre_jit on; 正则处理优化,使用jit;
* 6. client_body_buffer_size 避免body写磁盘
* 7. proxy_buffer_size 避免body写磁盘
* 8. lua_code_cache on; 缓存lua 代码;
* 9. [ssl_stapling](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_stapling)、[ssl_session_tickets](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_tickets) 、[ssl_session_cache](http://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_session_cache)
* 10. postpone_output 0 减少数据延迟;
* 11. sendfile on;
* 12. reuseport [允许套接字端口共享](http://io.upyun.com/2015/07/20/nginx-socket-sharding/)
从开发的角度进行优化,那就要找到自己系统的瓶颈在哪(cpu、mem、net、io、disk等),cpu:找到最吃cpu的函数进行优化(高效算法替换、空间置换时间、硬件加速)、mem: 找到吃内存的地方(初始值是否合理、引用计算、结构体优化、使用共享内存)、net(同机房优先调用、大小包调整)、io(使用buffer cache异步刷盘、page cache设置)、disk(数据压缩存盘);
* 下面简单介绍一个列子:
* 1. 第一步火焰图绘制,可以参考这个[文章](https://moonbingbing.gitbooks.io/openresty-best-practices/content/flame_graph/install.html),注意最终的火焰图的高度表示其函数的调用深度、其长度表示占用cpu的比例;
* 2. 根据火焰图找到相关瓶颈函数,然后在对症下药;
关于nginx lua中常遇到的问题:
* 1. 详细可见如下文章:
* 1. https://groups.google.com/forum/#!msg/openresty/x0EkaEj85ho/-ugGeYhrQ_EJ;context-place=searchin/openresty/nginx$20%E4%BC%98%E5%8C%96%7Csort:relevance
* 2. https://groups.google.com/forum/#!msg/openresty/o67EjkImXyE/dASOW7x_argJ
* 3. https://groups.google.com/forum/#!searchin/openresty/require$20resty.core/openresty/psPBSG4KcSU/Xp1QTx7tCAAJ
主要涉及到:
* 1.尽量让luajit进行编译更多的代码;
* 2. --with-luajit-xcflags="-DLUAJIT_NUMMODE=2" 避免浮点数转化为字符串的昂贵代价;
* 3.在init_by_lua阶段调用了require "resty.core",尽量使用lua ffi接口避免lua Cfunction;
在使用中有任何问题,欢迎反馈给我,可以用以下联系方式跟我交流