天天看點

Varnish 安裝步驟(七)

高性能HTTP加速器Varnish(性能調優篇)

varnish是否能穩定、快速的運作,與Linux本身的優化以及varnish自身參數的設定有很大關系,在varnish安裝配置完成後,還必須從作業系統和varnish配置參數兩個方面對varnish伺服器進行性能優化,進而最大程度上發揮varnish的性能。

一、優化linux核心參數

核心參數是使用者和系統核心之間互動的一個接口,通過這個接口,使用者可以在系統運作的同時動态的更新核心配置,而這些核心參數是通過Linux Proc檔案系統存在的,是以,可以通過對Proc檔案系統進行調整,達到性能優化的目的。

以下參數是官方給出的一個配置,内容如下:

net.ipv4.ip_local_port_range = 1024 65536

net.core.rmem_max=16777216

net.core.wmem_max=16777216

net.ipv4.tcp_rmem=4096 87380 16777216

net.ipv4.tcp_wmem=4096 65536 16777216

net.ipv4.tcp_fin_timeout = 30

net.core.netdev_max_backlog = 30000。

net.ipv4.tcp_no_metrics_save=1

net.core.somaxconn = 262144

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_max_orphans = 262144

net.ipv4.tcp_max_syn_backlog = 262144

net.ipv4.tcp_synack_retries = 2

net.ipv4.tcp_syn_retries = 2

對上面的每個選項含義解釋如下:

 net.ipv4.ip_local_port_range:用來指定外部連接配接的端口範圍,預設是32768到61000,這裡設定為1024到65536。

 net.core.rmem_max:該檔案指定了接收套接字緩沖區大小的最大值,機關是位元組。

 net.core.wmem_max:該檔案指定了發送套接字緩沖區大小的最大值,機關是位元組。

 net.ipv4.tcp_rmem:此參數與net.ipv4.tcp_wmem都是用來優化TCP接收/發送緩沖區,包含三個整數值,分别是:min,default,max:

tcp_rmem:min表示為TCP socket預留用于接收緩沖的最小記憶體數量,default為TCP socket預留用于接收緩沖的預設記憶體數量,max用于TCP socket接收緩沖的記憶體最大值。

tcp_wmem:min表示為TCP socket預留用于發送緩沖的記憶體最小值,default為TCP socket預留用于發送緩沖的預設記憶體值,max用于TCP socket發送緩沖的記憶體最大值。

 net.ipv4.tcp_fin_timeout:此參數用來減少處于FIN-WAIT-2連接配接狀态的時間,使系統可以處理更多的連接配接。此參數值為整數,機關為秒。

舉一個例子:在一個tcp會話過程中,在會話結束時,A首先向B發送一個fin包,在獲得B的ack确認包後,A就進入FIN WAIT2狀态等待B的fin包,然後給B發ack确認包。此參數就是用來設定A進入FIN WAIT2狀态等待對方fin包的逾時時間。如果時間到了仍未收到對方的fin包就主動釋放該會話。

 net.core.netdev_max_backlog:該參數表示在每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許送到隊列的資料包的最大數量。

 net.ipv4.tcp_syncookie:該檔案表示是否打開SYN Cookie功能,tcp_syncookies是一個開關,該功能有助于保護伺服器免受SyncFlood攻擊。預設為0,這裡設定為1。

 net.ipv4.tcp_max_orphans:表示系統中最多有多少TCP套接字不被關聯到任何一個使用者檔案句柄上。如果超過這個數字,孤兒連接配接就會複位并打輸出警告資訊。這個限制僅僅是為了防止簡單的DoS攻擊。此值不能太小。這裡設定為262144。

 net.ipv4.tcp_max_syn_backlog:表示SYN隊列的長度,預設為1024,這裡設定隊列長度為262144,以容納更多等待連接配接。

 net.ipv4.tcp_synack_retries:這個參數用于設定核心放棄連接配接之前發送SYN+ACK包的數量。

 net.ipv4.tcp_syn_retries:此參數表示在核心放棄建立連接配接之前發送SYN包的數量。

