日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

Linux优化之IO子系统监控与调优

發(fā)布時(shí)間:2023/12/4 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux优化之IO子系统监控与调优 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Linux優(yōu)化之IO子系統(tǒng)

作為服務(wù)器主機(jī)來(lái)講,最大的兩個(gè)IO類型 :

1.磁盤IO?

2.網(wǎng)絡(luò)IO

這是我們調(diào)整最多的兩個(gè)部分所在

?

磁盤IO是如何實(shí)現(xiàn)的

在內(nèi)存調(diào)優(yōu)中,一直在講到為了加速性能,linux內(nèi)核一般情況下都會(huì)嘗試將磁盤上的慢速設(shè)備上的文件緩存至內(nèi)存中,從而達(dá)到加速效果;

虛擬內(nèi)存的概念:

讀寫都在內(nèi)存中完成,當(dāng)某一進(jìn)程在cpu運(yùn)行的時(shí)候,進(jìn)程要訪問(wèn)自己地址空間中的某一內(nèi)存頁(yè),當(dāng)進(jìn)程需要訪問(wèn)頁(yè)面中的數(shù)據(jù),而這個(gè)頁(yè)面最終是要對(duì)應(yīng)在物理內(nèi)存中的某個(gè)物理頁(yè)面,而進(jìn)程只能看到自己的線性地址空間,而這個(gè)地址并不存在,一旦訪問(wèn)這個(gè)地址,那么會(huì)通過(guò)MMU(內(nèi)存管理單元)機(jī)制中的存儲(chǔ)當(dāng)前進(jìn)程的線性地址到物理地址的映射表

由此通過(guò)MMU實(shí)現(xiàn)對(duì)應(yīng)的地址查詢于是得到了其映射的地址,最終進(jìn)程雖然訪問(wèn)的數(shù)據(jù)是來(lái)自于映射過(guò)的地址,這種訪問(wèn)訪問(wèn)我們被稱為虛擬地址或虛擬內(nèi)存

?

如果由于我們使用交換內(nèi)存或其他方式有可能這個(gè)進(jìn)程所打開的文件長(zhǎng)時(shí)間沒(méi)有被訪問(wèn),這個(gè)文件所對(duì)應(yīng)的內(nèi)存已經(jīng)被清出去了,所以使用mmu地址轉(zhuǎn)換后的地址對(duì)應(yīng)的數(shù)據(jù)在內(nèi)存中不存在了,這時(shí)候會(huì)產(chǎn)生頁(yè)錯(cuò)誤,我們也被稱為缺頁(yè)異常

?

缺頁(yè)異常

缺頁(yè)異常分為大異常和小異常:

??? 如果數(shù)據(jù)不存在使得不得不在磁盤中載入頁(yè)面文件,這時(shí)CPU就會(huì)進(jìn)入內(nèi)核模式,訪問(wèn)磁盤,每次CPU訪問(wèn)內(nèi)存就要3個(gè)周期,訪問(wèn)磁盤需要N個(gè)周期,首先需要定位數(shù)據(jù)的準(zhǔn)確位置,而后定位物理內(nèi)存中開辟數(shù)據(jù)空間,最后將數(shù)據(jù)總線貫通,從而將數(shù)據(jù)從磁盤轉(zhuǎn)入到內(nèi)存--blockin

?

??? 當(dāng)我們找一個(gè)空閑空間,而事實(shí)上當(dāng)進(jìn)程訪問(wèn)這段數(shù)據(jù)就需要訪問(wèn)新位置的數(shù)據(jù),所以我們要更新這個(gè)映射表,明確說(shuō)明所要訪問(wèn)的邏輯地址所要對(duì)應(yīng)的空間的轉(zhuǎn)換的位置,并且讓進(jìn)程重新發(fā)起一次訪問(wèn),這時(shí)需要先查找TLB(緩存緩沖器),再次進(jìn)行查表

