【20180712】Nginx 参数优化和内核参数优化

Nginx 参数优化

  1. worker_processes
    • 这里的数值不能超过CPU的总核数,因为在单个核上部署超过1个Nginx服务进程并不能起到提高性能的作用。
  2. worker_rlimit_nofile
    • Nginx最大可用文件描述符数量,同时需要配置操作系统的"ulimit -n 200000",或者在/etc/security/limits.conf中配置
  3. worker_connections
    • 配置单个Nginx单个进程可服务的客户端数量,(最大值客户端数 = 单个进程链接数据 * 进程数),最大客户端数同时也受操作系统socket链接数的影响(最大64K)
  4. use epoll
    • Linux 关键配置,允许单个线程处理多个客户端请求
  5. multi_accept on
    • 运行尽可能的处理更多的链接数,如果worker_connections配置太低,会产生大量的无效链接请求。
  6. 缓存配置信息

    • open_file_cache max=200000 inactive=20s
      • 缓存高频操作的文件的FDs(文件描述符/文件句柄) 最大数目和缓存的时间
    • open_file_cache_valid 30s
      • 在open_file_cache中指定检测正确信息的间隔时间
    • open_file_cache_min_uses 2
      • 在open_file_cache中指令参数不活动期间内最小的文件数
    • open_file_cache_errors on
      • 指定令当搜索一个文件释放缓存错误信息,也包括再次给配置文件添加文件
  7. sendfile on
    • 开启sendfile选项,使得内核的FD文件传输功能,这个比用户态用read()+write()的方式更高效
  8. tcp_nopush on
    • 打开tcp_nopush选项,Nginx允许将HTTP应答首部与数据内容在用一个报文中发出。这个选项使服务器在sendfile时可以提前准备HTTP首部,能够达到优化吞吐的效果。
  9. tcp_nodelay on
    • 不要缓存data-sends(关闭Nagle算法),这个能提高高频发送小数据报文的实时性。
  10. keepalive_timeout 30
    • 配置链接keep-alive超时时间,服务器将在超时之后关闭相应的链接。
  11. keepalive_requests 10000
    • 单个客户端在keep-alive链接上可以发送的请求数量。在测试和压测的环境中,需要配置一个较大的值
  12. reset_timedout_connection on
    • 允许服务器在停止发送应答之后关闭连接,以便释放链接相应的socket内存开销。
  13. client_body_timeout 10
    • 配置客户端数据请求超时时间,默认时60s
  14. send_timeout 2
    • 客户端数据读超时配置,客户端停止读取数据,超时时间后断开相应的链接,默认时60s
  15. 压缩参数设置,减少网络上所传输的数据量,但是解压也需要消耗一定的资源。
    • gzip on
    • gzip_min_length 10240
    • gzip_proxied expired no-cache no-store private auth
    • gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/xml
    • gzip_disable "MSIE [1-6]"
      • 指定客户端禁止使用gzip压缩功能

内核参数调优

  1. net.ipv4.ip_local_port_range = 2000 65000
    • 调高系统的IP以及端口数据限制,从可以接受更多的链接
  2. net.ipv4.tcp_window_scaling = 1
    • 支持超过64KB的TCP窗口
  3. net.ipv4.tcp_max_syn_backlog = 3240000
    • 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃
  4. net.core.somaxconn = 3240000
    • 调高socket侦听数阀值
  5. net.core.rmem_default = 8388608
    • 一般默认的接收窗口大小
  6. net.core.rmem_max = 16777216
    • 一般接收窗口的最大大小
  7. net.core.wmem_max = 16777216
    • 一般默认发送窗口最大大小
  8. net.ipv4.tcp_rmem = 4096 87380 16777216(min default max)
    • 为TCP socket预留用于接收缓冲的内存数量,即使在内存出现紧张情况下tcp socket都至少会有这么多的数量的内存用于接收缓冲,默认值为8K。
  9. net.ipv4.tcp_wmem = 4096 65536 16777216
    • 为TCP socket预留用于发送缓冲的内存数量,每个tcp socket都可以在建议以后都可以使用它。默认值为6K
  10. net.ipv4.tcp_congestion_control = cubic
    • 修改TCP拥塞控制算法。丢包使得TCP传输速度大幅下降的主要原因是丢包重传机制,控制这一机制的就是TCP拥塞控制算法。
  11. net.ipv4.tcp_fin_timeout = 30
    • 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
  12. net.ipv4.tcp_keepalive_time = 1200
    • 表示当前keepalive 启用的时间,TCP发送keepalive消息的频率。缺省是2小时,更改为20分钟
  13. net.ipv4.tcp_syncookies =1
    • 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量的SYN ×××,默认为0,表示关闭。
  14. net.ipv4.tcp_tw_reuse = 1
    • 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP链接,默认为0,表示关闭。
  15. net.ipv4.tcp_tw_recycle = 1
    • 表示开启TCP链接中的TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  16. net.ipv4.tcp_max_tw_buckets = 5000
    • 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印告警信息。默认为180000,更改为5000.对于Apache,Nginx等服务器,上几行参数可以很好的减少TIME_WAIT套接字数量,但是对于Squid,效果不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。

猜你喜欢

转载自blog.51cto.com/11819159/2141098