天天看點

《高性能Linux伺服器建構實戰》——1.6節Nginx性能優化技巧

1.6.1 編譯安裝過程優化

1.減小nginx編譯後的檔案大小

在編譯nginx時,預設以debug模式進行,而在debug模式下會插入很多跟蹤和assert之類的資訊,編譯完成後,一個nginx要有好幾兆位元組。而在編譯前取消nginx的debug模式,編譯完成後nginx隻有幾百千位元組。是以可以在編譯之前,修改相關源碼,取消debug模式。具體方法如下:

在nginx源碼檔案被解壓後,找到源碼目錄下的auto/cc/gcc檔案,在其中找到如下幾行:

注釋掉或删掉這兩行,即可取消debug模式。

2.為特定的cpu指定cpu類型編譯優化

在編譯nginx時,預設的gcc編譯參數是“-o”,要優化gcc編譯,可以使用以下兩個參數:

要确定cpu類型,可以通過如下指令:

1.6.2 利用tcmalloc優化nginx的性能

tcmalloc的全稱為thread-caching malloc,是谷歌開發的開源工具google-perftools中的一個成員。與标準的glibc庫的malloc相比,tcmalloc庫在記憶體配置設定效率和速度上要高很多,這在很大程度上提高了伺服器在高并發情況下的性能,進而降低了系統的負載。下面簡單介紹如何為nginx添加tcmalloc庫支援。

要安裝tcmalloc庫,需要安裝libunwind(32位作業系統不需要安裝)和google-perftools兩個軟體包,libunwind庫為基于64位cpu和作業系統的程式提供了基本函數調用鍊和函數調用寄存器功能。下面介紹利用tcmalloc優化nginx的具體操作過程。

1.安裝libunwind庫

2.安裝google-perftools

至此,google-perftools安裝完成。

3.重新編譯nginx

為了使nginx支援google-perftools,需要在安裝過程中添加“–with-google_perftools_module”選項重新編譯nginx。安裝代碼如下:

到這裡nginx安裝完成。

4.為google-perftools添加線程目錄

建立一個線程目錄,這裡将檔案放在/tmp/tcmalloc下。操作如下:

5.修改nginx主配置檔案

修改nginx.conf檔案,在pid這行的下面添加如下代碼:

接着,重新開機nginx即可完成google-perftools的加載。

6.驗證運作狀态

為了驗證google-perftools已經正常加載,可通過如下指令檢視:

由于在nginx配置檔案中設定worker_processes的值為4,是以開啟了4個nginx線程,每個線程會有一行記錄。每個線程檔案後面的數字值就是啟動的nginx的pid值。

至此,利用tcmalloc優化nginx的操作完成。

1.6.3 nginx核心參數優化

核心參數的優化,主要是在linux系統中針對nginx應用而進行的系統核心參數優化。

下面給出一個優化執行個體以供參考。

将上面的核心參數值加入/etc/sysctl.conf檔案中,然後執行如下指令使之生效:

下面對執行個體中選項的含義進行介紹:

net.ipv4.tcp_max_tw_buckets選項用來設定timewait的數量,預設是180 000,這裡設為6000。

net.ipv4.ip_local_port_range選項用來設定允許系統打開的端口範圍。

net.ipv4.tcp_tw_recycle選項用于設定啟用timewait快速回收。

net.ipv4.tcp_tw_reuse選項用于設定開啟重用,允許将time-wait sockets重新用于新的tcp連接配接。

net.ipv4.tcp_syncookies選項用于設定開啟syn cookies,當出現syn等待隊列溢出時,啟用cookies進行處理。

net.core.somaxconn選項的預設值是128, 這個參數用于調節系統同時發起的tcp連接配接數,在高并發的請求中,預設的值可能會導緻連結逾時或者重傳,是以,需要結合并發請求數來調節此值。

net.core.netdev_max_backlog選項表示當每個網絡接口接收資料包的速率比核心處理這些包的速率快時,允許發送到隊列的資料包的最大數目。

net.ipv4.tcp_max_orphans選項用于設定系統中最多有多少個tcp套接字不被關聯到任何一個使用者檔案句柄上。如果超過這個數字,孤立連接配接将立即被複位并列印出警告資訊。這個限制隻是為了防止簡單的dos攻擊。不能過分依靠這個限制甚至人為減小這個值,更多的情況下應該增加這個值。

net.ipv4.tcp_max_syn_backlog選項用于記錄那些尚未收到用戶端确認資訊的連接配接請求的最大值。對于有128mb記憶體的系統而言,此參數的預設值是1024,對小記憶體的系統則是128。

net.ipv4.tcp_synack_retries參數的值決定了核心放棄連接配接之前發送syn+ack包的數量。

net.ipv4.tcp_syn_retries選項表示在核心放棄建立連接配接之前發送syn包的數量。

net.ipv4.tcp_fin_timeout選項決定了套接字保持在fin-wait-2狀态的時間。預設值是60秒。正确設定這個值非常重要,有時即使一個負載很小的web伺服器,也會出現大量的死套接字而産生記憶體溢出的風險。

如果發送端要求關閉套接字,net.ipv4.tcp_fin_timeout選項決定了套接字保持在fin-wait-2狀态的時間。接收端可以出錯并永遠不關閉連接配接,甚至意外當機。

net.ipv4.tcp_fin_timeout的預設值是60秒。需要注意的是,即使一個負載很小的web伺服器,也會出現因為大量的死套接字而産生記憶體溢出的風險。fin-wait-2的危險性比fin-wait-1要小,因為它最多隻能消耗1.5kb的記憶體,但是其生存期長些。

net.ipv4.tcp_keepalive_time選項表示當keepalive啟用的時候,tcp發送keepalive消息的頻度。預設值是2(機關是小時)。