linux調度算法RHCA
UNIT 6 Compensating for Physical Disk Characteristics
www.2cto.com
學習目標:
A. 了解影響磁盤IO的物理因素
B. 應用隊列技術調整IO調度
6.1 Physical factors affect disk IO 影響磁盤IO的物理因素
A. 存儲密度:
區域恆定角速度(ZCAV)原理:現代硬盤都采用的是等密度存儲,因此每個磁 道上的扇區數外圈要比內圈多,從內圈到外圈分為若干區域,每個區域內角速度保持一定,也就是ZCAV方式
a. 外圈磁道比內圈有更多的線性存儲區域
b.在轉速一定的情況下,每秒鐘讀取的數據外圈磁道要比內圈磁道多。
c. 外圈的分區號比內圈要低(因為分區是從外圈開始的,0磁道0扇區)
B.總線連接
a. Linux 內核的處理帶寬為10Gib/s
C. 電子-機械定位
a. 轉速延時
b. 尋道時間
PS: www.2cto.com
硬盤結構
A. 磁盤物理組成: 通常由一個或多個圓形盤片組成,每個盤片都是兩面存儲的,通過機械臂上的磁頭進行數據讀寫操作,主要由盤片、機械手臂、磁頭與主軸馬達所組成。
B. 磁盤邏輯組成:磁頭(header)柱面(cylinder)磁道(track)扇區(sector)
磁頭 : 磁頭固定在可移動的機械臂上,用於讀寫數據。現代硬盤都是雙面可讀寫,因此磁頭數量等於盤片數的 2 倍。磁頭數最大值為 255 (8 個二進制位)。
磁道 : 每個盤面都有 n 個同心圓組成,每個同心圓稱之為一個磁道。由外向內分為 0 磁道到 n 磁道。
柱面 : n 個盤面的相同磁道 (位置相同) 共同組成一個柱面。柱面數最大為 1023 (10 個二進制位)。
扇區 : 從磁盤中心向外畫直線,可以將磁道劃分為若干個弧段。每個磁道上一個弧段被稱之為一個扇區。扇區是硬盤的最小組成單元,通常是 512 字節。磁道上的扇區數最大為 63 (6 個二進制位)。
硬盤的存儲容量公式:
存儲容量 = 磁頭數 × 磁道(柱面)數 × 每道扇區數 × 每扇區字節數
3D 尋址參數:
×× 磁道(柱面),×× 磁頭,×× 扇區
Track=sector*n
Linux 的分區是按柱面來劃分的。
引導區信息:
硬盤的第一個扇區被稱之為 Boot Sector。由 MBR (MasterBoot Record)、DPT (Disk Partition Table) 和 Boot Record ID 三部分組成。
•MBR 又稱作主引導記錄,占用 Boot Sector 的前 446 個字節(0 ~ 0x1BD)。存放系統主引導程序,負責從活動分區中裝載並運行系統引導程序。
•DPT 即主分區表,占用 64 個字節 (0x1BE ~ 0x1FD),記錄了磁盤的基本分區信息。主分區表分為四個分區項,每項 16 字節,分別記錄了每個主分區的信息 (因此最多可以有 4 個主分區)。通常分完三個主分區後,剩下的磁盤空間全部分給擴展分區,然後在擴展分區裡再分區(IDE:5~59分區,SATA:5~15分區);如果不這樣的話,分完4個分區後剩下的空間不能再使用。
•Boot Record ID 即引導區標記,占用兩個字節 (0x1FE ~ 0x1FF)。對於合法引導區,它等於 0xAA55,這是判別引導區是否合法的標志。
6.2 Disk storage density 磁盤的存儲密度
A 使用bonnie++測試磁盤及文件系統的性能
yum –y install bonnie++
rpm –qd bonnie++
useradd zcav; usermod –aG disk zcav
for drive in sdb sdc sdd sde;
do
su –c “zcav –c1 /dev/$drive” zcav >> /tmp/zcavdata.$drive
done
Gnuplot 指令:
set term png size 600,300 notransparent 1w 2
set output ‘/tmp/rh442_zcav.png’
set xlabel ‘Block’;set xrange [0:]
set ylabel ‘Disk thronghput (KiB/s)’; set yrange [0:]
set border 3; set xtics nomirror; set ytics nomirror
set label ‘ZCAV steppings’ at 5000,50000
plot ‘/tmp/zcav.sdd’ u 1:2 t ’80 GB HDD’ with lines , \
‘/tmp/zcav.sdb’ u 1:2 t ’16 GiB SSD’ with lines , \
‘/tmp/zcav.sde’ u 1:2 t ’64 GB USB flash’ with lines , \
‘/tmp/zcav.sdc’ u 1:2 t ‘8 GiB SD card’ with lines
B. bonnie++工具介紹
a、簡介
Bonnie++是一個硬盤和文件系統的基准性能測試工具,它通過一系列的簡單測試來生成硬盤和文件系統的性能參數。其主程序提供兩種風格的測試:針對單個文件的數據庫風格的訪問測試和針對大量小文件的創建和刪除來模擬諸如Squid,INN,或者Maildir格式的Email這一類風格的訪問測試。在選擇RAID設定方法、文件系統的創建參數和NFS訪問方式時,此工具可以提供有用的幫助信息。
Bonnie++對三個方面做基准測試:數據讀、寫速度,每秒可以完成的磁盤尋道次數和每秒可以完成的文件元數據操作次數。
元數據的性能表現跟運行著squid或為Maildir格式郵件服務器保存郵件時有很大關系,因為它們都是元數據操作密集型的應用。
Bonnie++目前的最新版本是1.03e,項目地址:http://www.coker.com.au/bonnie++/。
b、安裝
安裝完成以後會在/usr/local/sbin/目錄中生成兩個可執行文件,bonnie++(主測試程序)和zcav(裸盤吞吐量測試程序);同時也會在/usr/local/bin目錄下生成兩個可執行文件,用於生成可讀性強的測試報告,它們是bon_csv2html和bon_csv2txt。
c.、bonnie++的常用選項說明
-d DIR 用於測試的目錄,即測試目標位置;
-s SIZE(MiB) 用於測試IO性能的文件的大小;如果指定的文件大小大於1G,bonnie++會將其分為多個大小為1G的文件;
-m 測試目標主機的主機名,僅用於顯示測試結果時的主機標識;
-r 指定測試程度使用的內存大小;bonnie++一般要求指定的測試文件的大小至少為物理內存的2倍;如果測試時指定的文件過小,則可以通過指定所使用的物理內存大小來滯此條件;
-x 用於指定同時運行的測試數目;
-u 測試程序運行時關聯的uid,如果以root用戶的身份做測試,則此項必須明確指定。-g選項則用於指定gid;
-q 靜默模式;
-f 快速模式,此種模式不進行IO測試;
-D 直接IO測試,用於測試大規模IO請求時的性能;
使用示例:
# bonnie++ -d /data -u root -s 4096 -m mail
說明:
1、測試結果中顯示形如的“++++”的符號表示此項測試時間小於500ms,所以被視作不准確結果不予顯示;
2、每項測試都會顯示兩個結果,其中的%CP表示此項測試的CPU占用率;
d. 、zcav使用簡介
ZCAV是“Zoned Constant Angular Velocity”的簡寫,用於測試裸盤的吞吐率。常用選項如下:
-b 讀/寫操作的數據塊的大小,單位為MB:默認為100M;
-c 讀/寫整個磁盤的次數;
-f 讀入數據時所用的文件;
-u 測試時使用的uid;-g 為使用的gid;
-w 通過向磁盤填充“0”的方式測試,會破壞原有文件。
使用示例:
# zcav -b 2048 /dev/sda3
6.3 Choosing a peripheral interconnect 選擇外部連接
A. 資源和系統的瓶頸在於總線嗎?
B. 常用總線接口
Bus Type Bus Width Clock speed Burst bandwidth Sustainable bandwith
總線類型 總線大小 時鐘頻率 帶寬峰值 支撐帶寬
PCI 32bits 33 MHz 133 MiB/s 115 MB/s
PCI 32bits 66 MHz 266 MiB/s 230 MB/s
PCI 64bits 33 MHz 266 MiB/s 230 MB/s
PCI 64bits 66 MHz 533 MiB/s 490 MB/s
PCI-X 64bits 133 MHz 1066 MiB/s 980 MB/s
PCIe x1 1 bits 2.5 GHz 250 MiB/s 200 MB/s
6.4 SCSI bus considerations 使用SCSI總線接口要注意的事項
A. 物理上要注意的因素
a. 在同一總線上使用不同速度的混合設備(寬型和窄型設備)時要特別小心,因為在總線上窄型終結發生的位置可能與寬型設備不同。
b. 主動終結VS被動終結
c. Differential signaling 差分信號: 用一個數值來表示兩個物理量之間的差異
B. sg3_utils 工具包,查看SCSI接口相關信息及設置參數,相關命令:
for DRIVE in $(sginfo -r) ; do
sginfo –a $DRIVE;
done
6.5 Electro-mechanical positioning 電子機械定位
A. 突發傳輸率與實際吞吐量是沒有關系的
B. 內部傳輸速率非常重要
a. 內部傳輸速率是磁盤每次讀或寫多少個比特
b.旋轉速度
C. 通過隊列技術減少平均尋道時間
a. 使用電梯算法重排序請求隊列
b. 系統的元數據通常存放在buffer cache裡面
c. 文件數據通常存放在page cache裡面
d 大部份設備都有自己的內部緩存
e. 可以饒過內核緩存直接讀寫IO 設備(比如訪問裸設備)
File=1 inode + N blocks
File = metadata + data
Data rate =(sectors_per_track * 512 * rpm)/60
Disk speed =((Average sectors_per_track * rpm *512)/60)/1000000
6.6 Block IO requests and cache effect
(略)
6.7 Tuning sequential read access 順序讀訪問
A. 內核會自動按順序的向前讀寫。
blockdev - getra /dev/sda 查看
blockdev –setra 512 /dev/sda 設置一次讀寫多少kb
a. 可以在/sys/block/sda/queue/read_ahead_kb查看
b. 可調整最大窗口大小
c. 讀寫窗口的初始值是可調值的一半
d. 設置可寫入/etc/rc.local
B. 小結
a. 減少了尋道時間,但增加了每次讀寫的服務時間
b. 減少了要讀寫數據時通知磁盤控制器的操作次數
c. 不適合隨機文件的讀寫。
應用:適用於大文件讀寫(Web Server)
6.8 Tuning the disk queue調整磁盤隊列
A.調整隊列長度
/sys/block/sda/queue/nr_requests
增加隊列長度,可以提高磁盤吞吐量,但消耗內存。
B. 調度算法
/sys/block/sda/queue/scheduler
C. 加長隊列…
a. 多個讀請求合並一次寫入
b. 允許更多有效的讀請求合並但會增加延時。
內核默認的IO調度算法是cfq: 相關查看命令
Grep –I cfq /boot/config-*
調度算法相關幫助文檔:/usr/share/doc/kernel-doc-*/Documentation/block/*
6.9 Tuning the deadline scheduler 最後期限調度
A. 調整目標:優休等待時間(W)
echo deadline > /sys/block/sda/queue/scheduler
B. 主要調整在/sys/block/sda/queue/iosched/
a. Max queue time 最大隊列時間
參數 :
read_ expire: 每個IO讀請求多少豪秒後過期
write_expire:每個IO寫請求多少豪秒後過期
b.合並連續請求
參數:
front_merges:通常在請求隊列的隊尾合並IO請求,這個參數的值可以控制是否 在請求隊列的隊首合並IO請求,這樣可以處理更多的請求,0代表禁止,1代表啟用。
應用:保證響應速度,適合於小文件讀寫
6.10 Tuning the anticipatory scheduler 猜想調度
A. 目標:優化讀數據的完成率
echo anticipatory > /sys/block/sda/queue/scheduler 默認值6秒,猜想下一個數據會不會在附近出現,避免磁頭頻繁來回移動。
B.主要調整在/sys/block/sda/queue/iosched/
a. 在執行下一個讀/寫請求時等待多長時間
參數:antic_expire
b. Max queue time (W)
read_expire
write_expire
批量讀請求比批量寫請求允許更長的時間
相關幫助文檔:/usr/share/doc/kernel-doc-*/Documentation/block/as-iosched.txt
應用:適用於批量順序讀寫,適用於大文件(如,web server)
6.10 Tuning the noop scheduler 不作為調度
A..目標:節省CPU時鐘頻率
echo noop > /sys/block/sda/queue/scheduler
a. 不需要調整設置
b. 使用CPU時鐘頻率開銷昂貴。
c. 主機CPU時鐘頻率通常比SAN CPU時鐘頻率便宜
B. 有些磁盤控制器執行的是電梯算法
a. 標識命令隊列
b. 在SCSI和一些SATA磁盤上有效
C. 對於iSCSI和GNBD來說排序非常有用。
6.11 Tuning the (default) cfq scheduler 公平調度算法(默認)
A.目標:為每個應用提供不同的IO服務
echo cfq > /sys/block/sda/queue/scheduler
a. 基於IO的優先級
b. 使用64位的內部隊列
c. 使用輪循的方式填充內部隊列
d. 從非空隊列裡調出請求
e. 派遣隊列可以進行排序
B.主要調整在/sys/block/sda/queue/iosched/
a.每個內部隊列最大請求數
queued
b.每次派發請求的數量。
Quantum
應用:適用於隨機離散的讀寫。
6.12 Fine-tuning the cfq scheduler cfq 調度算法進階調整
A. 基於優先級隊列
a.類1(real-time)實時隊列:最優先訪問磁盤,調成這種實時隊列可能會餓死其它 類
優先級0(最重要)~7(最不重要)
b.類2(best-effor)盡力而為:輪循訪問,默認。
優先級0(最重要)~7(最不重要)
c.類3(idle)空閒:隊列空閒時才處理 磁盤IO
Example:
ionice –p1
ionice –p1 –n7 –c2 進程號為1,輪循訪問2,等級為7最不重要
ionice –p1
針對進程對IO進行調整:
-p pid 進程號
-n 優先級
-c 優先類別
www.2cto.com
6.12 Physical block devce interfaces 物理塊設備接口類型
A. IDE: 133MB/s以上
B. SATA: 300MB/s
C. SCSI: 320 MB/s
D. USB: 480Mbps(60MB/s)
E. iSCSI+GigE: 1Gb/s(125MB/s)
F. FC: 4.25Gb/s(531 MB/s)