??? 而將磁盤裝入內(nèi)存的過(guò)程就會(huì)發(fā)生IO,如果進(jìn)程修改了數(shù)據(jù),最終數(shù)據(jù)還需要寫到磁盤中去,而寫到磁盤中去,過(guò)程使得數(shù)據(jù)比原來(lái)的文件更大了

具體是由文件系統(tǒng)模塊根據(jù)進(jìn)程發(fā)起的請(qǐng)求,內(nèi)核指揮文件系統(tǒng)模塊開辟更多的存儲(chǔ)塊而后將數(shù)據(jù)存儲(chǔ),這種過(guò)程被稱為?block out

?

#緩沖器負(fù)責(zé)將之前緩沖過(guò)的緩存下來(lái),那么如果N個(gè)條目,而緩沖器只能緩存有限的幾個(gè),那么命中率可能會(huì)很低,如果我們使用大頁(yè)面的話,那么命中率可以大大提高。

?

?

機(jī)械硬盤的特性

同一方向的操作是合并起來(lái)完成的,而后在這個(gè)方向結(jié)束之后則是另外一方向的

對(duì)硬盤來(lái)講,讀寫是不同類型的操作,讀寫是不能同時(shí)進(jìn)行的

?

磁盤是如何操作的

將一個(gè)或多個(gè)進(jìn)程的讀操作合并到一起讀

將一個(gè)或多個(gè)進(jìn)程的寫操作合并到一起寫

?

所以讀寫操作是兩類不同的操作而且是同一方向合并的

如果是讀文件,這個(gè)文件一定是來(lái)自于磁盤的

如果是寫文件,那么寫入到內(nèi)存中,對(duì)于進(jìn)程來(lái)講是已經(jīng)完成的,那么用戶對(duì)計(jì)算機(jī)性能感知是來(lái)自于讀,因?yàn)樽x一定是與IO相交互

?

1.讀是在同方向合并的

2.寫也是需要合并的,而且兩者是不同方向的操作

因?yàn)樵谕环较蚩梢怨?jié)省很多資源

讀必須優(yōu)先滿足,而寫也不能等太久,因此必須有一種良好的算法讓其盡可能都得到滿足,而又不能讓用戶感到性能下降 ?

因此在IO系統(tǒng)上有個(gè)非常重要的模塊---IO調(diào)度器

?

IO調(diào)度器

用來(lái)實(shí)現(xiàn)合并同一方向的讀寫操作并且將讀寫操作盡可能理想的這種狀況

IO調(diào)度器本身的完成,最終用戶實(shí)現(xiàn)寫的時(shí)候進(jìn)程級(jí)別所看到的數(shù)據(jù)是文件接口

那么文件接口輸出的時(shí)候就意味著將磁盤空間以文件接口的方式輸出,其需要文件系統(tǒng)

也就意味著進(jìn)程與磁盤上的數(shù)據(jù)打交道是依賴文件系統(tǒng)的

?

所以用戶的請(qǐng)求先到文件系統(tǒng),而文件系統(tǒng)通過(guò)內(nèi)核輸出是虛擬文件接口(VFS) 通過(guò)VFS找到各特定文件系統(tǒng)相關(guān)模塊,當(dāng)然對(duì)應(yīng)的文件是哪個(gè)那么則通過(guò)vfs轉(zhuǎn)換成什么即可

文件系統(tǒng)將數(shù)據(jù)接下來(lái)之后,最終存儲(chǔ)為磁盤塊的方式保存在磁盤上,因此這些文件系統(tǒng)最終還要轉(zhuǎn)換數(shù)據(jù)為磁盤塊,所以接下來(lái)還要有塊層

塊層主要是將數(shù)據(jù)轉(zhuǎn)換為磁盤塊格式,而后再由磁盤塊格式轉(zhuǎn)換成調(diào)度以后存儲(chǔ)在磁盤上

如下圖所示:

(1)用戶進(jìn)程實(shí)現(xiàn)寫操作 實(shí)現(xiàn)系統(tǒng)調(diào)用

(2)用戶的寫操作一定是跟VFS進(jìn)行交互的

