Linux磁盤I/O基礎(chǔ)

I/O處理過程

對(duì)于系統(tǒng)而言,磁盤I/O通常會(huì)成為一個(gè)瓶頸,尤其是對(duì)于數(shù)據(jù)庫(kù)而言。數(shù)據(jù)從磁盤讀取到內(nèi)存,存到CPU緩存和寄存器,然后進(jìn)行處理,最后寫會(huì)磁盤,如下圖:

image

可看到IO操作分成了四個(gè)層面:

1)文件系統(tǒng)緩存:處理數(shù)據(jù)必須先從磁盤讀到緩存,讀取的時(shí)候不光把當(dāng)前磁盤地址的數(shù)據(jù),而是把相鄰的數(shù)據(jù)也都讀取到內(nèi)存緩沖區(qū)內(nèi),每一次讀取的數(shù)據(jù)稱為一頁(yè)(page、一般為4k或8k),然后修改,然后刷回磁盤。緩存的刷新涉及到兩個(gè)參數(shù):vm.dirty_background_ratio、vm.dirty_ratio。

2)block layer:該層就涉及到 IO調(diào)度算法,IO調(diào)度算法在mysql服務(wù)器是一個(gè)很重要的調(diào)優(yōu)手段。系統(tǒng)中所有進(jìn)程申請(qǐng)的IO操作,全部在這里進(jìn)行排隊(duì),等待調(diào)度,然后寫回磁盤。調(diào)度算法有四種:

1> Anticipatory: 適用于個(gè)人PC,單磁盤系統(tǒng);

2> CFQ(Complete Fair Queuing):默認(rèn)的IO調(diào)度算法,完全公平的排隊(duì)調(diào)度算法。每一個(gè)進(jìn)程的IO請(qǐng)求會(huì)安排進(jìn)一個(gè)專門的IO隊(duì)列,然后按照進(jìn)程組來公平的調(diào)度IO,也就是每一個(gè)進(jìn)程組之間按照公平的方式來調(diào)度IO。顯然他適合多用戶的系統(tǒng),但是極為不適合作為數(shù)據(jù)庫(kù)系統(tǒng)的IO調(diào)度算法,因?yàn)轱@而易見,數(shù)據(jù)庫(kù)系統(tǒng)中,數(shù)據(jù)庫(kù)進(jìn)程肯定是IO最多的一個(gè)進(jìn)程組,然后它卻只能獲得和其它進(jìn)程一樣多的IO調(diào)度機(jī)會(huì)。所以顯然這是極為不合理的。數(shù)據(jù)庫(kù)系統(tǒng)絕對(duì)不要使用該調(diào)度算法。

3> Deadline: 按照截止期限來循環(huán)在各個(gè)IO隊(duì)列中進(jìn)行調(diào)度,所以它提供了一個(gè)近實(shí)時(shí)的IO系統(tǒng),并且磁盤throughput也很好,也不會(huì)造成starvation.一般mysql系統(tǒng)建議采用該調(diào)度算法。

4> NOOP: 簡(jiǎn)單的FIFO隊(duì)列進(jìn)行調(diào)度,No operation的意思是,它沒有進(jìn)行額外的將臨近的IO進(jìn)行合并的操作,所以它對(duì)CPU的使用極少。該調(diào)度算法特別適合于SSD。因?yàn)镾SD在對(duì)待順序IO和隨機(jī)IO沒有什么區(qū)別。所以它不需要對(duì)臨近的IO進(jìn)行合并。避免了合并操作對(duì)CPU的使用。

所以一般而言,對(duì)于mysql的系統(tǒng),如果是SSD,那么應(yīng)該使用NOOP調(diào)度算法,如果是磁盤,就應(yīng)該使用Deadline調(diào)度算法。

查看與修改IO調(diào)度算法:

臨時(shí)修改:

[root@localhost ~]# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
[root@localhost ~]# echo noop >  /sys/block/sda/queue/scheduler
[root@localhost ~]# cat /sys/block/sda/queue/scheduler
[noop] anticipatory deadline cfq

永久修改:

vi /boot/grub/menu.lst
更改到如下內(nèi)容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet

重啟之后,查看調(diào)度方法:
cat /sys/block/sda/queue/scheduler 
noop anticipatory [deadline] cfq 

3)磁盤驅(qū)動(dòng)層:對(duì)于順序讀系統(tǒng)而言,很容易在磁盤接口層的帶寬上成為瓶頸所在;

4)磁盤:對(duì)于隨機(jī)讀多的系統(tǒng)而言,磁盤很容易成為瓶頸所在,一般的優(yōu)化就是使用RAID或者換SSD;

影響磁盤I/O性能因素

首先,要知道影響磁盤I/O性能的因素,就得知道磁盤I/O請(qǐng)求所花費(fèi)的時(shí)間的流程,它是由尋道時(shí)間、旋轉(zhuǎn)延遲和數(shù)據(jù)傳輸三部分構(gòu)成。


image
  1. 尋道時(shí)間
    Tseek是指將讀寫磁頭移動(dòng)至正確的磁道上所需要的時(shí)間。尋道時(shí)間越短,I/O操作越快,目前磁盤的平均尋道時(shí)間一般在3-15ms。
  2. 旋轉(zhuǎn)延遲
    Trotation是指盤片旋轉(zhuǎn)將請(qǐng)求數(shù)據(jù)所在的扇區(qū)移動(dòng)到讀寫磁盤下方所需要的時(shí)間。旋轉(zhuǎn)延遲取決于磁盤轉(zhuǎn)速,通常用磁盤旋轉(zhuǎn)一周所需時(shí)間的1/2表示。比如:7200rpm的磁盤平均旋轉(zhuǎn)延遲大約為60*1000/7200/2 = 4.17ms,而轉(zhuǎn)速為15000rpm的磁盤其平均旋轉(zhuǎn)延遲為2ms。
  3. 數(shù)據(jù)傳輸時(shí)間
    Ttransfer是指完成傳輸所請(qǐng)求的數(shù)據(jù)所需要的時(shí)間,取決于數(shù)據(jù)傳輸率,其值等于數(shù)據(jù)大小除以數(shù)據(jù)傳輸率。目前IDE/ATA能達(dá)到133MB/s,SATA II可達(dá)到300MB/s的接口數(shù)據(jù)傳輸率,數(shù)據(jù)傳輸時(shí)間通常遠(yuǎn)小于前兩部分消耗時(shí)間。簡(jiǎn)單計(jì)算時(shí)可忽略。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容