2011年3月31日 星期四

AP@Linux Disk IO 效能調校

針對本次的測試說明如下:
1.使用Bryan提供的測試程式(XGW.STK.K1,以下簡稱XGW)(內含56000多筆的資料)來進行測試,
   壓力測試程式在Windows 7(小黑nb,172.16.43.144)上執行
   同時也執行了模擬後端主機(dbs)接收的的程式
2.本次的XGW在3台機器上分別進行驗證,不過主要以驗證PC -1為主,硬體與作業系統規格如下

PC - 1kernel2.6.18-164.el5PAE
distributionRHEL5.4(172.16.43.99)
memoryMemTotal: 3916364 kB
cpuIntel(R) Core(TM)2 Quad CPU Q8400 @ 2.66GHz
disk500G 7200rpm(single)
PC - 2kernel2.6.18-92.el5
distributionRHEL5.2(172.16.43.171)
memoryMemTotal: 3107452 kB
cpuIntel(R) Pentium(R) Dual CPU E2140 @ 1.60GHz
disk160G 7200rpm(single)
PC - 3kernel2.6.18-194.el5
distributionCentOS5.5(172.16.43.170)
memoryMemTotal: 16411680 kB
cpuIntel(R) Xeon(R) CPU E5506 @ 2.13GHz(quard core * 2)
disk7200 rpm(raid-5, 146G*3)
3.本次測試以上3台都同樣在172.16.43.0/24 網段上進行,所以應該不會有網路的堵塞問題 曾經試過對172.16.53.20進行測試,都會莫名其妙增加很多時間,推測,可能是172.16.53.0/24上有人大量丟封包 測試方法說明: 1.先在PC - 1進行完整的測試 (1)以作業系統剛安裝好的參數,先進行一次測試,當成參考值 (2)針對Block Device的各項參數進行調整(依開發人員描述,主要為disk io所影響) (3)測試時,以相同的壓測步驟與XGW初始化環境一一進行驗證 (4)測試期間收集送完56000筆的時間,XGW主機的整體cpu使用狀況,單一支XGW使用cpu狀況,系統wait io的狀況進行資料收集 2.從1.所測試出來的較佳幾個系統調整狀況,在PC-2及PC-3上面也進行驗證 (1)在較老的機器上(PC-2)進行驗證 (2)在較佳的機器上(PC-3, 有做raid-5)進行驗證 (3)以上2個再跟PC-1進行對照驗證 3.在PC-1上安裝ramdisk同時驗證效能 測試結果如下: 黃色那一行是作業系統出廠的預設參數所測出來的結果(nr_requests 預設為128,預設為cfq) 土色那一行是調整後,得到較佳數據的2個結果, wa(wait for disk IO)的狀況有呈現較好的狀況,數據也反應在time欄位上 紫色是依據PC-1的結果,也同樣在PC-2 , PC-3上面驗證的結果
HDDnr_requestsepisodetime(sec)min CPU idle%avg CPU idle%XGW useage%wa%(inc. in idle)PC2 timePC3 time
cfq640c0101092173
1280c02020921574468.0945.6619.216882
5120c01020c1121
10240c01030c185
20480c01030928611566
40960c01010c1933563.2656.0618.6511665
anticipatory640b0101012159
1280b0202012153
20480b01030128511471
40960b01010c1775572.8862.811.0411569
deadline640a0101012171
1280a0202012159
20480a0103012101121121
noop640d01010b1163
1280d02020b1171
20480d01030b1140181231
ramdisknr_requestsepisodetime diff
cfq128-79
1024-79
2048-76
anticipatory128-79
結論與建議 1. 從結果可以得知 (1)nr_requests(queue length)增加,對系統disk io的效能確實有效果(nr_requests有助減少seek time) (2)ramdisk因為沒有磁頭,沒有seek time的issue,然而效能本身己經很好 (3)raid-5 (pc-3)的效能,在經過調整後,在本案的情境下,可以比ramdisk更好 2. 建議 (1)依以下調整參數(建議先使用"cfq" , nr_requests=4096) 在/etc/rc.local上面新增一筆 echo 4096 > /sys/block/[disk device]/queue/nr_requests 上面[disk device]請置換上XGW所安裝與執行的device上,例如sda(如果我記得沒錯,GW15跟16應該都是sda) 重新開機後啟動XGW 注意,nr_requests的增加,在系統異常時,愈有機會發生資料未完全寫入硬碟裡 異常發生時,建議確認XGW是否有漏寫資料,如果有發生,需要實際操作補送與寫入的作業(XGW跟後台間回報序號倒回重補的作業) (2)使用raid-5 從 PC-3的結果可以看出raid-5的IO throughput本身就己經很優秀,再經調整後, 已可以比PC-1的預設情境好上很多 (3)使用ramdisk(非SSD) ramdisk本身是效能己經很好,不過因為他對nr_requests的設定是沒幫助的,不過效能穩定性高上許多 再者,坊間對Ramdisk己可以支援raid,所以加乘使用,效果應該會更佳 以上的建議,請事先驗證過後,再行開放, 若有發生效率沒有明顯改善時,請確認壓測過程是否有網路的干擾因素(如前所述,可能會有網路堵塞或者效率不佳的因素) 補充說明: 1. file fragmentation 上次在客戶XGW上收集回來的資料,有對於XGW flush機制換版前後進行log檔結構分析 在換版前(2011/03/17)的每個log(大檔,尤其是Ord,Rpt,RptOth及Sync log等),其fragmentation(檔案的破碎程度) 大概都在100~300以上 在換上新版後(2011/03/24)每個log(尤其是剛才那3個檔),其fragmentation都降到大概在10之間 該次換版效能的改善從中可以發現一斑 檔案的fragment會嚴重影響IO的效能, 2. elevator (1)noop 不使用任何elevator機制 (2)deadline 使用one-way的作業,在執行disk read或write時會去merge目前queue裡的 requests(有助降低seek time),對於"read"的作業更甚於"write",為了避免resource starvation,系統提供了許多的expire機制.這個elevator配合TQC及效率較佳的Disk,很適合拿來做資料庫系統 (3)anticipatory 在kernel 2.6版之前,這個elevator是預設的.在執行disk read或write時會去merge目前queue裡的 requests(有助降低seek time),read或write作業是分批作業進行.在進行資料讀取時,會多預讀一些資料起來,系統的預期是,可能接下來的動作是要再繼續往下讀一些,如此在某些情境下,可以減少磁頭的移動.或許針對某些資料庫可以提供很好的效率(在某些特定條件下) 前面在的測試,在某些情況下,anticipatory反而比cfq好,或許跟XGW.STK.K1在這次的案例裡,幾乎只有write動作有關,所以系統做request merge的效率很好 (4)cfq Complete Fair Queueing Scheduler, 這是最中庸的elevator,因為它是round robin的處理作業,針對各process提供相同的device IO requests數量.這個elevator在kernel 2.6之後,就是預設的.提供read and write的requests merging.這種elevator適用在多使用者的環境下(筆者另外解讀,在multi-process或multi-file-IO下也蠻適合的). 本例在XGW.STK.K1是multi-thread會同時開啟許多個檔案進行write作業,所以cfq的作業在預計的nr_requests=128或許效果沒那麼好,可是在nr_requests愈來愈大的情況下,merging效果愈好,約在2048~4096就有很好的成效 本次的測試,覺得noop不好,因為系統沒那個條件不做elevator(有人建議,若disk device有很好的request 管理機制,可以用noop);deadline,為因read優先於write ,或許因為這樣測不出好數據(實際上的XGW.STK.K1應該有read也有write );anticipatory或許因為XGW.STK.K1在本例中幾乎都只有write,所以有好的數據;所以筆者覺得cfq配合高的nr_requests較保險,也較能預期對實際狀況(有read也有write)下能有不錯的效能提升 3.system call的分析 一般系統調完了,大概也知道程式本身的一些特性,其實程式本身也可以進行分析,提供給開發人員,或者也能夠對系統效率有些改善 nr_requests=4096配合anticipatory [root@HTS099 queue]# ps -ef | grep XG root 5909 1 17 21:12 ? 00:00:02 ./XGateway -d root 5937 4663 0 21:12 pts/2 00:00:00 grep XG [root@HTS099 queue]# strace -p 5909 -c Process 5909 attached - interrupt to quit Process 5909 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 73.46 0.610550 0 5683975 write 19.98 0.166032 1 112149 1 poll 1.59 0.013212 0 1858339 gettimeofday 1.37 0.011416 0 836665 lseek 1.12 0.009291 107 87 close 0.71 0.005923 0 154532 5137 read 0.59 0.004914 0 56046 send 0.58 0.004855 0 337399 time 0.49 0.004064 0 112092 56047 recv 0.06 0.000508 3 185 25 open 0.02 0.000144 2 90 munmap 0.02 0.000136 3 53 53 connect 0.00 0.000036 0 542 brk 0.00 0.000017 0 53 socket 0.00 0.000013 0 152 getsockopt 0.00 0.000000 0 10 8 mkdir 0.00 0.000000 0 1 1 sigreturn 0.00 0.000000 0 1 mremap 0.00 0.000000 0 91 mmap2 0.00 0.000000 0 1 madvise 0.00 0.000000 0 110 fcntl64 0.00 0.000000 0 2 futex 0.00 0.000000 0 2 tgkill 0.00 0.000000 0 4 2 accept 0.00 0.000000 0 4 getsockname 0.00 0.000000 0 4 getpeername 0.00 0.000000 0 51 setsockopt ------ ----------- ----------- --------- --------- ---------------- 100.00 0.831111 9152640 61274 total nr_requests=4096配合cfq [root@HTS099 queue]# strace -p 5552 -c Process 5552 attached - interrupt to quit Process 5552 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 87.57 1.342217 0 5684176 write 8.93 0.136850 1 112181 1 poll 0.85 0.012984 0 1858717 gettimeofday 0.71 0.010894 0 836729 lseek 0.58 0.008904 95 94 close 0.42 0.006392 0 153624 4182 read 0.35 0.005406 0 56046 send 0.33 0.005123 0 337500 time 0.21 0.003238 0 112092 56047 recv 0.02 0.000311 2 189 29 open 0.01 0.000132 2 60 60 connect 0.01 0.000099 50 2 futex 0.00 0.000075 1 88 munmap 0.00 0.000026 0 524 brk 0.00 0.000020 0 60 socket 0.00 0.000012 0 167 getsockopt 0.00 0.000000 0 10 8 mkdir 0.00 0.000000 0 1 1 sigreturn 0.00 0.000000 0 1 mremap 0.00 0.000000 0 91 mmap2 0.00 0.000000 0 124 fcntl64 0.00 0.000000 0 2 tgkill 0.00 0.000000 0 4 2 accept 0.00 0.000000 0 4 getsockname 0.00 0.000000 0 4 getpeername 0.00 0.000000 0 57 setsockopt ------ ----------- ----------- --------- --------- ---------------- 100.00 1.532683 9152547 60330 total ramdisk配合anticipatory [root@HTS099 queue]# ps -ef | grep XG root 6260 1 7 21:18 ? 00:00:01 ./XGateway -d root 6301 4663 0 21:18 pts/2 00:00:00 grep XG [root@HTS099 queue]# strace -p 6260 -c Process 6260 attached - interrupt to quit Process 6260 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 42.12 0.495718 3 154737 5362 read 38.00 0.447302 0 5683978 write 15.87 0.186833 2 112153 1 poll 1.20 0.014139 0 1858164 gettimeofday 0.88 0.010348 0 836666 lseek 0.74 0.008721 101 86 close 0.48 0.005594 0 56046 send 0.41 0.004834 0 337403 time 0.28 0.003326 0 112092 56047 recv 0.01 0.000118 1 186 26 open 0.00 0.000033 1 53 53 connect 0.00 0.000022 0 155 getsockopt 0.00 0.000018 0 53 socket 0.00 0.000009 0 523 brk 0.00 0.000008 0 91 mmap2 0.00 0.000004 0 110 fcntl64 0.00 0.000000 0 10 8 mkdir 0.00 0.000000 0 88 munmap 0.00 0.000000 0 1 1 sigreturn 0.00 0.000000 0 1 mremap 0.00 0.000000 0 4 futex 0.00 0.000000 0 2 tgkill 0.00 0.000000 0 4 2 accept 0.00 0.000000 0 4 getsockname 0.00 0.000000 0 4 getpeername 0.00 0.000000 0 50 setsockopt ------ ----------- ----------- --------- --------- ---------------- 100.00 1.177027 9152664 61500 total ramdisk配合cfq [root@HTS099 queue]# ps -ef | grep XG root 6608 1 13 21:24 ? 00:00:01 ./XGateway -d root 6638 4663 0 21:24 pts/2 00:00:00 grep XG [root@HTS099 queue]# strace -p 6608 -c Process 6608 attached - interrupt to quit Process 6608 detached % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 41.36 0.354313 2 153443 4036 read 32.29 0.276602 0 5683977 write 20.06 0.171828 2 112155 1 poll 1.79 0.015369 0 836666 lseek 1.69 0.014454 0 1858390 gettimeofday 1.04 0.008922 104 86 close 0.68 0.005864 0 56046 send 0.58 0.004947 0 337403 time 0.38 0.003217 0 112092 56047 recv 0.09 0.000764 4 186 26 open 0.01 0.000094 1 88 munmap 0.01 0.000094 2 53 53 connect 0.00 0.000035 0 524 brk 0.00 0.000027 0 155 getsockopt 0.00 0.000012 0 91 mmap2 0.00 0.000011 0 110 fcntl64 0.00 0.000000 0 10 8 mkdir 0.00 0.000000 0 1 1 sigreturn 0.00 0.000000 0 1 mremap 0.00 0.000000 0 1 futex 0.00 0.000000 0 1 tgkill 0.00 0.000000 0 53 socket 0.00 0.000000 0 4 2 accept 0.00 0.000000 0 4 getsockname 0.00 0.000000 0 4 getpeername 0.00 0.000000 0 50 setsockopt ------ ----------- ----------- --------- --------- ---------------- 100.00 0.856553 9151594 60174 total 補充指令: sysctl -w vm.drop_caches=3 filefrage -v /path to file cat /proc/[pid]/status (see "thread"), man 5 proc cat /proc/#/status cat /proc/interrupt cat /proc/partitions (major:minor) lspci -v查出硬體與IRQ SATA: smartctl -a /dev/sda查詢硬碟資訊 smartctl -a /dev/sda -d ata" dmesg | more 也可以查出一些硬體資訊

     監控目前HDD有在IO作業的PROCESS是哪一支
     while true; do date; ps auxf | awk '{if($8=="D") print $0;}'; sleep 1; done
     sleep 1若改usleep 300000, 則0.3秒監控一次,可以更快反應
     其中,可以取得PID , 進一步透過/proc/PID/io 來找出相對應的read/write統計資料
       rchar => This is the total reads caused by the process in bytes. This includes bytes read from the disk or from console
              wchar => The same as rchar but it accounts for bytes written instead of read
              read_bytes => Actual number of bytes read from the storage
              write_bytes => Actual bytes written to the storage

              Here's the script that shows you the top 5 processes which are reading data from disk:
           grep read_bytes /proc/[0-9]*/io | sort -nrk2 | head -5

             writing data, execute the following:
           grep write_bytes /proc/[0-9]*/io | sort -nrk2 | head -5

             There's also an utility called "iotop" which does the same thing in real time and gives you better top-like output
           yum install iotop

     /proc/PID/status, 則是方面的統計內容

參考資料:
http://yoshinorimatsunobu.blogspot.com/2009/04/linux-io-scheduler-queue-size-and.html

http://www.softpanorama.org/Commercial_linuxes/performance_tuning.shtml

沒有留言:

張貼留言

文章分類