(3)VFS需要將其換換為特定的文件系統(tǒng)

(4)單個(gè)文件在虛擬文件系統(tǒng)存放都會(huì)轉(zhuǎn)換成頁(yè)面方式(page cache)

(5)寫完之后通過(guò)block buffer快緩沖(知所以進(jìn)行緩沖是因?yàn)榇疟P太慢了,所以寫的時(shí)候需要緩沖下來(lái)

(6)然后由bio將每個(gè)page cache轉(zhuǎn)換成塊,并且在塊緩沖這個(gè)層次上緩存下來(lái)

這就是緩沖隊(duì)列,而在塊層實(shí)現(xiàn)緩沖之后每個(gè)塊最終都要交給塊層來(lái)處理,塊層中最重要的一個(gè)組件就是IO調(diào)度器,IO調(diào)度器接收blockbuffer中所發(fā)送過(guò)來(lái)的多個(gè)請(qǐng)求塊,這多個(gè)請(qǐng)求塊需要排序的:同方向合并,圖中都是寫操作的?

至于如何排序,一定是最靠近寫請(qǐng)求的最優(yōu)先滿足

?

而IO調(diào)度器主要功能就是將隨機(jī)IO盡可能合并為順序IO? 本文來(lái)自http://yijiu.blog.51cto.com 轉(zhuǎn)載請(qǐng)說(shuō)明,翻版可恥

但是我們有說(shuō)過(guò),盡可能同一方向合并盡可能會(huì)隨機(jī)變?yōu)轫樞?#xff0c;但是我們又不得不讀饑餓也不能寫?zhàn)囸I,所以要交替進(jìn)行的

所以:

(10)由IO調(diào)度器調(diào)度完成之后,提交給Device Driver?,由Device Driver控制磁盤控制器,由控制器將電器信號(hào)轉(zhuǎn)換為磁信號(hào)寫入到磁盤中去

?

為何隨機(jī)讀寫比順序讀寫要慢:

·隨機(jī)讀寫:

我們可能寫任意一個(gè)磁道的任意一個(gè)扇區(qū),那么硬盤磁頭可能來(lái)回晃動(dòng)才能完成一次寫

·順序讀寫:

在一個(gè)方向轉(zhuǎn)動(dòng)即可完成,不用再去移動(dòng)磁臂的

磁頭操作是電磁運(yùn)動(dòng),而磁臂操作是機(jī)械運(yùn)動(dòng),所以任何時(shí)候隨機(jī)讀寫性能都比順序讀寫都要差的很多

?

?

調(diào)度算法

IO調(diào)度器事實(shí)上是用程序完成的調(diào)度算法,對(duì)linux來(lái)講,2.6的內(nèi)核一共有4個(gè)

1、CFQ

? 完全公平隊(duì)列,比較適合于交互式場(chǎng)景 ? ? ?

2、Deadline

? ?最后期限,任何一個(gè)讀寫請(qǐng)求,都有自己的滿足期限,當(dāng)期限到來(lái)時(shí)之前,必須達(dá)到需求的滿足(一般建議在數(shù)據(jù)庫(kù)服務(wù)器上使用此調(diào)度算法)

3、anticpatory

? ?預(yù)期的,任何一個(gè)數(shù)據(jù)讀完之后,有可能與其相鄰的數(shù)據(jù)也可能被讀到,所以它大致所實(shí)現(xiàn)的方法就是,讀完之后先不滿足,則不處理,需等一段時(shí)間后查看是否有相近數(shù)據(jù)訪問(wèn)過(guò),如果有馬上先滿足,所以這只能在行為預(yù)估的場(chǎng)景下可用

4、Noop

??? 不排隊(duì)不合并,先到先得

??? #像固態(tài)硬盤,因?yàn)樗皇菣C(jī)械硬盤,它的讀寫就算是隨機(jī)IO那么它的性能跟順序IO差別也不是很大,反而如果想讓調(diào)度器去調(diào)取它的算法,那么調(diào)度器本身運(yùn)行會(huì)占用很高的CPU的時(shí)鐘周期,有可能會(huì)得不償失,所以noop在這種場(chǎng)景下是最好的算法

