Nginx下載服務生產服務器調優


一、內存調優

內核關於內存的選項都在/proc/sys/vm目錄下.
 
1.pdflush,用於回寫內存中的臟數據到硬盤。可以通過 /proc/sys/vm/vm.dirty_background_ratio調整。
 
首先查看這個值默認應該是10。
 
[root@server-mysql ~]#  cat /proc/sys/vm/dirty_background_ratio    
10

 

這個值是一個閥值,說明如果內存中的臟數據達到系統總內存的10%時,那么pdflush進程就會啟動,將內存中的臟數據寫回硬盤.這個值可適當調高.可獲得更快的寫入速度.
 
2.swappiness選項
[root@server-mysql ~]# cat /proc/sys/vm/swappiness  
60

swappiness表示使用swap分區的使用程度,可以適當調整swappiness=0的時候表示盡可能使用物理內存swap空間.swappiness=100積極使用swap.

 
 
3.dirty_ratio
 
[root@server-mysql ~]# cat /proc/sys/vm/dirty_ratio  
20

 

dirty_ratio的值是數據寫進內存的閥值,20%是指當系統內存已經緩存了20%的數據以后,就不再往內存中緩存數據了.

二、磁盤I/O調優

Linux磁盤I/O調優

一)、     概述

 
1.   磁盤調優目錄:/sys/block
2.   磁盤調優均是調內核參數,要求安裝kernel-doc包,
3.   調預先讀請求量(默認為128kb)
  1. # blockdev --getra /dev/sda 
  2. # blockdev --setra 512 /dev/sda  
  
實際修改/sys/block/sda/queue/read_ahead_kb=256kb;如果讀情況多則將此參數調大一點,如寫請求讀,則將此參數調小一點
 
4.   調磁盤隊列:隊列長則處理快,提升硬盤的吞吐量,但會消耗更大的內存
Queue length:/sys/block/sda/queue/nr_requests   
 
  1. # cat /sys/block/sda/queue/nr_requests  
  2. 512  
      
#默認128,沒有單位
 

二)、 磁盤I/O的4種調度算法

 
1.   CFQ(完全公平排隊I/O調度程序)(elevator=cfq)
 
特點:
  這是默認算法,對於通用服務器來說通常是最好的選擇。它試圖均勻地分布對I/O帶寬的訪問。是deadline和anticipatory調度器的折中方案.
  CFQ對於多媒體應用(video,audio)和桌面系統是最好的選擇.
  CFQ賦予I/O請求一個優先級,而I/O優先級請求獨立於進程優先級,高優先級的進程的讀寫不能自動地繼承高的I/O優先級.
  CFQ基於64位的隊列請求,使用的輪詢的方法處理隊列.
 
調優參數:
 
  1. #  /sys/block/sda/queue/iosched/queued:輪詢時每次處理的最大請求數 
  2. #  /sys/block/sda/queue/iosched/quantum:每隔多少個請求數做一次輪詢 
 
cfq調優工具ionice
ionice可以更改任務的類型和優先級,不過只有cfq調度程序可以用ionice.
有三個例子說明ionice的功能:
 采用cfq的實時調度(實時調度:c1),優先級為7(數字越低優先級越高)
 
  1. # ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 
 
 采用缺省的磁盤I/O調度(輪詢調度:c2),優先級為3
 
  1. # ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 
 
 采用空閑的磁盤調度(idle調度:c3),優先級為0
 
  1. # ionice -c3 -n0 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 
 
#ionice的三種調度方法,實時調度最高,其次是缺省的I/O調度,最后是空閑的磁盤調度.
ionice的磁盤調度優先級有8種,最高是0,最低是7.
注意,磁盤調度的優先級與進程nice的優先級沒有關系.一個是針對進程I/O的優先級,一個是針對進程CPU的優先級.
2.   Deadline(截止時間調度程序)(elevator=deadline):
 
特點:
  Deadline確保了在一個截止時間內服務請求,這個截止時間是可調整的,而默認讀期限短於寫期限.這樣就防止了寫操作因為不能被讀取而餓死的現象.
  這個算法試圖把每次請求的延遲降至最低。該算法重排了請求的順序來提高性能。可以調隊列的過期的讀寫過程,如 read_expire 和 write_expire 二個參數來控制多久內一定要讀到數據,超時就放棄排序。
  比較合適小文件。還可以使用打開 front_merges 來進行合並鄰近文件。Deadline對數據庫環境(Oracle RAC,MYSQL等)是最好的選擇.
 
