天天看點

Nginx服務整理 優化點

Nginx最大客戶連接配接數算法一些遐想

現在很多網際網路公司都在使用nginx,并且替換掉以前的Apache,nginx的優點就不說了,淺聊兩句nginx的某些配置參數,找到這些參數設定的目的和關聯性,并且理論計算出nginx的并發量。

廢話不多說,貼跟其相關的配置選項

Nginx服務整理 優化點

依次講解各個參數的用途:

worker_processes:表示開啟nginx的worker程序的個數,nginx啟動會開兩種程序,master程序用來管理排程,worker程序用來處理請求;

上面表示兩種設定方法,比如

方法一:worker_processes auto;

  表示設定伺服器cpu核數比對開啟nginx開啟的worker程序數

  檢視cpu核數:lscpu、cat /proc/cpuinfo

方法二:nginx設定cpu親和力

  worker_processes 8;

  worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;

  00000001表示啟用第一個CPU核心,00000010表示啟用第二個CPU核心,以此類推

worker_cpu_affinity:表示開啟八個程序,第一個程序對應着第一個CPU核心,第二個程序對應着第二個CPU核心,以此類推。

這種設定方法更高效,因将每個cpu核提供給固定的worker程序服務,減少cpu上下午切換帶來的資源浪費

如果伺服器cpu有限

比如:2核CPU,開啟2個程序,設定如下

worker_processes     2;

worker_cpu_affinity 01 10;

比如:2核CPU,開啟4個程序,設定如下

worker_processes     4;

worker_cpu_affinity 01 10 01 10;

注意:本人基于nginx1.6.2版本(後面版本沒有測試),壓測實驗證明worker_processes最多開啟8個,8個以上性能沒什麼提升,反而穩定性變得更低。

worker_rlimit_nofile 65535;

這個參數表示worker程序最多能打開的檔案句柄數,基于liunx系統ulimit設定

檢視系統檔案句柄數最大值:ulimit -n

注意:Linux一切皆檔案,所有請求過來最終目的通路檔案,是以該參數值設定等同于liunx系統ulimit設定為優

events {

    use epoll;

    worker_connections 65535;

    multi_accept on;

}

events子產品處理網絡事件

epoll:網絡模型高效(相當于建立索引查找結果),nginx配置應該啟用該參數

worker_connections:該參數表示設定一個worker程序最多開啟多少線程數

優化設定應該等同于worker_rlimit_nofile設定值,表明一個線程處理一個http請求,同時可以處理一個檔案數,各個子產品之間協調合作不等待。

http {

    keepalive_timeout  65;

keepalive_timeout:該參數表示用戶端和nginx之間設定http(基于tcp協定)長連接配接,長連接配接的優勢不用說了吧,長連接配接是否打開基于業務類型

設定65秒表示一個TCP請求保持會話時常為65秒,65秒内TCP狀态碼轉化至TIME_WAIT轉态

如果要使該線程可以拿來重新處理其他的請求:

  方法一:TCP的TIME_WAIT轉換至CLOSE轉态,等待60秒左右(2倍MLS時間:表示請求繞着全球走一圈的時間)沒有得到響應自然釋放連接配接;

  方法二:TCP複用和強制回收

      cat /etc/sysctl.conf:設定net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle等參數

上面講解各個參數的功能,這次主要目的講解nginx能處理用戶端最大連接配接數,以下講解的都是理論值(因不考慮I/O排程或者網絡因素等其他原因)

我們知道nginx即可以作為伺服器使用,又可以作為反向代理使用,計算公式如下:

nginx作為http伺服器的時候:

Nginx服務整理 優化點

    max_clients = worker_processes * worker_connections/2

nginx作為反向代理伺服器的時候:

Nginx服務整理 優化點

    max_clients = worker_processes * worker_connections/4

注意:

為什麼除以2:該公式基于http 1.1協定,一次請求大多數浏覽器發送兩次連接配接,并不是request和response響應占用兩個線程(很多人也是這麼認為,實際情況:請求是雙向的,連接配接是沒有方向的,由上面的圖可以看出來)

為什麼除以4:因nginx作為方向代理,用戶端和nginx建立連接配接,nginx和後端伺服器也要建立連接配接

由此,我們可以計算nginx作為http伺服器最大并發量(作為反向代理伺服器自己類推),可以為壓測和線上環境的優化提供一些理論依據:

機關時間(keepalive_timeout)内nginx最大并發量C

C=worker_processes * worker_connections/2=8*65535/2

而每秒的并發量CS

CS=worker_processes * worker_connections/(2*65)

基于上面的公式知道,為了避免大量TCP連接配接time_out情況,優化過程中可以考慮這方面的原因:

1:keepalive_timeout設定時常(會話保持):可以根據業務來設定多少,因一次請求真正釋放掉線程為其他的連接配接使用所花時間為:keepalive_timeout+2MLS

2:nginx作為反向代理使用:keepalive_timeout隻是開啟用戶端和nginx的長連接配接,nginx和後端的長連接配接預設是沒有開啟的,設定如下:

    upstream test

        {

           server 172.16.34.2:8000;

      server 172.16.34.3:8000;

      server 172.16.34.4:8000;

      keepalive 60;

        }

本文轉自 liqius 51CTO部落格,原文連結:http://blog.51cto.com/szgb17/1909644,如需轉載請自行聯系原作者

繼續閱讀