??? #有些RAID設(shè)備控制器在硬件設(shè)備上自己就有讀寫操作排序的,也就意味著在硬件級(jí)別排好序之后在操作系統(tǒng)級(jí)別會(huì)將其打散重新排序,得不償失,所以RAID設(shè)備有自己的調(diào)度器的話,最好也使用noop

一般來(lái)講,默認(rèn)是CFQ的

?本文來(lái)自http://yijiu.blog.51cto.com 轉(zhuǎn)載請(qǐng)說(shuō)明,翻版可恥

有時(shí)候在不同場(chǎng)景下,他們所最佳所適用的算法可能不一樣,比如:

如果是web服務(wù)器,這里只是訪問(wèn)放web上的分區(qū)的頁(yè)面數(shù)據(jù)

如果是db數(shù)據(jù)庫(kù),訪問(wèn)的是db數(shù)據(jù)庫(kù)的文件,他們最適用的算法未必會(huì)一樣,因?yàn)樗麄兊脑L問(wèn)風(fēng)格不同,所以這時(shí)候我們就需要修改他們的調(diào)度器算法

CFQ比較適合于交互式場(chǎng)景,于是在很多時(shí)候會(huì)將服務(wù)器設(shè)置為Deadline,當(dāng)然只是一種假定,具體需要自己測(cè)試然后做決定

?

觀測(cè)當(dāng)前磁盤IO活動(dòng)

一般 ethstatus iotio?pt-ioprofile?sar等查工具看哪些進(jìn)程引起的io比較高等

這里我們使用sar來(lái)觀察其狀態(tài)信息? 本文 來(lái)自http://yijiu.blog.51cto.com 轉(zhuǎn)載 請(qǐng)說(shuō)明,翻版 可恥

例:

[root@node3 ~]# sar? -d 1 5

Linux2.6.32-431.20.3.el6.x86_64 (node3.test.com) 09/20/2014?? _x86_64_(4 CPU)

?

09:16:00 PM?????? DEV??????tps? rd_sec/s? wr_sec/s?avgrq-sz? avgqu-sz???? await????svctm?? ??%util

09:16:01 PM? dev252-0????46.46????? 0.00? 46795.96??1007.13????? 2.65??? 580.00?????2.26???? 10.51

?

09:16:01 PM?????? DEV??????tps? rd_sec/s? wr_sec/s?avgrq-sz? avgqu-sz???? await????svctm???? %util

09:16:02 PM? dev252-0?????3.00????? 0.00? ??144.00????48.00????? 0.00????? 1.33?????1.00????? 0.30

?

09:16:02 PM?????? DEV??????tps? rd_sec/s? wr_sec/s?avgrq-sz? avgqu-sz???? await????svctm???? %util

09:16:03 PM? dev252-0?????0.00????? 0.00????? 0.00?????0.00????? 0.00????? 0.00?????0.00????? 0.00

?

09:16:03 PM?????? DEV??????tps? rd_sec/s? wr_sec/s?avgrq-sz? avgqu-sz???? await????svctm???? %util

09:16:04 PM? dev252-0?????0.00????? 0.00????? 0.00?????0.00????? 0.00????? 0.00?????0.00????? 0.00

?

09:16:04 PM?????? DEV??????tps? rd_sec/s? wr_sec/s?avgrq-sz? avgqu-sz???? await????svctm???? %util

09:16:05 PM? dev252-0????72.73????? 0.00? 59967.68???824.56????? 2.61???? 35.88?????1.21????? 8.79

用參數(shù)-p可以打印出sda,hdc等磁盤設(shè)備名稱,如果不用參數(shù)-p,設(shè)備節(jié)點(diǎn)則有可能是dev8-0,dev22-0

參數(shù)解釋:

tps:每秒從物理磁盤I/O的次數(shù).多個(gè)邏輯請(qǐng)求會(huì)被合并為一個(gè)I/O磁盤請(qǐng)求,一次傳輸?shù)拇笮∈遣淮_定的