調優:
  1. # echo deadline >/sys/block/sda/queue/scheduler 
  2. # more /sys/block/sda/queue/scheduler 
  3.  noop anticipatory [deadline] cfq 
  4. # ls /sys/block/sda/queue/iosched/ 
  5. fifo_batch  front_merges  read_expire  write_expire  writes_starved 
  6.  
  7. # cat iosched/read_expire  
  8. 500    #默認500ms 
  9.  
  10. # cat iosched/write_expire 
  11. 5000   #默認5000ms 
  12.  
  13. # cat iosched/front_merges 
  14. 1        
           
#默認為1,請求整合,新的請求和之前請求有關聯,則優先處理該請求,對IO性能沒有影響,但優化了磁盤處理。
 
3.   Anticipatory(預料I/O調度程序)(elevator=as):
 
特點:
  預想調度算法。優化完成率,改善讀請求。
  本質上與Deadline一樣,但在最后一次讀操作后,要等待6ms才能繼續進行對其它I/O請求進行調度。可以從應用程序中預訂一個新的讀請求,改進讀操作的執行,但以一些寫操作為代價,它會在每個6ms中插入新的I/O操作,而會將一些小寫入流合並成一個大寫入流,用寫入延時換取最大的寫入吞吐量。
  AS適合於寫入較多的環境,比如文件服務器;適合大文件處理,適合web server等。AS對數據庫環境表現很差。
調優:
 
  1. # echo "anticipatory">/sys/block/sda/queue/scheduler 
  2. # more iosched/antic_expire 
  3. 6       #默認為6秒 
  4. # more /sys/block/sda/queue/iosched/read_expire 
  5. 125      #讀的最大隊列時間 
  6. # more /sys/block/sda/queue/iosched/write_expire 
  7. 250      #寫的最大隊列時間 
  8. 注:測試時一定要清空緩存 
  9.  
  10. # free –m    #查看緩存 
  11.              total    used   free   shared    buffers     cached 
  12. Mem:        4054    506   3548   0        140        256 
  13. -/+ buffers/cache:      108   3945 
  14. Swap:         8189   0    8189 
測試:
 
  1. # sysctl -w vm.drop_caches=3   #清空緩存 
  2. # rpm –ivh elevator-test-0.1-3.i386.rpm  #安裝測試軟件 
  3. # dd if=/dev/urandom of=/root/bigfile bs=1M count=100 
  4. # watch –n 1 ls –lh /root/bigfile   #每隔一秒查寫入bigfile的數據量 
  5.  默認調度類型為cfq下,測試讀數據速度(測試時要求清空緩存) 
  6. # cat /sys/block/sda/queue/scheduler 
  7. noop anticipatory deadline [cfq] 
  8. et_start reader /root/bigfile 
  9. Launching 
  10. Reading 25600 pages 
  11. Read 20000 pages 
  12.  
  13. real    0m1.552s 
  14. user    0m0.011s 
  15. sys     0m0.147s 
  16.  將調度類型改為anticipatory,測試讀數據速度(測試時要求清空緩存) 
  17. # echo “anticipatory”>/sys/block/sda/queue/scheduler 
  18. noop anticipatory deadline [anticipatory] 
  19. # cat /sys/block/sda/queue/iosched/antic_expire 
  20. 12    #該值默認為6,為提高速度,改成12
     
    et_start reader /root/bigfile
    Launching
    Reading 25600 pages
    Read 20000 pages
     
    real    0m1.456s
    user    0m0.007s
    sys     0m0.144s
     結論:很明顯讀的數度提高了。

4.   NOOP(電梯式調度程序)(elevator=noop):

特點:

不做任何調優,主要用於節省CPU資源。

Noop調度算法指的是當請求被存儲到隊列並交由I/O子系統處理時由磁盤硬件對其進行優化。該算法一般只對一些特定的硬件(例如RAM disk和TCQ disk等)。

Noop對於I/O不那么操心,對所有的I/O請求都用FIFO隊列形式處理,默認認為 I/O不會存在性能問題。這也使得CPU也不用那么操心

三)、 I/O調度算法使用建議

1.   Deadline I/O scheduler

在這個中 deadline 調度算法通過降低性能而獲得更短的等待時間,它使用輪詢的調度器,簡潔小巧,提供了最小的讀取延遲

