一、 首先介紹硬碟的 I/O Scheduler5 V0 y& `) e, \( l3 [/ P2 R3 i8 B
9 O, B; h# {5 C+ I0 d0 ?
! h2 D3 F$ A3 t, W& u! o* O( e) gI/O Scheduler是什麼?看看Wiki的說明:1 F2 Z6 m; X6 }1 Z
Input / Output Scheduling or I/O Scheduling is a term used to describe the method computer operating systems decide the order that block I/O operations will be submitted to storage volumes. I/O Scheduling is sometimes called 'disk scheduling'.
/ D) z5 M4 a6 s
9 y- c7 f% F$ i6 p. m! ?' C% {/ o7 c( E9 C
簡單的說,就是讓我們可以經由不同的設定,來達到調整磁碟存取(I/O)模式的一種設定工具。
# x* A& Q& I' u+ m2 p( s" Z& s# ]9 A P5 i- b' C5 H9 z2 s: p% s
5 D1 [; F# M9 l6 q; U
目前Linux支援四種I/O Schedule模式,分別為:
$ }0 b$ {3 E% f* P' B2 s7 w7 M0 ^
, A& h' s+ D! }6 B3 z
Noop Scheduler (簡稱noop) -- RIAD 或 SSD 建議使用 noop
3 ]; E- k( ]" t% x$ d" K: @! r3 B可以算是最基本且簡化的Scheduler,主要應用於一些較為特別的軟體與硬體搭配操作的環境中,且這些軟/硬體已經具備有自己的I/O存取機制,且對於系統核心的要求較少,這樣的Scheduler比較適合運用在嵌入式的環境系統中。 i. h1 n/ L% e$ Y* o
- t1 `1 E# m9 D: ]- L
7 V+ \; W2 L( |: gCompletely Fair Queuing (簡稱cfq)
0 E4 G" P3 u; L" H2 J顧名思義,針對硬碟與系統應用所需要的所有I/O任務,均分配給相同的佇列順序(Queuing),這樣的Scheduler最適合用於一般使用者桌上型電腦的操作環境,自從2006年12月Linux Kernel 2.6.18問世直至今日,CFQ Scheduler一直是Linux核心預設的 I/O scheduler。
; C8 j9 k9 R( C) E! g7 }
3 k' U/ v) \+ v# Q# I4 Z: {0 t# C2 m: x! Q$ J2 ?! t; I1 P
Anticipatory Scheduling (簡稱anticipatory)
7 h: o0 y! N# r: d; B& r曾經一度是Linux 2.6 Kernel 的預設 I/O Scheduler ,由Anticipatory (預先/預想) 的文字解釋來看,如果有第一個I/O出現,且同時又有別的系統第二個I/O請求操作時,Anticipatory Scheduling將會產生一個預設需要6毫秒的"猜測"(預想)時間,這個猜測,是在猜測第二個I/O請求是要做什麼用的,這樣的猜測預想模式在經常性進行隨機存取的系統內會造成較大的時間延遲,尤其是像資料庫這樣的系統環境,但反之,Anticipatory Scheduling對於像網頁伺服器這樣的系統則會表現的相當好。) y$ ^9 m9 S* C% S# r5 Z! H6 f
# F5 j% d7 E) U6 q6 t: h$ [! y: y; [! j5 Y4 {
Deadline Scheduler (簡稱deadline) -- SATA 建議使用 deadline
5 J4 D/ |2 o# a& m) @3 q) s主要這個Scheduler就是針對Anticipatory Scheduling的缺點來進行改善,它會針對磁碟中經常遭到存取的不同應用程式,記錄並製作符合最小延遲時間的佇列順序,這樣的結果對於資料庫系統能提供更加的存取效率。
! t% H5 K1 `/ b) w8 J/ A1 }9 R9 _
: B! ~: d$ S2 ~8 `0 W4 V下圖是Red Hat Enterprise Linux 4 (2.6 Kernel) 搭配Oracle10G資料庫與各種I/O Scheduler測試的結果 (圖片與資料來源屬Redhat公司所有)
7 B& ?, H7 _( L, T
- o+ w' G) R8 e3 C/ O! ?' Y- i
. F U& j' w! V簡單理解了I/O Scheduler模式的差異後,我們可以針對不同儲存設備來搭配不同的I/O Scheduler進行效能上的調校,首先我們先找到管理I/O Scheduler的系統檔案,這個檔案可用cat的方式來讀取:
( J8 P+ P @7 U7 s0 D% V$ L
: u" C) J, P1 m$ s8 L" ?; _
+ [+ }% \; A' E3 p#cat /sys/block/sda/queue/scheduler
; z* F3 U! f0 w[noop] anticipatory deadline cfq
+ |% \! S2 Y/ i0 N' J
^/ ?8 B; c0 \9 h! p0 b' [) ^9 r% f& f8 N1 K# g8 o
從上例,我們可以知道目前的I/O Scheduler模式為Noop. (有框號 [ ] 處)
; S! u# D2 i2 g
" q( `+ q# ~+ H6 V, {" M( e$ G+ n4 h& ]
* S/ C3 a' T: }3 E( G6 a若需要進行修改調整,作法有兩種:
; s4 X* O/ P/ n6 Y, Y; F5 f# `/ @( {& n4 @; s; }& q, t
) T4 P# n: T" _
1. 單次調整,即調整即生效,經由echo指令來更改I/O Scheduler的模式* J r$ X# s& @6 X2 c( x* a
p1 K! v4 R) ?: G$ F3 A) t- `6 V3 D8 W( k- u9 ~! B( _
#echo Deadline>/sys/block/sda/queue/scheduler
9 x5 D' x9 C2 ?- w3 z0 v' o% c0 S0 H
; ]0 L0 w5 f' k; v$ i% G1 ~上例為將目前sda這顆硬碟的I/O Scheduler更改為Deadline模式,改完隨即生效,但重新開機後又會回到系統核心默認的I/O Scheduler模式- ?# Q) h% u6 X$ C6 G3 E/ W
0 D+ k! X% c5 q) p! @
8 Q! v# x3 z9 X% p2. 隨著系統開機進行調整生效: d2 n( ~6 T) g+ O2 G
以下2選1 u" z& P8 R! q; F w" \
❶ 在 /etc/rc.local 內加入一行: echo anticipatory > /sys/block/sdb/queue/scheduler ❷ 在系統的GRUB開機檔案中,最後一行加上elevator=deadline,即可於每次開機後都保有Deadline Scheduler的運作模式,如下例:
: N; i2 ^8 X6 o7 h" R' m5 t" I5 h
0 F B/ G: a2 J4 z( Y
@% `) R+ I; w( c編輯 /boot/grub/grub.conf; f; Y; V5 Z/ ~# T4 k1 Q2 ~3 P0 T
/ I2 i; C. l2 `: P; G
4 n5 `9 }6 s* i! ]" n& f' Z3 Mtitle Fedora Core (2.6.9-5.0.3.EL_lustre.1.4.2custom)( I9 j' ?8 F, v
root (hd0,0)
* D( n; {! y+ n8 skernel /vmlinuz-2.6.9-5.0.3.EL_lustre.1.4.2custom ro8 q8 f. F! c( |6 G, V
root=/dev/VolGroup00/LogVol00 rhgb noapic quiet elevator=deadline! Y- q, X9 ]! E H$ W4 n. A) K
0 m0 i7 h0 r& J/ X+ J; m ?' V9 B0 Z
% c! ~( D3 m/ X* C* w% P* R+ E
- X4 g6 o. P5 u, B
二、 接下來是硬碟的 Readahead 快取
$ \/ m( B& W) c! O1 N: c+ n) B+ r) T) i& K1 i& b! R, Y X
* E) v D% L. h3 z+ \4 E這部份就比較容易理解,經由系統磁碟的預先讀取設定來加速讀取效能,而經由調整Readahead Sectors大小來增進系統磁碟的讀取效能差異,這就是調校的主要目的。
1 t7 Y! r) I# z! e8 d9 v8 t4 A
# l3 ]& v0 k. y* \9 Y; x# n
" \8 F) |9 g7 [- k, D9 M經由Linux系統指令: blockdev 來檢視目前sda硬碟的Readahead Sectors大小,範例如下2 z; ]6 Y! @3 o+ F
" D' O+ Q1 P6 f' k, i9 w6 `0 }# ^4 n) U/ {6 @
#blockdev --getra /dev/sda (系統預設是256M)1 p0 ^6 ?2 z2 m' {
512! u' c* _5 F2 }: _
M( }2 j- ]% C0 d3 V
& v3 Z/ ^; p+ M而經由調整參數並帶入Sectors大小,來進行效能調整,範例如下:0 x! @( b0 Q2 E1 y/ f3 H' h. R
, m; ^3 @9 l/ ~ P" Z6 `, B4 o+ F; a
6 M* X9 B5 J( d! B! P
#blockdev --setra 4096 /dev/sda3 C0 F" y0 c) ~( m
2 W. @* `0 ~! o: g
# N, g I* b( h: Q) Q
#blockdev --getra /dev/sda o5 q g3 I) D" w+ V
4096
* v2 u4 u9 q% U. {4 x& `9 @9 i8 l6 \/ L" b3 n! T
隨著系統開機自動設定:
7 c5 ]: U! S, I- i" d! p5 F8 _6 L0 a6 N在 /etc/rc.local 內加入一行:
K3 |) y6 ~9 d7 I, j3 C8 |blockdev --setra 4096 /dev/sda8 S$ N; g, M# z3 V
* A9 g1 v' G3 N9 y經有這兩種硬碟效能調校的小方案,可望能在原本讀取效能就比較差的硬體環境之下,再多壓榨出一些讀取效能。
! d; T- u; C% N5 o實例:以前當server同時做很多工作,例如 ffmpeg, php(move_uploaded_file)上傳大檔案 ,tar , mv 大的檔案時,所有動作幾乎會卡住,完全動不了,經過上述的調整,問題完全解決。
+ Z$ w- R& V/ S X- M" Y$ ]' R; j% G( q* P( _( P
另外,sysctl.conf的調整也是有幫助的) n( f0 Y# A1 L% E$ `
' h9 Y& G" }' f4 M1 ?, k3 M
% N L' C2 h' R$ _' ~$ f1 \. {參考來源:9 `) f; S. d& D' W5 @: u9 s
: j) p9 Z- |& T- E) z5 d# @1 Mhttp://itstorage.storageforum.tw ... eadahead-cache.html& K1 c( H @' E/ @0 L9 c4 ]
|
|