rd_sec/s:每秒讀扇區(qū)的次數(shù).?

avgrq-sz:平均每次設(shè)備I/O操作的數(shù)據(jù)大小(扇區(qū)).?

avgqu-sz:磁盤請(qǐng)求隊(duì)列的平均長(zhǎng)度.

await:從請(qǐng)求磁盤操作到系統(tǒng)完成處理,每次請(qǐng)求的平均消耗時(shí)間,包括請(qǐng)求隊(duì)列等待時(shí)間,單位是毫秒(1秒=1000毫秒).(一次完成的任務(wù),它的IO完成的平均耗時(shí))

svctm:系統(tǒng)處理每次請(qǐng)求的平均時(shí)間,不包括在請(qǐng)求隊(duì)列中消耗的時(shí)間,

%util:I/O請(qǐng)求占CPU的百分比,比率越大,說(shuō)明越飽,一般到95左右可能要引起關(guān)注

我們通常經(jīng)驗(yàn)值是:

svctm不超過(guò)0.5;

await不超過(guò)5;

主要看當(dāng)前設(shè)備


核心要點(diǎn):
1、tps(iops)越高,但%util越低,說(shuō)明io能力容量越大
2、await、svctm越低越好,說(shuō)明io響應(yīng)延遲很低,iops能力很高

?

調(diào)整buffer,提高性能

無(wú)非就是調(diào)整隊(duì)列數(shù),以及增加預(yù)讀數(shù),下面我們來(lái)手動(dòng)做一下

·增加隊(duì)列長(zhǎng)度

格式:

/sys/block/vda(特定某設(shè)備)/queue/nr_requests

由于我這里跑的是kvm虛機(jī),所以設(shè)備號(hào)默認(rèn)都以vdx開頭

默認(rèn)隊(duì)列為128個(gè)長(zhǎng)度

[root@node3 ~]#? cat /sys/block/vda/queue/nr_requests

128

這個(gè)值是可以調(diào)大一點(diǎn)的

?

2.增加預(yù)讀數(shù)

??/sys/block/vda(特定某設(shè)備)/queue/read_ahead_kb

表示事先預(yù)讀數(shù)據(jù)的kb數(shù),默認(rèn)也是128

[root@node3 ~]# cat /sys/block/vda/queue/read_ahead_kb
128

這個(gè)值也是可以調(diào)大的,具體多少自行而定

?本文 來(lái)自http://yijiu.blog.51cto.com 轉(zhuǎn)載 請(qǐng)說(shuō)明,翻版 可恥

?

CFQ完全公平隊(duì)列

IO調(diào)度是在各進(jìn)程之間平均分配的,主要是根據(jù)進(jìn)程的IO需求來(lái)講IO能力平均分配調(diào)度

所以在交互式環(huán)境中,這種方式是比較實(shí)用的

?

但是在RHEL6.4上 它又提供了三個(gè)不同的調(diào)度等級(jí):

1.實(shí)時(shí) RT

2.最佳效果 BE

3.閑置

?

我們可以使用ionice命令手動(dòng)分配調(diào)度等級(jí),或者使用iopro_set系統(tǒng)調(diào)用編程分配,當(dāng)然涉及到開發(fā)層面了

在實(shí)時(shí)調(diào)度等級(jí)和最佳效果兩個(gè)級(jí)別都有8個(gè)IO等級(jí),

數(shù)字越小優(yōu)先級(jí)越高,最佳效果是默認(rèn)調(diào)度等級(jí) 也就是4,不用更改

?

修改CFQ,以調(diào)節(jié)其性能

涉及參數(shù)文件:/sys/block/vda/queue/iosched/

修改默認(rèn)調(diào)度器算法:

[root@node3 ~]# cd /sys/block/vda/queue/

[root@node3 queue]# ls

add_random?????????? hw_sector_size????? max_hw_sectors_kb? minimum_io_size? physical_block_size? scheduler

