1. 程式人生 > >【20180712】Nginx 參數優化和內核參數優化

【20180712】Nginx 參數優化和內核參數優化

關閉連接 pla GZip壓縮 con soc java squid服務器 val expire

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套接字拖死。

【20180712】Nginx 參數優化和內核參數優化