将以上内容添加到/etc/sysctl.conf檔案中,然後執行如下指令,讓設定生效:

[root@varnish-server ~]#sysctl  -p

二、優化系統資源

假設有這樣一種情況,當一台Linux 主機上同時登陸了10個人,在系統資源沒有限制的情況下,這10個使用者同時打開了500個文檔,而假設每個文檔的大小有10M,這時系統的記憶體資源就會受到巨大的挑戰。如果沒有記憶體方面的限制,勢必造成系統資源利用的混亂,而實際的應用環境要比這種假設複雜的多,這時,ulimit就派上用場了。它是一種簡單并且有效的實作資源限制的方式。

ulimit可以限制系統的各個方面,它通過限制shell啟動程序所占用的資源,來完成系統資源的合理利用和配置設定,ulimit支援以下各種類型的限制:所建立的核心檔案的大小、記憶體鎖住的大小、常駐記憶體集的大小、程序資料塊的大小、打開檔案描述符的數量、Shell程序所能使用的最大虛拟記憶體、Shell 程序建立檔案的大小、配置設定堆棧的最大大小、單個使用者的最大線程數、CPU 時間等。同時,它還支援硬資源和軟資源的限制。

ulimit有臨時限制和永久限制兩種實作方式,它可以限制通過使用其指令行登入的shell會話,并在會話終止時結束限制,而不影響于其它shell會話。對于長期的固定限制,ulimit的指令可以添加到由登入shell的配置檔案中,這樣就實作了永久限制shell啟動程序所占用的資源。

Ulimit使用格式為:ulimit [options] [value]

具體的options 含義以及簡單示例如表1所示:

表1

Varnish 安裝步驟(七)
Varnish 安裝步驟(七)

在了解了ulimit的含義和用法以後,接下來就可以針對varnish系統進行相關的設定了,這裡的參數設定值如下所示,但是此值不能一概而論,需要根據應用環境的不同,選擇适合的值:

ulimit -HSn 131072

ulimit -HSc unlimited

為了保證這個限制永久生效,最好将ulimit設定放到varnish的啟動腳本中。

三、Varnish參數優化

通過telnet到varnish的3500管理端口,然後執行“param.show”指令即可看到varnish運作中的所有參數,當然也可以通過這種方式更改相關參數,varnish運作中的參數有很多,這裡僅選取對varnish性能影響比較大的幾個參數進行介紹,更多介紹請查閱官方文檔。

首先看下面四個參數:

thread_pools               4 [pools]

thread_pool_min            50 [threads]

thread_pool_max            5120 [threads]

thread_pool_timeout        10 [seconds]

 thread_pools:用來設定線程池的數量,一般認為這個值和系統CPU的數目相同最好,設定過多的pools,varnish的并發處理能力會更強,但是也會消耗更多的CPU和記憶體。

 thread_pool_min:用來設定每個pools的最小threads數,當pools接收到可用的請求後,就會将請求配置設定給空閑的threads來處理。

 thread_pool_max:表示所有pools對應的threads數總和的最大值,此值不能太大,可以設定為系統峰值的90%左右即可,設定過大,會導緻程序hung住。

 thread_pool_timeout:表示threads的逾時過期時間,當threads數大于thread_pool_min設定值時,threads空閑超過thread_pool_timeout設定的時間時,thread就會被釋放掉。

另外還有兩個參數:

lru_interval               20 [seconds]

listen_depth               1024 [connections]

 lru_interval:這是個時間參數,大概意思是說如果有一個對象在記憶體中超過了此參數設定的時間還沒有被重用時,就把這個對象從LRU(Least Recently Used)隊列中移除。這其實是緩存系統的一個常用算法,合理的設定這個時間,可以提高系統的運作效率。

 listen_depth:這個參數是設定TCP連接配接隊列的長度,設定大一點可以提高并發處理能力。

對于這些優化參數,最好的方式是加到varnish的啟動腳本中,通過varnishd的“-p”參數調用即可。

繼續閱讀