discard_granularity? iosched???????????? max_sectors_kb???? nomerges???????? read_ahead_kb??????? unpriv_sgio

discard_max_bytes??? iostats???????????? max_segments?????? nr_requests????? rotational

discard_zeroes_data? logical_block_size? max_segment_size?? optimal_io_size? rq_affinity

而在其上層目錄里,有一scheduler文件

查看scheduler文件

[root@node3 queue]# cat scheduler

noop anticipatory deadline [cfq]

因此更改磁盤IO調(diào)度器則去找這個(gè)目錄下所對(duì)應(yīng)的scheduler,注意的是,它只是針對(duì)每個(gè)磁盤進(jìn)行調(diào)整的,如果有多塊磁盤的話則需要對(duì)應(yīng)每個(gè)磁盤進(jìn)行修改

它沒(méi)有辦法使用sysctl進(jìn)行控制,如果想開機(jī)生效,只能寫到rc.local 或init腳本中

?

一旦更改調(diào)度算法之后,再來(lái)查看目錄中的文件

[root@node3 queue]# ls /sys/block/vda/queue/iosched/

back_seek_max????? fifo_expire_async? group_idle?????? low_latency? slice_async???? slice_idle

back_seek_penalty? fifo_expire_sync?? group_isolation? quantum?????slice_async_rq? slice_sync

修改算法

[root@node3 queue]# echo deadline > scheduler

[root@node3 queue]# cat scheduler

noop anticipatory [deadline] cfq

再次觀察iosched目錄,并查看其是否有變化

[root@node3 queue]# ls/sys/block/vda/queue/iosched/

fifo_batch? front_merges?read_expire? write_expire? writes_starved

所以我們更改調(diào)度算法后,每個(gè)調(diào)度算法在此目錄都有很多可調(diào)整參數(shù),每個(gè)參數(shù)都有值,只不過(guò)都表現(xiàn)為其文件內(nèi)容而已,而每個(gè)調(diào)度器的值通過(guò)修改是可以優(yōu)化調(diào)度器的工作特性的

?

比如對(duì)CFQ來(lái)講,有以下幾個(gè)值可以調(diào)整:

back_seek_max

??? 反向?qū)さ揽赡苡胸?fù)面影響,負(fù)載小的時(shí)候可以啟用,否則不要使用反向?qū)さ捞嘀?/span>

?

back_seek_penal

??? 反向?qū)さ雷鰬土P,如果不得不使用反向?qū)さ赖脑?#xff0c;那么必須對(duì)其做出一定懲罰,一旦做完懲罰之后,必須要正向?qū)さ栏啻螖?shù)

?

fifo_expire_async

??? 用來(lái)控制異步請(qǐng)求等待時(shí)間長(zhǎng)度,默認(rèn)是250毫秒,過(guò)期之后無(wú)法滿足的異步請(qǐng)求將會(huì)被移動(dòng)到調(diào)度隊(duì)列中,也就意味著要重新調(diào)度。通常這些值不需要調(diào)整

?

fifo_expire_sync

??? 用于同步請(qǐng)求的,

嚴(yán)格來(lái)講寫操作都是在內(nèi)存中完成 過(guò)周期之后才會(huì)同步至硬盤中,站在計(jì)算機(jī)角度來(lái)說(shuō)這種操作都被稱為異步,而同步則是為了盡可能保證數(shù)據(jù)會(huì)被第一時(shí)間寫到磁盤上來(lái),數(shù)據(jù)不會(huì)在內(nèi)存上逗留,直接寫入磁盤

?

low_latecy

??? 低延遲,簡(jiǎn)單來(lái)講,每個(gè)進(jìn)程都有可能發(fā)起讀寫請(qǐng)求,也就意味著最終滿足用戶讀寫請(qǐng)求是按進(jìn)程為單位劃分,在滿足這個(gè)前提下,需要考慮每個(gè)進(jìn)程都需要得到滿足,所以必須關(guān)注每個(gè)進(jìn)程發(fā)起IO請(qǐng)求之后最多等待多長(zhǎng)時(shí)間,如果啟動(dòng)此值就意味著每個(gè)進(jìn)程只要發(fā)起讀寫請(qǐng)求都要盡可能快速得到滿足,默認(rèn)就啟用了低延遲