和尚佳的吞吐量,特別適合於讀取較多的環境(比如數據庫,Oracle 10G 之類).

2.   Anticipatory I/O scheduler

anticipatory 算法通過增加等待時間來獲得更高的性能,假設一個塊設備只有一個物理查找磁頭(例如一個單獨的SATA硬盤),將多個隨機的小寫入流合並成一個大寫入流(相當於給隨機讀寫變順序讀寫), 使用這個原理來使用讀取寫入的延時換取最大的讀取寫入吞吐量.適用於大多數環境,特別是讀取寫入較多的環境,比如文件服務器,Web 應用,App等應用我們可以采納as調度.后面我會教大家怎么調這個的合並的等待時間。

3.   CFQ I/O scheduler

這個是 對所有因素也都做了折中而盡量獲得公平性,使用QoS策略為所有任務分配等量的帶寬,避免進程被餓死並實現了較低的延遲,可以認為是上述兩種調度器的折中.適用於有大量進程的多用戶系統。

四、 sysctl.conf參數的調整

一:優化TIME_WAIT
tcp連接斷開后,會以TIME_WAIT狀態保留一定的時候,然后才會釋放端口。當並發很多的時候,就會產生大量的TIME_WAIT,無法及時斷開,占用大量的端口和服務器資源。優化TCP的內核參數,及時處理TIME_WAIT
 
  1. 查看TIME_WAIT的數量 
  2. # netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 
  3.  
  4. 優化 
  5. # vim /etc/sysctl.conf 
  6. net.ipv4.tcp_syncookies = 1     //開戶SYN Cookies,當出現等待隊列溢出時,啟用cookies來處理,防范少量SYN攻擊 
  7. net.ipv4.tcp_tw_reuse = 1       //開戶重用,允許TIME_WAIT sockets重新用於新的TCP連接 
  8. net.ipv4.tcp_tw_recycle = 1     //開戶TCP連接中TIME_WAIT sockets的快速回收 
  9. net.ipv4.tcp_fin_timeout = 30       //修改TIMEOUT的時間 
  10.  
  11. net.ipv4.tcp_keepalive_time = 1200      //當keepalive起作用的時候,TCP發送keepalive消息的頻度,缺少是2小時,改為20分鍾 
  12. net.ipv4.ip_local_port_range = 10000 65000      //修改端口范圍,允許更多的連接 
  13. net.ipv4.tcp_max_syn_backlog = 8192     //SYN隊列的長度,默認為1024,加大隊列長度為8192,以容納更多等待連接的網絡連接 
  14. net.ipv4.tcp_max_tw_buckets = 5000      //系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT將立即被清除 
  15. net.core.netdev_max_backlog = 32768     //每個網絡接口接收數據包的速率比內核處理這些包的速率快時,允許送到隊列的數據包的最大數目。 
  16. net.core.somaxconn = 32768      //web應用中listen函數的backlog默認會給我們內核參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG默認為511,所以有必要調整這個值。 
  17. net.ipv4.tcp_wmem = 8192 436600 873200  //TCP寫buffer 
  18. net.ipv4.tcp_rmem  = 32768 436600 873200    //TCP讀buffer 
  19. net.inet.tcp.sendspace=65536  //最大的待發送TCP數據緩沖區空間 
  20. net.inet.tcp.recvspace=65536  //最大的接受TCP緩沖區空間 
  21. net.inet.udp.sendspace=65535  //最大的接受UDP緩沖區大小 
  22. net.inet.udp.maxdgram=65535  //最大的發送UDP數據緩沖區大小 
  23. net.local.stream.sendspace=65535  //本地套接字連接的數據發送空間 
  24.  
  25. 最后使用命令sysctl讓其生效 
  26. # sysctl -p 

五、 網絡調優

雙網卡綁定以提高帶寬
 
  1. 1.安裝軟件  
  2. apt-get install ifenslave 
  3.   
  4. 2.修改配置文件  
  5. /etc/network/interfaces  
  6. auto lo  
  7. iface lo inet loopback 
  8. iface eth0 inet dhcp  
  9. iface eth1 inet dhcp 
  10. auto bond0  
  11. iface bond0 inet static  
  12. address 64.0.177.20  
  13. netmask 255.255.255.0  
  14. gateway 64.0.177.254  
  15. up ifenslave bond0 eth0 eth1  
  16. down ifenslave -d bond0 eth0 eth1 
  17.   
  18. 3.加載模塊  
  19. vi /etc/modules  
  20. bonding 
 
 
 

