輕量級HTTP服務器Nginx(Nginx性能優化技巧)

1、編譯安裝過程優化nginx

1.減少Nginx編譯後的文件大小
在編譯Nginx時,默認以debug模式進行,而在debug模式下會插入不少跟蹤和ASSERT之類的信息,編譯完成後,一個Nginx要有好幾兆字節。在編譯前取消Nginx的debug模式,編譯完成後Nginx只有幾百千字節,所以能夠在編譯以前,修改相關源碼,取消debug模式,具體方法以下:
在Nginx源碼文件被解壓後,找到源碼目錄下的auto/cc/gcc文件,在其中找到以下幾行:服務器

  
  
           
  
  
  1. # debug  
  2. CFLAGS=」$CFLAGS -g」  

註釋掉或刪掉這兩行,便可取消debug模式。cookie

2.爲特定的CPU指定CPU類型編譯優化
在編譯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"網絡

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庫
能夠從http://download.savannah.gnu.org/releases/libunwind下載相應的libunwind版本,這裏下載的是libunwind-0.99-alpha.tar.gz,安裝過程以下:
 socket

  
  
           
  
  
  1. [root@localhost home]#tar zxvf libunwind-0.99-alpha.tar.gz  
  2. [root@localhost home]# cd libunwind-0.99-alpha/  
  3. [root@localhost libunwind-0.99-alpha]#CFLAGS=-fPIC ./configure  
  4. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC  
  5. [root@localhost libunwind-0.99-alpha]#make CFLAGS=-fPIC install  

2.安裝google-perftools
能夠從http://google-perftools.googlecode.com下載相應的google-perftools版本,這裏下載的是google-perftools-1.8.tar.gz,安裝過程以下:
 tcp

  
  
           
  
  
  1. [root@localhost home]#tar zxvf google-perftools-1.8.tar.gz  
  2. [root@localhost home]#cd google-perftools-1.8/  
  3. [root@localhost google-perftools-1.8]# ./configure  
  4. [root@localhost google-perftools-1.8]#make && make install  
  5. [root@localhost google-perftools-1.8]#echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf  
  6. [root@localhost google-perftools-1.8]# ldconfig  

至此,google-perftools安裝完成。ide

3.從新編譯Nginx
爲了使Nginx支持google-perftools,須要在安裝過程當中添加「–with-google_perftools_module」選項從新編譯Nginx,安裝代碼以下:
 函數

  
  
           
  
  
  1. [root@localhostnginx-0.7.65]#./configure \  
  2. >--with-google_perftools_module --with-http_stub_status_module  --prefix=/opt/nginx  
  3. [root@localhost nginx-0.7.65]#make  
  4. [root@localhost nginx-0.7.65]#make install  

到這裏Nginx安裝完成。高併發

4.爲google-perftools添加線程目錄
建立一個線程目錄,這裏將文件放在/tmp/tcmalloc下,操做以下:
 

  
  
           
  
  
  1. [root@localhost home]#mkdir /tmp/tcmalloc  
  2. [root@localhost home]#chmod 0777 /tmp/tcmalloc  

5.修改Nginx主配置文件
修改nginx.conf文件,在pid這行的下面添加以下代碼:
 

  
  
           
  
  
  1. #pid        logs/nginx.pid;  
  2. google_perftools_profiles /tmp/tcmalloc;  

接着,重啓Nginx,完成google-perftools的加載。

6.驗證運行狀態
爲了驗證google-perftools已經正常加載,經過以下命令查看:
 

  
  
           
  
  
  1. [root@ localhost home]# lsof -n | grep tcmalloc  
  2. nginx      2395 nobody   9w  REG    8,8       0    1599440 /tmp/tcmalloc.2395  
  3. nginx      2396 nobody   11w REG   8,8       0    1599443 /tmp/tcmalloc.2396  
  4. nginx      2397 nobody   13w REG  8,8        0    1599441  /tmp/tcmalloc.2397  
  5. nginx     2398 nobody    15w REG  8,8     0    1599442 /tmp/tcmalloc.2398  

因爲在Nginx配置文件中,設置worker_processes的值爲4,所以開啓了4個Nginx線程,每一個線程會有一行記錄。每一個線程文件後面的數字值就是啓動的Nginx的PID值。
至此,利用TCMalloc優化Nginx的操做完成。

3、Nginx內核參數優化
內核參數的優化,主要是在Linux系統中針對Nginx應用而進行的系統內核參數優化,常見的優化參數值以下。
下面給出一個優化實例以供參考:

  
  
           
  
  
  1. net.ipv4.tcp_max_tw_buckets = 6000 
  2. net.ipv4.ip_local_port_range = 1024 65000  
  3. net.ipv4.tcp_tw_recycle = 1 
  4. net.ipv4.tcp_tw_reuse = 1 
  5. net.ipv4.tcp_syncookies = 1 
  6. net.core.somaxconn = 262144 
  7. net.core.netdev_max_backlog = 262144 
  8. net.ipv4.tcp_max_orphans = 262144 
  9. net.ipv4.tcp_max_syn_backlog = 262144 
  10. net.ipv4.tcp_synack_retries = 1 
  11. net.ipv4.tcp_syn_retries = 1 
  12. net.ipv4.tcp_fin_timeout = 1 
  13. 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(單位是小時)。  

相關文章
相關標籤/搜索