??? 在桌面系統(tǒng)環(huán)境,低延遲是非常有必要的

?

quantum

??? CFQ一次可以發(fā)出的IO請(qǐng)求數(shù),一批最大可以調(diào)度的IO數(shù),限制IO隊(duì)列深度的,簡(jiǎn)單來(lái)說(shuō)就是定義設(shè)備一次可以接收的IO請(qǐng)求的隊(duì)列長(zhǎng)度,默認(rèn)為8

??? 增加反而會(huì)有負(fù)面影響,因此謹(jǐn)慎調(diào)整

??? 如果隨機(jī)IO請(qǐng)求數(shù)非常的多,這個(gè)值可以適當(dāng)調(diào)大,如果順序?qū)懛浅6?#xff0c;那么不建議調(diào)整

?

設(shè)置IO允許消耗的時(shí)間

一次IO請(qǐng)求的操作,一次執(zhí)行多久,應(yīng)該執(zhí)行多久,按理說(shuō)硬盤只要是沒(méi)有損壞,能正常運(yùn)作,在正常范圍內(nèi),那么它就應(yīng)該寫完、讀完所以我們要定義好每次讀寫請(qǐng)求所最大允許消耗的時(shí)間,那么就是以下幾個(gè)參數(shù)的意義了:

slice_async

??? 定義異步寫入的超時(shí)值,每次異步寫操作最長(zhǎng)時(shí)長(zhǎng)是多少,默認(rèn)值為40秒

slice_idle

??? 等待IO請(qǐng)求的閑置時(shí)長(zhǎng)

slice_sync

??? 定義同步寫入操作超時(shí)值,因?yàn)橥奖容^慢,所以其默認(rèn)值是100秒,因?yàn)槭菑倪M(jìn)程直接到磁盤的,所以超時(shí)時(shí)間會(huì)長(zhǎng)一點(diǎn)

在桌面環(huán)境和在服務(wù)環(huán)境下,他們?nèi)绻际褂肅FQ調(diào)度器,他們工作特性不一定,也就意味著我們關(guān)注其背后工作機(jī)制參數(shù)也不一樣,所以要調(diào)整某些值做一些測(cè)試的評(píng)判

?

?

Deadline最后期限調(diào)度

最后期限

如圖所示,其分為了3個(gè)隊(duì)列,分別是:

·讀隊(duì)列

·寫對(duì)列

·排序隊(duì)列

而后這些隊(duì)列都被整合到派發(fā)隊(duì)列中去而后由磁盤得到滿足,我們從中任何一隊(duì)列中選出一個(gè)操作得到滿足之前必須要保證這類操作不能超期

簡(jiǎn)單來(lái)講deadline就是將每個(gè)讀寫操作放到隊(duì)列的時(shí)候都給他一個(gè)倒計(jì)時(shí)的計(jì)時(shí)器,將倒計(jì)時(shí)的計(jì)時(shí)器消耗完之前需要趕緊放到派發(fā)隊(duì)列中,而后再同步至硬盤

而對(duì)服務(wù)器來(lái)講,這種方式是比較理想的

?

常用可調(diào)參數(shù)

fifo_batch

??? 單批發(fā)出的讀寫數(shù),在其最后期限滿足之前將隊(duì)列中的數(shù)據(jù)拿出并滿足,但有寫操作是需要排序的;默認(rèn)為16,設(shè)置更多的值會(huì)獲得更好的流量,但是會(huì)增加延遲

??? 比如一批讀為16個(gè),那么我們講其改為32個(gè),那意味著寫的時(shí)間會(huì)更高

??? 當(dāng)然所有都取決于測(cè)試數(shù)據(jù),無(wú)論怎么調(diào)都不如換一塊SSD硬盤

?

front_merges