六 nginx調優

一)、配置文件調優

 
  1. worker_processes 8;  //nginx進程數,建議按照cpu數目來指定,一般為它的倍數。   
  2. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;  //為每個進程分配cpu,上例中將8個進程分配到8個cpu,當然可以寫多個,或者將一個進程分配到多個cpu。 
  3.  
  4. worker_rlimit_nofile 102400;  //這個指令是指當一個nginx進程打開的最多文件描述符數目,理論值應該是最多打開文件數(ulimit -n)與nginx進程數相除,但是nginx分配請求並不是那么均勻,所以最好與ulimit -n的值保持一致。 
  5.  
  6. use epoll;   //使用epoll的I/O模型,這個不用說了吧.                                     
  7. worker_connections 102400;   //每個進程允許的最多連接數,理論上每台nginx服務器的最大連接數為worker_processes*worker_connections。 
  8. keepalive_timeout 60;  //keepalive超時時間。  
  9.  
  10. limit_rate_after 2m; 
  11.                                                 //限制速度,當用戶請求的文件超過2M的時候,開始限速,限制為128k 
  12. limit_rate  128k; 

二)、安裝插件調優

安裝Google插件,以實現加速內存的分配和回收
 
TCMallocde的全稱為Thread-Caching Malloc,是谷歌開發的開源工具google-perftools中得一個成員。與標准的glibc庫的Malloc相比,TCMalloc庫在內存分配效率和速度上要高很多,這在很大程度上提高了服務器在高並發情況下的性能,從而降低了系統的負載。
 
要安裝TCMalloc庫,需要安裝libunwind(32位操作系統不需要安裝)和google-perftools兩個軟件包,libunwind庫位基於64位cpu和操作系統的程序提供了基本函數調用鏈和函數調用寄存器功能。
 
1、安裝libunwind庫
 
可以從http://mirror.yongbok.net/nongnu/libunwind/ 下載相應的版本
 
下載地址:http://mirror.yongbok.net/nongnu/libunwind/libunwind-0.99.tar.gz
 
 
  1. # tar xnf libunwind-0.99.tar.gz 
  2.  
  3. # cd libunwind-0.99/ 
  4.  
  5. CFLAGS=-fPIC ./configure 
  6.  
  7. # make CFLAGS=-fPIC 
  8.  
  9. # make CFLAGS=-fPIC install 
 
2、安裝google-perftools
 
可從http://code.google.com/p/gperftools/ 下載相應的版本。
 
下載地址:http://gperftools.googlecode.com/files/google-perftools-1.9.tar.gz  最新版:http://gperftools.googlecode.com/files/gperftools-2.0.tar.gz 這里用的google-perftools-1.9.tar.gz
 
 
  1. # tar xvf google-perftools-1.9.tar.gz 
  2.  
  3. # cd google-perftools-1.9/ 
  4.  
  5. # ./configure 
  6.  
  7. # make && make install 
  8.  
  9. # echo "/usr/local/lib“ >> /etc/ld.so.conf.d/usr_local_lib.conf 
  10.  
  11. # ldconfig 
 
至此google-perftools安裝完成
 
3、重新編譯nginx
 
為了使nginx支持google-perftools,需要在安裝過程中添加”--with-google_perftools_module"選項重新編譯nginx。安裝如下:
 
  1. # ./configure --with-google_perftools_module --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/webserver/nginx 
  2. # make 
  3. # make install 
 
到這里nginx安裝完成
 
4、為google-perftools添加線程目錄
 
創建一個線程目錄,這里將文件放在/tmp/tcmalloc下。
 
 
  1. # mkdir /tmp/tcmalloc 
  2.  
  3. # chmod 0777 /tmp/tcmalloc 
 
5、修改nginx主配置文件
 
 
  1. 修改nginx.conf文件,在pid這行的下面添加如下代碼: 
  2.  
  3. google_perftools_profiles    /tmp/tcmalloc; 
 
接着,重啟nginx即可完成google-perftools的加載。
 
6、驗證運行狀態
 
 
  1. 為了驗證google-perftools已經正常加載,可通過如下命令查看: 
  2.  
  3. lsof -n | grep tcmalloc 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM