天天看點

Nginx下載下傳服務生産伺服器調優

一、記憶體調優

核心關于記憶體的選項都在/proc/sys/vm目錄下.

1.pdflush,用于回寫記憶體中的髒資料到硬碟。可以通過 /proc/sys/vm/vm.dirty_background_ratio調整。

首先檢視這個值預設應該是10。

這個值是一個閥值,說明如果記憶體中的髒資料達到系統總記憶體的10%時,那麼pdflush程序就會啟動,将記憶體中的髒資料寫回硬碟.這個值可适當調高.可獲得更快的寫入速度.

2.swappiness選項

swappiness表示使用swap分區的使用程度,可以适當調整swappiness=0的時候表示盡可能使用實體記憶體swap空間.swappiness=100積極使用swap.

3.dirty_ratio

dirty_ratio的值是資料寫進記憶體的閥值,20%是指當系統記憶體已經緩存了20%的資料以後,就不再往記憶體中緩存資料了.

二、磁盤I/O調優

Linux磁盤I/O調優

1.   磁盤調優目錄:/sys/block

2.   磁盤調優均是調核心參數,要求安裝kernel-doc包,

3.   調預先讀請求量(預設為128kb)

# blockdev --getra /dev/sda 

# blockdev --setra 512 /dev/sda  

實際修改/sys/block/sda/queue/read_ahead_kb=256kb;如果讀情況多則将此參數調大一點,如寫請求讀,則将此參數調小一點

4.   調磁盤隊列:隊列長則處理快,提升硬碟的吞吐量,但會消耗更大的記憶體

Queue length:/sys/block/sda/queue/nr_requests   

# cat /sys/block/sda/queue/nr_requests  

512  

#預設128,沒有機關

1.   CFQ(完全公平排隊I/O排程程式)(elevator=cfq)

特點:

  這是預設算法,對于通用伺服器來說通常是最好的選擇。它試圖均勻地分布對I/O帶寬的通路。是deadline和anticipatory排程器的折中方案.

  CFQ對于多媒體應用(video,audio)和桌面系統是最好的選擇.

  CFQ賦予I/O請求一個優先級,而I/O優先級請求獨立于程序優先級,高優先級的程序的讀寫不能自動地繼承高的I/O優先級.

  CFQ基于64位的隊列請求,使用的輪詢的方法處理隊列.

調優參數:

#  /sys/block/sda/queue/iosched/queued:輪詢時每次處理的最大請求數 

#  /sys/block/sda/queue/iosched/quantum:每隔多少個請求數做一次輪詢 

cfq調優工具ionice

ionice可以更改任務的類型和優先級,不過隻有cfq排程程式可以用ionice.

有三個例子說明ionice的功能:

 采用cfq的實時排程(實時排程:c1),優先級為7(數字越低優先級越高)

# ionice -c1 -n7 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 

 采用預設的磁盤I/O排程(輪詢排程:c2),優先級為3

# ionice -c2 -n3 -ptime dd if=/dev/sda1 f=/tmp/test bs=2M count=300& 

 采用空閑的磁盤排程(idle排程:c3),優先級為0

# 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等)是最好的選擇.

調優:

# echo deadline >/sys/block/sda/queue/scheduler 

# more /sys/block/sda/queue/scheduler 

 noop anticipatory [deadline] cfq 

# ls /sys/block/sda/queue/iosched/ 

fifo_batch  front_merges  read_expire  write_expire  writes_starved 

# cat iosched/read_expire  

500    #預設500ms 

# cat iosched/write_expire 

5000   #預設5000ms 

# cat iosched/front_merges 

1        

#預設為1,請求整合,新的請求和之前請求有關聯,則優先處理該請求,對IO性能沒有影響,但優化了磁盤處理。

3.   Anticipatory(預料I/O排程程式)(elevator=as):

特點:

  預想排程算法。優化完成率,改善讀請求。

  本質上與Deadline一樣,但在最後一次讀操作後,要等待6ms才能繼續進行對其它I/O請求進行排程。可以從應用程式中預訂一個新的讀請求,改進讀操作的執行,但以一些寫操作為代價,它會在每個6ms中插入新的I/O操作,而會将一些小寫入流合并成一個大寫入流,用寫入延時換取最大的寫入吞吐量。

  AS适合于寫入較多的環境,比如檔案伺服器;适合大檔案處理,适合web server等。AS對資料庫環境表現很差。

# echo "anticipatory">/sys/block/sda/queue/scheduler 

# more iosched/antic_expire 

6       #預設為6秒 

# more /sys/block/sda/queue/iosched/read_expire 

125      #讀的最大隊列時間 

# more /sys/block/sda/queue/iosched/write_expire 

250      #寫的最大隊列時間 

注:測試時一定要清空緩存 

# free –m    #檢視緩存 

             total    used   free   shared    buffers     cached 

Mem:        4054    506   3548   0        140        256 

-/+ buffers/cache:      108   3945 

Swap:         8189   0    8189 

測試:

# sysctl -w vm.drop_caches=3   #清空緩存 

# rpm –ivh elevator-test-0.1-3.i386.rpm  #安裝測試軟體 

# dd if=/dev/urandom of=/root/bigfile bs=1M count=100 

# watch –n 1 ls –lh /root/bigfile   #每隔一秒查寫入bigfile的資料量 

 預設排程類型為cfq下,測試讀資料速度(測試時要求清空緩存) 

# cat /sys/block/sda/queue/scheduler 

noop anticipatory deadline [cfq] 

et_start reader /root/bigfile 

Launching 

Reading 25600 pages 

Read 20000 pages 

real    0m1.552s 

user    0m0.011s 

sys     0m0.147s 

 将排程類型改為anticipatory,測試讀資料速度(測試時要求清空緩存) 

# echo “anticipatory”>/sys/block/sda/queue/scheduler 

noop anticipatory deadline [anticipatory] 

# cat /sys/block/sda/queue/iosched/antic_expire 

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

檢視TIME_WAIT的數量 

# netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’ 

優化 

# vim /etc/sysctl.conf 

net.ipv4.tcp_syncookies = 1     //開戶SYN Cookies,當出現等待隊列溢出時,啟用cookies來處理,防範少量SYN攻擊 

net.ipv4.tcp_tw_reuse = 1       //開戶重用,允許TIME_WAIT sockets重新用于新的TCP連接配接 

net.ipv4.tcp_tw_recycle = 1     //開戶TCP連接配接中TIME_WAIT sockets的快速回收 

net.ipv4.tcp_fin_timeout = 30       //修改TIMEOUT的時間 

net.ipv4.tcp_keepalive_time = 1200      //當keepalive起作用的時候,TCP發送keepalive消息的頻度,缺少是2小時,改為20分鐘 

net.ipv4.ip_local_port_range = 10000 65000      //修改端口範圍,允許更多的連接配接 

net.ipv4.tcp_max_syn_backlog = 8192     //SYN隊列的長度,預設為1024,加大隊列長度為8192,以容納更多等待連接配接的網絡連接配接 

net.ipv4.tcp_max_tw_buckets = 5000      //系統同時保持TIME_WAIT的最大數量,如果超過這個數字,TIME_WAIT将立即被清除 

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

net.core.somaxconn = 32768      //web應用中listen函數的backlog預設會給我們核心參數的net.core.somaxconn限制到128,而nginx定義的NGX_LISTEN_BACKLOG預設為511,是以有必要調整這個值。 

net.ipv4.tcp_wmem = 8192 436600 873200  //TCP寫buffer 

net.ipv4.tcp_rmem  = 32768 436600 873200    //TCP讀buffer 

net.inet.tcp.sendspace=65536  //最大的待發送TCP資料緩沖區空間 

net.inet.tcp.recvspace=65536  //最大的接受TCP緩沖區空間 

net.inet.udp.sendspace=65535  //最大的接受UDP緩沖區大小 

net.inet.udp.maxdgram=65535  //最大的發送UDP資料緩沖區大小 

net.local.stream.sendspace=65535  //本地套接字連接配接的資料發送空間 

最後使用指令sysctl讓其生效 

# sysctl -p 

五、 網絡調優

雙網卡綁定以提高帶寬

1.安裝軟體  

apt-get install ifenslave 

2.修改配置檔案  

/etc/network/interfaces  

auto lo  

iface lo inet loopback 

iface eth0 inet dhcp  

iface eth1 inet dhcp 

auto bond0  

iface bond0 inet static  

address 64.0.177.20  

netmask 255.255.255.0  

gateway 64.0.177.254  

up ifenslave bond0 eth0 eth1  

down ifenslave -d bond0 eth0 eth1 

3.加載子產品  

vi /etc/modules  

bonding 

六 nginx調優

worker_processes 8;  //nginx程序數,建議按照cpu數目來指定,一般為它的倍數。   

worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000 01000000 10000000;  //為每個程序配置設定cpu,上例中将8個程序配置設定到8個cpu,當然可以寫多個,或者将一個程序配置設定到多個cpu。 

worker_rlimit_nofile 102400;  //這個指令是指當一個nginx程序打開的最多檔案描述符數目,理論值應該是最多打開檔案數(ulimit -n)與nginx程序數相除,但是nginx配置設定請求并不是那麼均勻,是以最好與ulimit -n的值保持一緻。 

use epoll;   //使用epoll的I/O模型,這個不用說了吧.                                     

worker_connections 102400;   //每個程序允許的最多連接配接數,理論上每台nginx伺服器的最大連接配接數為worker_processes*worker_connections。 

keepalive_timeout 60;  //keepalive逾時時間。  

limit_rate_after 2m; 

                                                //限制速度,當使用者請求的檔案超過2M的時候,開始限速,限制為128k 

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

# tar xnf libunwind-0.99.tar.gz 

# cd libunwind-0.99/ 

# CFLAGS=-fPIC ./configure 

# make CFLAGS=-fPIC 

# 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

# tar xvf google-perftools-1.9.tar.gz 

# cd google-perftools-1.9/ 

# ./configure 

# make && make install 

# echo "/usr/local/lib“ >> /etc/ld.so.conf.d/usr_local_lib.conf 

# ldconfig 

至此google-perftools安裝完成

3、重新編譯nginx

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

# ./configure --with-google_perftools_module --with-http_stub_status_module --with-http_ssl_module --prefix=/usr/local/webserver/nginx 

# make 

# make install 

到這裡nginx安裝完成

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

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

# mkdir /tmp/tcmalloc 

# chmod 0777 /tmp/tcmalloc 

5、修改nginx主配置檔案

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

google_perftools_profiles    /tmp/tcmalloc; 

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

6、驗證運作狀态

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

lsof -n | grep tcmalloc 

繼續閱讀