??? 可以將多個(gè)請(qǐng)求合并在一起,但是有些請(qǐng)求壓根不連續(xù),不可能被合并在一起,那么我們可以禁止在滿足IO之前進(jìn)行合并的,禁止合并有可能會(huì)帶來(lái)隨機(jī)讀寫的特性的

??? 但允許合并也有一定的副作用,就是必須花時(shí)間去排序

?

read_expire

??? 每個(gè)讀操作必須在多少期限內(nèi)得到滿足,默認(rèn)為半秒鐘

?

write_expire

??? 每個(gè)寫操作必須在多久內(nèi)得到滿足,默認(rèn)為5秒鐘

?

#寫操作是可以延遲滿足的

?

writes_starved

??? 定義一批可以處理多少個(gè)讀取批,這個(gè)值越高,讀的效果就越好。默認(rèn)為2,意味著2批讀,一批寫。如果服務(wù)器讀多寫少,內(nèi)存緩沖足夠大,那么可以將其調(diào)大

?

Noop

如果系統(tǒng)與cpu綁定,且使用高速存儲(chǔ)(SSD),這就是最佳的IO調(diào)度程序

只要使用固態(tài)硬盤就要將其改為noop

?

如果調(diào)參數(shù)的話則需要直接去挑戰(zhàn)/sys/block/vda/queue下的參數(shù),而不是調(diào)度器的參數(shù)

?

add_random

??? 其作用是否使用商池

?

max_sectors_kb

??? 默認(rèn)發(fā)送到磁盤的最大請(qǐng)求是多少,默認(rèn)為512kb。我們知道每個(gè)扇區(qū)是512字節(jié),那么每次發(fā)送512kb 意味著發(fā)送N個(gè)扇區(qū),我們可以調(diào)整或增大減小該值,對(duì)于固態(tài)硬盤來(lái)講不是所謂的扇區(qū)概念,由此可調(diào)。

??? 在此類情況下建議將max_hw_sectors_kb降低刪除塊大小

我們可以使用壓力測(cè)試工具對(duì)其做測(cè)試,記錄大小從512kb到1MB不等,哪個(gè)值的效果好就設(shè)置為哪個(gè)值,當(dāng)然壓力測(cè)試跟實(shí)際場(chǎng)景有出入的,所以要充分考慮環(huán)境盡可能模擬真實(shí)場(chǎng)景,盡可能要模擬隨機(jī)讀寫

?

nr_request

??? 請(qǐng)求的隊(duì)列的值,可以降低其值

rotational

??? 如果是SSD硬盤要將此值設(shè)置為0,禁用輪轉(zhuǎn)模式

?

rq_affinity

??? 在觸發(fā)IO不同的CPU中處理IO,一般來(lái)講在同CPU上處理同IO是最好的

??? 因?yàn)镃PU處理的僅僅是中斷而已

?

因此對(duì)于SSD環(huán)境中常用的調(diào)整參數(shù)有:

max_sectors_kb

nr_requests

optimal_io_size

rotational

?

調(diào)整后如何測(cè)試性能是否提高

比較常用的硬盤壓力測(cè)試工具

·aio-stress

·iozone

·fio

?

了解磁盤IO活動(dòng)狀況分析工具

blktrace

?

磁盤IO瓶頸分析工具

blkparse

gnuplot

?本文 來(lái)自http://yijiu.blog.51cto.com 轉(zhuǎn)載 請(qǐng)說(shuō)明,翻版 可恥

?

總結(jié):IO優(yōu)化大致思路

·最好換SSD

·調(diào)整raid級(jí)別

·選擇IO調(diào)度器

·根據(jù)場(chǎng)景選擇合適的文件系統(tǒng)

·配置選定調(diào)度器的參數(shù)

·優(yōu)化結(jié)果是否理想,則使用工具進(jìn)行分析

·寫在開機(jī)啟動(dòng)項(xiàng)里


總結(jié)

以上是生活随笔為你收集整理的Linux优化之IO子系统监控与调优的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。