Nginx效能優化技巧(6)

2022-04-02 05:42:52 字數 4824 閱讀 6410

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

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

# debug  

cflags=」$cflags -g」  

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

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

--with-cc-opt='-o3'

--with-cpu-opt=cpu  #為特定的 cpu 編譯,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64

要確定cpu型別,可以通過如下命令: 

[root@localhost home]#cat /proc/cpuinfo | grep "model name"

tcmalloc的全稱為thread-caching malloc,是谷歌開發的開源工具「google-perftools」中的乙個成員。與標準的glibc庫的malloc相比,tcmalloc庫在記憶體分配效率和速度上要高很多,這在很大程度上提高了伺服器在高併發情況下的效能,從而降低系統負載。下面簡單介紹如何為nginx新增tcmalloc庫支援。

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

[root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz  

[root@localhost home]# cd libunwind-0.99-alpha/  

[root@localhost libunwind-0.99-alpha]#cflags=-fpic ./configure  

[root@localhost libunwind-0.99-alpha]#make cflags=-fpic  

[root@localhost libunwind-0.99-alpha]#make cflags=-fpic install  

[root@localhost home]#tar zxvf google-perftools-1.8.tar.gz  

[root@localhost home]#cd google-perftools-1.8/  

[root@localhost google-perftools-1.8]# ./configure  

[root@localhost google-perftools-1.8]#make && make install  

[root@localhost google-perftools-1.8]#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  

[root@localhost google-perftools-1.8]# ldconfig  

至此,google-perftools安裝完成。

為了使nginx支援google-perftools,需要在安裝過程中新增「–with-google_perftools_module」選項重新編譯nginx,安裝**如下:

到這裡nginx安裝完成。

建立乙個執行緒目錄,這裡將檔案放在/tmp/tcmalloc下,操作如下:

[root@localhost home]#mkdir /tmp/tcmalloc  

[root@localhost home]#chmod 0777 /tmp/tcmalloc  

修改nginx.conf檔案,在pid這行的下面新增如下**:

#pid        logs/nginx.pid;  

google_perftools_profiles /tmp/tcmalloc;  

接著,重啟nginx,完成google-perftools的載入。

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

[root@ localhost home]# lsof -n | grep tcmalloc  

nginx      2395 nobody   9w  reg    8,8       0    1599440 /tmp/tcmalloc.2395  

nginx      2396 nobody   11w reg   8,8       0    1599443 /tmp/tcmalloc.2396  

nginx      2397 nobody   13w reg  8,8        0    1599441  /tmp/tcmalloc.2397  

nginx     2398 nobody    15w reg  8,8     0    1599442 /tmp/tcmalloc.2398  

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

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

核心引數的優化,主要是在linux系統中針對nginx應用而進行的系統核心引數優化,常見的優化引數值如下。

下面給出乙個優化例項以供參考:

net.ipv4.tcp_max_tw_buckets = 6000 

net.ipv4.ip_local_port_range = 1024 65000  

net.ipv4.tcp_tw_recycle = 1 

net.ipv4.tcp_tw_reuse = 1 

net.ipv4.tcp_syncookies = 1 

net.core.somaxconn = 262144 

net.core.netdev_max_backlog = 262144 

net.ipv4.tcp_max_orphans = 262144 

net.ipv4.tcp_max_syn_backlog = 262144 

net.ipv4.tcp_synack_retries = 1 

net.ipv4.tcp_syn_retries = 1 

net.ipv4.tcp_fin_timeout = 1 

net.ipv4.tcp_keepalive_time = 30 

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

[root@ localhost home]#/sbin/sysctl -p

下面是對例項中選項的含義進行介紹:

 net.ipv4.tcp_max_tw_buckets引數用來設定timewait的數量,預設是180000,這裡設為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_keepalive_time選項表示當keepalive啟用的時候,tcp傳送keepalive訊息的頻度。預設值是2(單位是小時)。

6個Python效能優化技巧

python是一門非常酷的語言,因為很少的python 可以在短時間內做很多事情,並且,python很容易就能支援多工和多重處理。python的批評者聲稱python效能低效 執行緩慢,但實際上並非如此 嘗試以下6個小技巧,可以加快pytho應用程式。python使許多程式設計任務變得簡單,但是對於...

Nginx效能優化

在http裡面新增一行 server tokens off 預設可以設定為cpu的核數相等,併發比較大的時候,可以設定為cpu核數 2 worker cpu affinity 0001 0010 0100 1000 四核worker cpu affinity 00000001 00000010 00...

nginx效能優化

1 執行緒池 預設情況下,nginx的work process按照順序乙個個處理http請求,因此如果後台處理時間較長,則work process會長時間等待io狀態,因此限制併發性。如下所示 所以,對於可能存在的這類http請求,一般會啟用執行緒池。預設情況下,執行緒池特性並不啟用,需要在編譯時增...