當前位置:首頁 » 文件管理 » 存儲io不搞為何緩存下不去

存儲io不搞為何緩存下不去

發布時間: 2024-07-25 02:54:09

『壹』 Javaio緩沖區為什麼不直接開辟大空間

Javaio緩沖區不直接開辟大空間原因:有效地管理系統資源,方便用戶使用的程序集合。(操作系統是加在裸機上的第一層軟體,是用戶與計算機的介面)。

當BufferedReader在讀取文本文件時,會先盡量從文件中讀入字元數據並置入緩沖區,如果緩沖區數據不足,才會再從文件中讀取。這里的緩沖區應該是在硬碟中。

使用BufferedWriter時,寫入的數據並不會先輸出到目的地,而是先存儲至緩沖區中。如果緩沖區中的數據滿了,才會一次對目的地進行寫出。這里的緩存區應該在內存中。

原理:

Java把這些不同來源和目標的數據都統一抽象為數據流。Java語言的輸入輸出功能是十分強大而靈活的,美中不足的是看上去輸入輸出的代碼並不是很簡潔,因為你往往需要包裝許多不同的對象。

在Java類庫中,IO部分的內容是很龐大的,因為它涉及的領域很廣泛:標准輸入輸出,文件的操作,網路上的數據流,字元串流,對象流,zip文件流。



『貳』 楂樻墜甯蹇欙細紜鐩樼紦瀛橀敊璇

鍗佸ぇ紜鐩樻晠闅滆В鍐蟲硶
鎴戜滑鍦ㄤ嬌鐢ㄧ‖鐩樼殑鏃跺欙紝甯稿父浼氬嚭鐜頒竴浜涜帿鍚嶅叾濡欑殑闂棰樸備負浜嗘湁鏁堝湴淇濆瓨紜鐩樹腑鐨勬暟鎹錛岄櫎浜嗙粡甯告у湴榪涜屽囦喚宸ヤ綔浠ュ栵紝榪樿佸︿細鍦ㄧ‖鐩樺嚭鐜版晠闅滄椂濡備綍鏁戞椿紜鐩橈紝鎴栬呬粠鍧忕殑鍖哄煙涓鎻愬彇鍑烘湁鐢ㄧ殑鏁版嵁錛屾妸鎹熷け闄嶅埌鏈灝忕▼搴︺傚湪榪欓噷鎴戝氨鏀墮泦浜嗙‖鐩樺父鍑虹幇鐨勬晠闅滆В鍐沖姙娉曪紝渚涘ぇ瀹跺弬鑰冿紝甯屾湜瀵瑰ぇ瀹舵湁鎵甯鍔╋細

涓銆佺郴緇熶笉璁ょ‖鐩

緋葷粺浠庣‖鐩樻棤娉曞惎鍔錛屼粠A鐩樺惎鍔ㄤ篃鏃犳硶榪涘叆C鐩橈紝浣跨敤CMOS涓鐨勮嚜鍔ㄧ洃嫻嬪姛鑳戒篃鏃犳硶鍙戠幇紜鐩樼殑瀛樺湪銆傝繖縐嶆晠闅滃ぇ閮藉嚭鐜板湪榪炴帴鐢電紗鎴朓DE絝鍙d笂錛岀‖鐩樻湰韜鏁呴殰鐨勫彲鑳芥т笉澶э紝鍙閫氳繃閲嶆柊鎻掓帴紜鐩樼數緙嗘垨鑰呮敼鎹IDE鍙e強鐢電紗絳夎繘琛屾浛鎹㈣瘯楠岋紝灝變細寰堝揩鍙戠幇鏁呴殰鐨勬墍鍦ㄣ傚傛灉鏂版帴涓婄殑紜鐩樹篃涓嶈鎺ュ彈錛屼竴涓甯歌佺殑鍘熷洜灝辨槸紜鐩樹笂鐨勪富浠庤煩綰匡紝濡傛灉涓鏉IDE紜鐩樼嚎涓婃帴涓や釜紜鐩樿懼囷紝灝辮佸垎娓呮氫富浠庡叧緋匯

浜屻丆MOS寮曡搗鐨勬晠闅

CMOS涓鐨勭‖鐩樼被鍨嬫g『涓庡惁鐩存帴褰卞搷紜鐩樼殑姝e父浣跨敤銆傜幇鍦ㄧ殑鏈哄櫒閮芥敮鎸佲淚DE Auto Detect鈥濈殑鍔熻兘錛屽彲鑷鍔ㄦ嫻嬬‖鐩樼殑綾誨瀷銆傚綋紜鐩樼被鍨嬮敊璇鏃訛紝鏈夋椂騫茶剢鏃犳硶鍚鍔ㄧ郴緇燂紝鏈夋椂鑳藉熷惎鍔錛屼絾浼氬彂鐢熻誨啓閿欒銆傛瘮濡侰MOS涓鐨勭‖鐩樼被鍨嬪皬浜庡疄闄呯殑紜鐩樺歸噺錛屽垯紜鐩樺悗闈㈢殑鎵囧尯灝嗘棤娉曡誨啓錛屽傛灉鏄澶氬垎鍖虹姸鎬佸垯涓鍒鍒嗗尯灝嗕涪澶便傝繕鏈変竴涓閲嶈佺殑鏁呴殰鍘熷洜錛岀敱浜庣洰鍓嶇殑IDE閮芥敮鎸侀昏緫鍙傛暟綾誨瀷錛岀‖鐩樺彲閲囩敤鈥淣ormal錛孡BA錛孡arge鈥濈瓑錛屽傛灉鍦ㄤ竴鑸鐨勬ā寮忎笅瀹夎呬簡鏁版嵁錛岃屽張鍦–MOS涓鏀逛負鍏跺畠鐨勬ā寮忥紝鍒欎細鍙戠敓紜鐩樼殑璇誨啓閿欒鏁呴殰錛屽洜涓哄叾鏄犲皠鍏崇郴宸茬粡鏀瑰彉錛屽皢鏃犳硶璇誨彇鍘熸潵鐨勬g『紜鐩樹綅緗銆

涓夈佷富寮曞肩▼搴忓紩璧風殑鍚鍔ㄦ晠闅

涓誨紩瀵肩▼搴忎綅浜庣‖鐩樼殑涓誨紩瀵兼墖鍖猴紝涓昏佺敤浜庢嫻嬬‖鐩樺垎鍖虹殑姝g『鎬э紝騫剁『瀹氭椿鍔ㄥ垎鍖猴紝璐熻矗鎶婂紩瀵兼潈縐諱氦緇欐椿鍔ㄥ垎鍖虹殑DOS鎴栧叾浠栨搷浣滅郴緇熴傛ゆ電▼搴忔崯鍧忓皢鏃犳硶浠庣‖鐩樺紩瀵礆紝浣嗕粠杞椹辨垨鍏夐┍鍚鍔ㄤ箣鍚庡彲瀵圭‖鐩樿繘琛岃誨啓銆備慨澶嶆ゆ晠闅滅殑鏂規硶杈冧負綆鍗曪紝浣跨敤楂樼増鏈珼OS鐨凢DISK鏈涓烘柟渚匡紝褰撳甫鍙傛暟/mbr榪愯屾椂錛屽皢鐩存帴鏇存崲(閲嶅啓)紜鐩樼殑涓誨紩瀵肩▼搴忋傚疄闄呬笂紜鐩樼殑涓誨紩瀵兼墖鍖烘f槸姝ょ▼搴忓緩絝嬬殑錛孎DISK.EXE涔嬩腑鍖呭惈鏈夊畬鏁寸殑紜鐩樹富寮曞肩▼搴忋傝櫧鐒禗OS鐗堟湰涓嶆柇鏇存柊錛屼絾紜鐩樼殑涓誨紩瀵肩▼搴忎竴鐩存病鏈夊彉鍖栵紝浠嶥OS 3.x鍒癢indos 95鐨凞OS錛屽彧瑕佹壘鍒頒竴縐岲OS寮曞肩洏鍚鍔ㄧ郴緇熷苟榪愯屾ょ▼搴忓嵆鍙淇澶嶃

鍥涖佸垎鍖鴻〃閿欒寮曞彂鐨勫惎鍔ㄦ晠闅

鍒嗗尯琛ㄩ敊璇鏄紜鐩樼殑涓ラ噸閿欒錛屼笉鍚岀殑閿欒紼嬪害浼氶犳垚涓嶅悓鐨勬崯澶便傚傛灉鏄娌℃湁媧誨姩鍒嗗尯鏍囧織錛屽垯璁$畻鏈烘棤娉曞惎鍔ㄣ備絾浠庤蔣椹辨垨鍏夐┍寮曞肩郴緇熷悗鍙瀵圭‖鐩樿誨啓錛屽彲閫氳繃FDISK閲嶇疆媧誨姩鍒嗗尯榪涜屼慨澶嶃

濡傛灉鏄鏌愪竴鍒嗗尯綾誨瀷閿欒錛屽彲閫犳垚鏌愪竴鍒嗗尯鐨勪涪澶便傚垎鍖鴻〃鐨勭鍥涗釜瀛楄妭涓哄垎鍖虹被鍨嬪礆紝姝e父鐨勫彲寮曞肩殑澶т簬32MB鐨勫熀鏈珼OS鍒嗗尯鍊間負06錛岃屾墿灞曠殑DOS鍒嗗尯鍊兼槸05銆傚緢澶氫漢鍒╃敤姝ょ被鍨嬪煎疄鐜板崟涓鍒嗗尯鐨勫姞瀵嗘妧鏈錛屾仮澶嶅師鏉ョ殑姝g『綾誨瀷鍊煎嵆鍙浣胯ュ垎鍖烘仮澶嶆e父銆

鍒嗗尯琛ㄤ腑榪樻湁鍏跺畠鏁版嵁鐢ㄤ簬璁板綍鍒嗗尯鐨勮搗濮嬫垨緇堟㈠湴鍧銆傝繖浜涙暟鎹鐨勬崯鍧忓皢閫犳垚璇ュ垎鍖虹殑娣蜂貢鎴栦涪澶憋紝鍙鐢ㄧ殑鏂規硶鏄鐢ㄥ囦喚鐨勫垎鍖鴻〃鏁版嵁閲嶆柊鍐欏洖錛屾垨鑰呬粠鍏跺畠鐨勭浉鍚岀被鍨嬬殑騫朵笖鍒嗗尯鐘跺喌鐩稿悓鐨勭‖鐩樹笂鑾峰彇鍒嗗尯琛ㄦ暟鎹銆

鎮㈠嶇殑宸ュ叿鍙閲囩敤NU絳夊伐鍏瘋蔣浠訛紝鎿嶄綔闈炲父鏂逛究銆傚綋鐒朵篃鍙閲囩敤DEBUG榪涜屾搷浣滐紝浣嗘搷浣滅箒鐞愬苟涓斿叿鏈変竴瀹氱殑椋庨櫓銆

浜斻佸垎鍖烘湁鏁堟爣蹇楅敊璇鐨勬晠闅

鍦ㄧ‖鐩樹富寮曞兼墖鍖轟腑榪樺瓨鍦ㄤ竴涓閲嶈佺殑閮ㄥ垎錛岄偅灝辨槸鍏舵渶鍚庣殑涓や釜瀛楄妭錛氣55aa鈥濓紝姝ゅ瓧鑺備負鎵囧尯鐨勬湁鏁堟爣蹇椼傚綋浠庣‖鐩樸佽蔣鐩樻垨鍏夌洏鍚鍔ㄦ椂錛屽皢媯嫻嬭繖涓や釜瀛楄妭錛屽傛灉瀛樺湪鍒欒や負鏈夌‖鐩樺瓨鍦錛屽惁鍒欏皢涓嶆壙璁ょ‖鐩樸傛ゅ勫彲鐢ㄤ簬鏁翠釜紜鐩樼殑鍔犲瘑鎶鏈錛屽彲閲囩敤DEBUG鏂規硶榪涜屾仮澶嶅勭悊銆傚彟澶栵紝褰揇OS寮曞兼墖鍖烘棤寮曞兼爣蹇楁椂錛岀郴緇熷惎鍔ㄥ皢鏄劇ず涓猴細鈥淢missing Operating System鈥濄傛柟渚跨殑鏂規硶鏄浣跨敤涓嬮潰鐨凞OS緋葷粺閫氱敤鐨勪慨澶嶆柟娉曘

鍏銆丏OS寮曞肩郴緇熷紩璧風殑鍚鍔ㄦ晠闅

DOS寮曞肩郴緇熶富瑕佺敱DOS寮曞兼墖鍖哄拰DOS緋葷粺鏂囦歡緇勬垚銆傜郴緇熸枃浠朵富瑕佸寘鎷琁O.SYS銆丮SDOS.SYS銆丆OMMAND.COM錛屽叾涓瑿OMMAND.COM鏄疍OS鐨勫栧3鏂囦歡錛屽彲鐢ㄥ叾瀹冪殑鍚岀被鏂囦歡鏇挎崲錛屼絾緙虹渷鐘舵佷笅鏄疍OS鍚鍔ㄧ殑蹇呭囨枃浠躲傚湪Windows 95鎼哄甫鐨凞OS緋葷粺涓錛孧SDOS.SYS鏄涓涓鏂囨湰鏂囦歡錛屾槸鍚鍔╓indows蹇呴』鐨勬枃浠訛紝浣嗗彧鍚鍔―OS鏃跺彲涓嶇敤姝ゆ枃浠躲侱OS寮曞煎嚭閿欐椂錛屽彲浠庤蔣鐩樻垨鍏夌洏寮曞肩郴緇熷悗浣跨敤SYS C:鍛戒護浼犻佺郴緇燂紝鍗沖彲淇澶嶆晠闅滐紝鍖呮嫭寮曞兼墖鍖哄強緋葷粺鏂囦歡閮藉彲鑷鍔ㄤ慨澶嶅埌姝e父鐘舵併

涓冦丗AT琛ㄥ紩璧風殑璇誨啓鏁呴殰

FAT琛ㄨ板綍鐫紜鐩樻暟鎹鐨勫瓨鍌ㄥ湴鍧錛屾瘡涓涓鏂囦歡閮芥湁涓緇凢AT閾炬寚瀹氬叾瀛樻斁鐨勭皣鍦板潃銆侳AT琛ㄧ殑鎹熷潖鎰忓懗鐫鏂囦歡鍐呭圭殑涓㈠け銆傚簡騫哥殑鏄疍OS緋葷粺鏈韜鎻愪緵浜嗕袱涓狥AT琛錛屽傛灉鐩鍓嶄嬌鐢ㄧ殑FAT琛ㄦ崯鍧忥紝鍙鐢ㄧ浜屼釜榪涜岃嗙洊淇澶嶃備絾鐢變簬涓嶅悓瑙勬牸鐨勭佺洏鍏禙AT琛ㄧ殑闀垮害鍙婄浜屼釜FAT琛ㄧ殑鍦板潃涔熸槸涓嶅滻瀹氱殑錛屾墍浠ヤ慨澶嶆椂蹇呴』姝g『鏌ユ壘鍏舵g『浣嶇疆錛屼竴浜涘伐鍏瘋蔣浠跺侼U絳夋湰韜鍏鋒湁榪欐牱鐨勪慨澶嶅姛鑳斤紝浣跨敤涔熼潪甯哥殑鏂逛究銆傞噰鐢―EBUG涔熷彲瀹炵幇榪欑嶆搷浣滐紝鍗抽噰鐢ㄥ叾m鍛戒護鎶婄浜屼釜FAT琛ㄧЩ鍒扮涓涓琛ㄥ勫嵆鍙銆傚傛灉絎浜屼釜FAT琛ㄤ篃鎹熷潖浜嗭紝鍒欎篃鏃犳硶鎶婄‖鐩樻仮澶嶅埌鍘熸潵鐨勭姸鎬侊紝浣嗘枃浠剁殑鏁版嵁浠嶇劧瀛樻斁鍦ㄧ‖鐩樼殑鏁版嵁鍖轟腑錛屽彲閲囩敤CHKDSK鎴朣CANDISK鍛戒護榪涜屼慨澶嶏紝鏈緇堝緱鍒*.CHK鏂囦歡錛岃繖渚挎槸涓㈠けFAT閾劇殑鎵囧尯鏁版嵁銆傚傛灉鏄鏂囨湰鏂囦歡鍒欏彲浠庝腑鎻愬彇鍑哄畬鏁寸殑鎴栭儴鍒嗙殑鏂囦歡鍐呭廣

鍏銆佺洰褰曡〃鎹熷潖寮曡搗鐨勫紩瀵兼晠闅

鐩褰曡〃璁板綍鐫紜鐩樹腑鏂囦歡鐨勬枃浠跺悕絳夋暟鎹錛屽叾涓鏈閲嶈佺殑涓欏規槸璇ユ枃浠剁殑璧峰嬬皣鍙楓傜洰褰曡〃鐢變簬娌℃湁鑷鍔ㄥ囦喚鍔熻兘錛屾墍浠ュ傛灉鐩褰曟崯鍧忓皢涓㈠け澶ч噺鐨勬枃浠躲備竴縐嶅噺灝戞崯澶辯殑鏂規硶涔熸槸閲囩敤CHKDSK鎴朣CANDISK紼嬪簭鎮㈠嶇殑鏂規硶錛屼粠紜鐩樹腑鎼滅儲鍑*.CHK鏂囦歡錛岀敱浜庣洰褰曡〃鎹熷潖鏃朵粎鏄棣栫皣鍙蜂涪澶憋紝姣忎竴涓*..CHK鏂囦歡鍗蟲槸涓涓瀹屾暣鐨勬枃浠訛紝鎶婂叾鏀逛負鍘熸潵鐨勫悕瀛楀嵆鍙鎮㈠嶅ぇ澶氭暟鏂囦歡銆

涔濄佽鍒犻櫎鍒嗗尯鏃舵暟鎹鐨勬仮澶

褰撶敤FDISK鍒犻櫎浜嗙‖鐩樺垎鍖轟箣鍚庯紝琛ㄩ潰涓婃槸紜鐩樹腑鐨勬暟鎹宸茬粡瀹屽叏娑堝け錛屽湪鏈鏍煎紡鍖栨椂榪涘叆紜鐩樹細鏄劇ず涓烘棤鏁堥┍鍔ㄥ櫒銆傚傛灉浜嗚ВFDISK鐨勫伐浣滃師鐞嗭紝灝變細鐭ラ亾FDISK鍙鏄閲嶆柊鏀瑰啓浜嗙‖鐩樼殑涓誨紩瀵兼墖鍖(0闈0閬1鎵囧尯)涓鐨勫唴瀹癸紝鍏蜂綋璇村氨鏄鍒犻櫎浜嗙‖鐩樺垎鍖鴻〃淇℃伅錛岃岀‖鐩樹腑鐨勪換浣曞垎鍖虹殑鏁版嵁鍧囨病鏈夋敼鍙樸傚彲浠跨収涓婅堪鐨勫垎鍖鴻〃閿欒鐨勪慨澶嶆柟娉曪紝鍗蟲兂鍔炴硶鎮㈠嶅垎鍖鴻〃鏁版嵁鍗沖彲鎮㈠嶅師鏉ョ殑鍒嗗尯鍙婃暟鎹銆傚傛灉宸茬粡瀵瑰垎鍖烘牸寮忓寲錛屽湪鍏堟仮澶嶅垎鍖哄悗錛屽彲鎸変笅闈㈢殑鏂規硶鎮㈠嶅垎鍖烘暟鎹銆

鍗併佽鏍煎紡鍖栫‖鐩樻暟鎹鐨勬仮澶

鍦―OS楂樼増鏈鐘舵佷笅錛宖ormAT鏍煎紡鍖栨搷浣滃湪緙虹渷鐘舵佷笅閮藉緩絝嬩簡鐢ㄤ簬鎮㈠嶆牸寮忓寲鐨勭佺洏淇℃伅錛屽疄闄呬笂鏄鎶婄佺洏鐨凞OS寮曞兼墖鍖恆丗AT鍒嗗尯琛ㄥ強鐩褰曡〃鐨勬墍鏈夊唴瀹瑰嶅埗鍒頒簡紓佺洏鐨勬渶鍚庡嚑涓鎵囧尯涓(鍥犱負鍚庨潰鐨勬墖鍖哄緢灝戜嬌鐢)錛岃屾暟鎹鍖轟腑鐨勫唴瀹規牴鏈娌℃湁鏀瑰彉銆傝繖鏍烽氳繃榪愯孶NformAT鍛戒護鍗沖彲鎮㈠嶃傚彟澶朌OS榪樻彁渚涗簡涓涓狹IROR鍛戒護鐢ㄤ簬璁板綍褰撳墠紓佺洏鐨勪俊鎮錛屼緵鏍煎紡鍖栨垨鍒犻櫎涔嬪悗鐨勬仮澶嶄嬌鐢錛屾ゆ柟娉曚篃姣旇緝鏈夋晥銆

『叄』 求教無緩沖 IO 與緩沖 IO 的區別~

fopen與open的區別- -

1.緩沖文件系統

緩沖文件系統的特點是:在內存開辟一個「緩沖區」,為程序中的每一個文件使用,當執行讀文件的操作時,從磁碟文件將數據先讀入內存「緩沖區」,裝滿後再從內存「緩沖區」依此讀入接收的變數。執行寫文件的操作時,先將數據寫入內存「緩沖區」,待內存「緩沖區」裝滿後再寫入文件。由此可以看出,內存「緩沖區」的大小,影響著實際操作外存的次數,內存「緩沖區」越大,則操作外存的次數就少,執行速度就快、效率高。一般來說,文件「緩沖區」的大小隨機器而定。

fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等

2.非緩沖文件系統

緩沖文件系統是藉助文件結構體指針來對文件進行管理,通過文件指針來對文件進行訪問,既可以讀寫字元、字元串、格式化數據,也可以讀寫二進制數據。非緩沖文件系統依賴於操作系統,通過操作系統的功能對文件進行讀寫,是系統級的輸入輸出,它不設文件結構體指針,但效率高、速度快,由於ANSI標准不再包括非緩沖文件系統,因此建議大家最好不要選擇它。

open, close, read, write, getc, getchar, putc, putchar 等

『肆』 濡備綍鎻愰珮Linux涓嬪潡璁懼嘔O鐨勬暣浣撴ц兘

鍓嶈█錛氭湰鏂囦富瑕佽茶ВLinux IO璋冨害灞傜殑涓夌嶆ā寮忥細cfp銆乨eadline鍜宯oop錛屽苟緇欏嚭鍚勮嚜鐨勪紭鍖栧拰閫傜敤鍦烘櫙寤鴻銆
IO璋冨害鍙戠敓鍦↙inux鍐呮牳鐨処O璋冨害灞傘傝繖涓灞傛℃槸閽堝筁inux鐨勬暣浣揑O灞傛′綋緋繪潵璇寸殑銆備粠read()鎴栬厀rite()緋葷粺璋冪敤鐨勮掑害鏉ヨ達紝Linux鏁翠綋IO浣撶郴鍙浠ュ垎涓轟竷灞傦紝瀹冧滑鍒嗗埆鏄錛
VFS灞傦細 鉶氭嫙鏂囦歡緋葷粺灞傘傜敱浜庡唴鏍歌佽窡澶氱嶆枃浠剁郴緇熸墦浜ら亾錛岃屾瘡涓縐嶆枃浠剁郴緇熸墍瀹炵幇鐨勬暟鎹緇撴瀯鍜岀浉鍏蟲柟娉曢兘鍙鑳戒笉灝界浉鍚岋紝鎵浠ワ紝鍐呮牳鎶借薄浜嗚繖涓灞傦紝涓撻棬鐢ㄦ潵閫傞厤鍚勭嶆枃浠剁郴緇燂紝騫跺瑰栨彁渚涚粺涓鎿嶄綔鎺ュ彛銆
鏂囦歡緋葷粺灞傦細 涓嶅悓鐨勬枃浠剁郴緇熷疄鐜拌嚜宸辯殑鎿嶄綔榪囩▼錛屾彁渚涜嚜宸辯壒鏈夌殑鐗瑰緛錛屽叿浣撲笉澶氳翠簡錛屽ぇ瀹舵効鎰忕殑璇濊嚜宸卞幓鐪嬩唬鐮佸嵆鍙銆
欏電紦瀛樺眰錛 璐熻矗鐪熷筽age鐨勭紦瀛樸
閫氱敤鍧楀眰錛 鐢變簬緇濆ぇ澶氭暟鎯呭喌鐨剗o鎿嶄綔鏄璺熷潡璁懼囨墦浜ら亾錛屾墍浠Linux鍦ㄦゆ彁渚涗簡涓涓綾諱技vfs灞傜殑鍧楄懼囨搷浣滄娊璞″眰銆備笅灞傚規帴鍚勭嶄笉鍚屽睘鎬х殑鍧楄懼囷紝瀵逛笂鎻愪緵緇熶竴鐨凚lock IO璇鋒眰鏍囧噯銆
IO璋冨害灞 錛氬洜涓虹粷澶у氭暟鐨勫潡璁懼囬兘鏄綾諱技紓佺洏榪欐牱鐨勮懼囷紝鎵浠ユ湁蹇呰佹牴鎹榪欑被璁懼囩殑鐗圭偣浠ュ強搴旂敤鐨勪笉鍚岀壒鐐規潵璁劇疆涓浜涗笉鍚岀殑璋冨害綆楁硶鍜岄槦鍒椼備互渚垮湪涓嶅悓鐨勫簲鐢ㄧ幆澧冧笅鏈夐拡瀵規х殑鎻愰珮紓佺洏鐨勮誨啓鏁堢巼錛岃繖閲屽氨鏄澶у悕榧庨紟鐨凩inux鐢墊鎵璧蜂綔鐢ㄧ殑鍦版柟銆傞拡瀵規満姊扮‖鐩樼殑鍚勭嶈皟搴︽柟娉曞氨鏄鍦ㄨ繖瀹炵幇鐨勩
鍧楄懼囬┍鍔ㄥ眰錛 椹卞姩灞傚瑰栨彁渚涚浉瀵規瘮杈冮珮綰х殑璁懼囨搷浣滄帴鍙o紝寰寰鏄疌璇璦鐨勶紝鑰屼笅灞傚規帴璁懼囨湰韜鐨勬搷浣滄柟娉曞拰瑙勮寖銆
鍧楄懼囧眰錛 榪欏眰灝辨槸鍏蜂綋鐨勭墿鐞嗚懼囦簡錛屽畾涔変簡鍚勭嶇湡瀵硅懼囨搷浣滄柟娉曞拰瑙勮寖銆
鏈変竴涓宸茬粡鏁寸悊濂界殑[Linux IO緇撴瀯鍥綸錛岄潪甯哥粡鍏革紝涓鍥捐儨鍗冭█錛

鎴戜滑浠婂ぉ瑕佺爺絀剁殑鍐呭逛富瑕佸湪IO璋冨害榪欎竴灞傘
瀹冭佽В鍐崇殑鏍稿績闂棰樻槸錛屽備綍鎻愰珮鍧楄懼嘔O鐨勬暣浣撴ц兘錛熻繖涓灞備篃涓昏佹槸閽堝規満姊扮‖鐩樼粨鏋勮岃捐$殑銆
浼楁墍鍛ㄧ煡錛屾満姊扮‖鐩樼殑瀛樺偍浠嬭川鏄紓佺洏錛岀佸ご鍦ㄧ洏鐗囦笂縐誨姩榪涜岀侀亾瀵誨潃錛岃屼負綾諱技鎾鏀句竴寮犲敱鐗囥
榪欑嶇粨鏋勭殑鐗圭偣鏄錛岄『搴忚塊棶鏃跺悶鍚愰噺杈冮珮錛屼絾鏄濡傛灉涓鏃﹀圭洏鐗囨湁闅忔満璁塊棶錛岄偅涔堝ぇ閲忕殑鏃墮棿閮戒細嫻璐瑰湪紓佸ご鐨勭Щ鍔ㄤ笂錛岃繖鏃跺欏氨浼氬艱嚧姣忔IO鐨勫搷搴旀椂闂村彉闀匡紝鏋佸ぇ鐨勯檷浣嶪O鐨勫搷搴旈熷害銆
紓佸ご鍦ㄧ洏鐗囦笂瀵婚亾鐨勬搷浣滐紝綾諱技鐢墊璋冨害錛屽疄闄呬笂鍦ㄦ渶寮濮嬬殑鏃舵湡錛孡inux鎶婅繖涓綆楁硶鍛藉悕涓篖inux鐢墊綆楁硶錛屽嵆錛
濡傛灉鍦ㄥ婚亾鐨勮繃紼嬩腑錛岃兘鎶婇『搴忚礬榪囩殑鐩稿叧紓侀亾鐨勬暟鎹璇鋒眰閮解滈『渚庫濆勭悊鎺夛紝閭d箞灝卞彲浠ュ湪姣旇緝灝忓獎鍝嶅搷搴旈熷害鐨勫墠鎻愪笅錛屾彁楂樻暣浣揑O鐨勫悶鍚愰噺銆
榪欏氨鏄鎴戜滑涓轟粈涔堣佽捐IO璋冨害綆楁硶鐨勫師鍥犮
鐩鍓嶅湪鍐呮牳涓榛樿ゅ紑鍚浜嗕笁縐嶇畻娉/妯″紡錛歯oop錛宑fq鍜宒eadline銆備弗鏍肩畻搴旇ユ槸涓ょ嶏細
鍥犱負絎涓縐嶅彨鍋歯oop錛屽氨鏄絀烘搷浣滆皟搴︾畻娉曪紝涔熷氨鏄娌℃湁浠諱綍璋冨害鎿嶄綔錛屽苟涓嶅筰o璇鋒眰榪涜屾帓搴忥紝浠呬粎鍋氶傚綋鐨剗o鍚堝苟鐨勪竴涓猣ifo闃熷垪銆
鐩鍓嶅唴鏍鎬腑榛樿ょ殑璋冨害綆楁硶搴旇ユ槸cfq錛屽彨鍋氬畬鍏ㄥ叕騫抽槦鍒楄皟搴︺傝繖涓璋冨害綆楁硶浜哄傚叾鍚嶏紝瀹冭瘯鍥劇粰鎵鏈夎繘紼嬫彁渚涗竴涓瀹屽叏鍏騫崇殑IO鎿嶄綔鐜澧冦
娉錛氳峰ぇ瀹朵竴瀹氳頒綇榪欎釜璇嶈錛宑fq錛屽畬鍏ㄥ叕騫抽槦鍒楄皟搴︼紝涓嶇劧涓嬫枃灝辨病娉曠湅浜嗐
cfq涓烘瘡涓榪涚▼鍒涘緩涓涓鍚屾IO璋冨害闃熷垪錛屽苟榛樿や互鏃墮棿鐗囧拰璇鋒眰鏁伴檺瀹氱殑鏂瑰紡鍒嗛厤IO璧勬簮錛屼互姝や繚璇佹瘡涓榪涚▼鐨処O璧勬簮鍗犵敤鏄鍏騫崇殑錛宑fq榪樺疄鐜頒簡閽堝硅繘紼嬬駭鍒鐨勪紭鍏堢駭璋冨害錛岃繖涓鎴戜滑鍚庨潰浼氳︾粏瑙i噴銆
鏌ョ湅鍜屼慨鏀笽O璋冨害綆楁硶鐨勬柟娉曟槸錛

cfq鏄閫氱敤鏈嶅姟鍣ㄦ瘮杈冨ソ鐨処O璋冨害綆楁硶閫夋嫨錛屽規岄潰鐢ㄦ埛涔熸槸姣旇緝濂界殑閫夋嫨銆
浣嗘槸瀵逛簬寰堝欼O鍘嬪姏杈冨ぇ鐨勫満鏅灝卞苟涓嶆槸寰堥傚簲錛屽挨鍏舵槸IO鍘嬪姏闆嗕腑鍦ㄦ煇浜涜繘紼嬩笂鐨勫満鏅銆
鍥犱負榪欑嶅満鏅鎴戜滑闇瑕佹洿澶氱殑婊¤凍鏌愪釜鎴栬呮煇鍑犱釜榪涚▼鐨処O鍝嶅簲閫熷害錛岃屼笉鏄璁╂墍鏈夌殑榪涚▼鍏騫崇殑浣跨敤IO錛屾瘮濡傛暟鎹搴撳簲鐢ㄣ
deadline璋冨害錛堟渶緇堟湡闄愯皟搴︼級灝辨槸鏇撮傚悎涓婅堪鍦烘櫙鐨勮В鍐蟲柟妗堛俤eadline瀹炵幇浜嗗洓涓闃熷垪錛
鍏朵腑涓や釜鍒嗗埆澶勭悊姝e父read鍜寃rite錛屾寜鎵囧尯鍙鋒帓搴忥紝榪涜屾e父io鐨勫悎騫跺勭悊浠ユ彁楂樺悶鍚愰噺銆傚洜涓篒O璇鋒眰鍙鑳戒細闆嗕腑鍦ㄦ煇浜涚佺洏浣嶇疆錛岃繖鏍蜂細瀵艱嚧鏂版潵鐨勮鋒眰涓鐩磋鍚堝苟錛屽彲鑳戒細鏈夊叾浠栫佺洏浣嶇疆鐨剗o璇鋒眰琚楗挎匯
鍙﹀栦袱涓澶勭悊瓚呮椂read鍜寃rite鐨勯槦鍒楋紝鎸夎鋒眰鍒涘緩鏃墮棿鎺掑簭錛屽傛灉鏈夎秴鏃剁殑璇鋒眰鍑虹幇錛屽氨鏀捐繘榪欎袱涓闃熷垪錛岃皟搴︾畻娉曚繚璇佽秴鏃訛紙杈懼埌鏈緇堟湡闄愭椂闂達級鐨勯槦鍒椾腑鐨勮鋒眰浼氫紭鍏堣澶勭悊錛岄槻姝㈣鋒眰琚楗挎匯
涓嶄箙鍓嶏紝鍐呮牳榪樻槸榛樿ゆ爣閰嶅洓縐嶇畻娉曪紝榪樻湁涓縐嶅彨鍋歛s鐨勭畻娉曪紙Anticipatory scheler錛夛紝棰勬祴璋冨害綆楁硶銆備竴涓楂樺ぇ涓婄殑鍚嶅瓧錛屾悶寰楁垜涓搴﹁や負Linux鍐呮牳閮戒細綆楀懡浜嗐
緇撴灉鍙戠幇錛屾棤闈炴槸鍦ㄥ熀浜巇eadline綆楁硶鍋歩o璋冨害鐨勪箣鍓嶇瓑涓灝忎細鏃墮棿錛屽傛灉榪欐墊椂闂村唴鏈夊彲浠ュ悎騫剁殑io璇鋒眰鍒版潵錛屽氨鍙浠ュ悎騫跺勭悊錛屾彁楂榙eadline璋冨害鐨勫湪欏哄簭璇誨啓鎯呭喌涓嬬殑鏁版嵁鍚炲悙閲忋
鍏跺疄榪欐牴鏈涓嶆槸鍟ラ勬祴錛屾垜瑙夊緱涓嶅傚彨鎾炲ぇ榪愯皟搴︾畻娉曪紝褰撶劧榪欑嶇瓥鐣ュ湪鏌愪簺鐗瑰畾鍦烘櫙宸鏁堟灉涓嶉敊銆
浣嗘槸鍦ㄥぇ澶氭暟鍦烘櫙涓嬶紝榪欎釜璋冨害涓嶄粎娌℃湁鎻愰珮鍚炲悙閲忥紝榪橀檷浣庝簡鍝嶅簲閫熷害錛屾墍浠ュ唴鏍稿共鑴嗘妸瀹冧粠榛樿ら厤緗閲屽垹闄や簡銆傛瘯絝烲inux鐨勫畻鏃ㄦ槸瀹炵敤錛岃屾垜浠涔熷氨涓嶅啀榪欎釜璋冨害綆楁硶涓婂氳垂鍙h垖浜嗐
1銆乧fq錛氬畬鍏ㄥ叕騫抽槦鍒楄皟搴
cfq鏄鍐呮牳榛樿ら夋嫨鐨処O璋冨害闃熷垪錛屽畠鍦ㄦ岄潰搴旂敤鍦烘櫙浠ュ強澶у氭暟甯歌佸簲鐢ㄥ満鏅涓嬮兘鏄寰堝ソ鐨勯夋嫨銆
濡備綍瀹炵幇涓涓鎵璋撶殑瀹屽叏鍏騫抽槦鍒楋紙Completely Fair Queueing錛夛紵
棣栧厛鎴戜滑瑕佺悊瑙f墍璋撶殑鍏騫蟲槸瀵硅皝鐨勫叕騫籌紵浠庢搷浣滅郴緇熺殑瑙掑害鏉ヨ達紝浜х敓鎿嶄綔琛屼負鐨勪富浣撻兘鏄榪涚▼錛屾墍浠ヨ繖閲岀殑鍏騫蟲槸閽堝規瘡涓榪涚▼鑰岃█鐨勶紝鎴戜滑瑕佽瘯鍥捐╄繘紼嬪彲浠ュ叕騫崇殑鍗犵敤IO璧勬簮銆
閭d箞濡備綍璁╄繘紼嬪叕騫崇殑鍗犵敤IO璧勬簮錛熸垜浠闇瑕佸厛鐞嗚В浠涔堟槸IO璧勬簮銆傚綋鎴戜滑琛¢噺涓涓狪O璧勬簮鐨勬椂鍊欙紝涓鑸鍠滄㈢敤鐨勬槸涓や釜鍗曚綅錛屼竴涓鏄鏁版嵁璇誨啓鐨勫甫瀹斤紝鍙︿竴涓鏄鏁版嵁璇誨啓鐨処OPS銆
甯﹀藉氨鏄浠ユ椂闂翠負鍗曚綅鐨勮誨啓鏁版嵁閲忥紝姣斿傦紝100Mbyte/s銆傝孖OPS鏄浠ユ椂闂翠負鍗曚綅鐨勮誨啓嬈℃暟銆傚湪涓嶅悓鐨勮誨啓鎯呭冧笅錛岃繖涓や釜鍗曚綅鐨勮〃鐜板彲鑳戒笉涓鏍鳳紝浣嗘槸鍙浠ョ『瀹氱殑鏄錛屼袱涓鍗曚綅鐨勪換浣曚竴涓杈懼埌浜嗘ц兘涓婇檺錛岄兘浼氭垚涓篒O鐨勭摱棰堛
浠庢満姊扮‖鐩樼殑緇撴瀯鑰冭檻錛屽傛灉璇誨啓鏄欏哄簭璇誨啓錛岄偅涔圛O鐨勮〃鐜版槸鍙浠ラ氳繃姣旇緝灝戠殑IOPS杈懼埌杈冨ぇ鐨勫甫瀹斤紝鍥犱負鍙浠ュ悎騫跺緢澶欼O錛屼篃鍙浠ラ氳繃棰勮葷瓑鏂瑰紡鍔犻熸暟鎹璇誨彇鏁堢巼銆
褰揑O鐨勮〃鐜版槸鍋忓悜浜庨殢鏈鴻誨啓鐨勬椂鍊欙紝閭d箞IOPS灝變細鍙樺緱鏇村ぇ錛孖O鐨勮鋒眰鐨勫悎騫跺彲鑳芥т笅闄嶏紝褰撴瘡嬈io璇鋒眰鏁版嵁瓚婂皯鐨勬椂鍊欙紝甯﹀借〃鐜板氨浼氳秺浣庛
浠庤繖閲屾垜浠鍙浠ョ悊瑙o紝閽堝硅繘紼嬬殑IO璧勬簮鐨勪富瑕佽〃鐜板艦寮忔湁涓や釜錛 榪涚▼鍦ㄥ崟浣嶆椂闂村唴鎻愪氦鐨処O璇鋒眰涓鏁板拰榪涚▼鍗犵敤IO鐨勫甫瀹姐
鍏跺疄鏃犺哄摢涓錛岄兘鏄璺熻繘紼嬪垎閰嶇殑IO澶勭悊鏃墮棿闀垮害緔у瘑鐩稿叧鐨勩
鏈夋椂涓氬姟鍙浠ュ湪杈冨皯IOPS鐨勬儏鍐典笅鍗犵敤杈冨ぇ甯﹀斤紝鍙﹀栦竴浜涘垯鍙鑳藉湪杈冨ぇIOPS鐨勬儏鍐典笅鍗犵敤杈冨皯甯﹀斤紝鎵浠ュ硅繘紼嬪崰鐢↖O鐨勬椂闂磋繘琛岃皟搴︽墠鏄鐩稿規渶鍏騫崇殑銆
鍗籌紝鎴戜笉綆′綘鏄疘OPS楂樿繕鏄甯﹀藉崰鐢ㄩ珮錛屽埌浜嗘椂闂村挶灝辨崲涓嬩竴涓榪涚▼澶勭悊錛屼綘鐖卞拫鏍峰拫鏍楓
鎵浠ワ紝cfq灝辨槸璇曞浘緇欐墍鏈夎繘紼嬪垎閰嶇瓑鍚岀殑鍧楄懼囦嬌鐢ㄧ殑鏃墮棿鐗囷紝榪涚▼鍦ㄦ椂闂寸墖鍐咃紝鍙浠ュ皢浜х敓鐨処O璇鋒眰鎻愪氦緇欏潡璁懼囪繘琛屽勭悊錛屾椂闂寸墖緇撴潫錛岃繘紼嬬殑璇鋒眰灝嗘帓榪涘畠鑷宸辯殑闃熷垪錛岀瓑寰呬笅嬈¤皟搴︾殑鏃跺欒繘琛屽勭悊銆傝繖灝辨槸cfq鐨勫熀鏈鍘熺悊銆
褰撶劧錛岀幇瀹炵敓媧諱腑涓嶅彲鑳芥湁鐪熸g殑鈥滃叕騫斥濓紝甯歌佺殑搴旂敤鍦烘櫙涓嬶紝鎴戜滑寰堣偗鑳介渶瑕佷漢涓虹殑瀵硅繘紼嬬殑IO鍗犵敤榪涜屼漢涓烘寚瀹氫紭鍏堢駭錛岃繖灝卞儚瀵硅繘紼嬬殑CPU鍗犵敤璁劇疆浼樺厛綰х殑姒傚康涓鏍楓
鎵浠ワ紝闄や簡閽堝規椂闂寸墖榪涜屽叕騫抽槦鍒楄皟搴﹀栵紝cfq榪樻彁渚涗簡浼樺厛綰ф敮鎸併傛瘡涓榪涚▼閮藉彲浠ヨ劇疆涓涓狪O浼樺厛綰э紝cfq浼氭牴鎹榪欎釜浼樺厛綰х殑璁劇疆鎯呭喌浣滀負璋冨害鏃剁殑閲嶈佸弬鑰冨洜緔犮
浼樺厛綰ч栧厛鍒嗘垚涓夊ぇ綾伙細RT銆丅E銆両DLE錛屽畠浠鍒嗗埆鏄瀹炴椂錛圧eal Time錛夈佹渶浣蟲晥鏋滐紙Best Try錛夊拰闂茬疆錛圛dle錛変笁涓綾誨埆錛屽規瘡涓綾誨埆鐨処O錛宑fq閮戒嬌鐢ㄤ笉鍚岀殑絳栫暐榪涜屽勭悊銆傚彟澶栵紝RT鍜孊E綾誨埆涓錛屽垎鍒鍙堝啀鍒掑垎浜8涓瀛愪紭鍏堢駭瀹炵幇鏇寸粏鑺傜殑QOS闇奼傦紝鑰孖DLE鍙鏈変竴涓瀛愪紭鍏堢駭銆
鍙﹀栵紝鎴戜滑閮界煡閬撳唴鏍擱粯璁ゅ瑰瓨鍌ㄧ殑璇誨啓閮芥槸緇忚繃緙撳瓨錛坆uffer/cache錛夌殑錛屽湪榪欑嶆儏鍐典笅錛宑fq鏄鏃犳硶鍖哄垎褰撳墠澶勭悊鐨勮鋒眰鏄鏉ヨ嚜鍝涓涓榪涚▼鐨勩
鍙鏈夊湪榪涚▼浣跨敤鍚屾ユ柟寮忥紙sync read鎴栬卻ync wirte錛夋垨鑰呯洿鎺IO錛圖irect IO錛夋柟寮忚繘琛岃誨啓鐨勬椂鍊欙紝cfq鎵嶈兘鍖哄垎鍑篒O璇鋒眰鏉ヨ嚜鍝涓榪涚▼銆
鎵浠ワ紝闄や簡閽堝規瘡涓榪涚▼瀹炵幇鐨処O闃熷垪浠ュ栵紝榪樺疄鐜頒簡涓涓鍏鍏辯殑闃熷垪鐢ㄦ潵澶勭悊寮傛ヨ鋒眰銆
褰撳墠鍐呮牳宸茬粡瀹炵幇浜嗛拡瀵笽O璧勬簮鐨刢group璧勬簮闅旂伙紝鎵浠ュ湪浠ヤ笂浣撶郴鐨勫熀紜涓婏紝cfq涔熷疄鐜頒簡閽堝筩group鐨勮皟搴︽敮鎸併
鎬葷殑鏉ヨ達紝cfq鐢ㄤ簡涓緋誨垪鐨勬暟鎹緇撴瀯瀹炵幇浜嗕互涓婃墍鏈夊嶆潅鍔熻兘鐨勬敮鎸侊紝澶у跺彲浠ラ氳繃婧愪唬鐮佺湅鍒板叾鐩稿叧瀹炵幇錛屾枃浠跺湪婧愪唬鐮佺洰褰曚笅鐨刡lock/cfq-iosched.c銆
1.1 cfq璁捐″師鐞
鍦ㄦわ紝鎴戜滑瀵規暣浣撴暟鎹緇撴瀯鍋氫竴涓綆瑕佹弿榪幫細棣栧厛錛宑fq閫氳繃涓涓鍙鍋歝fq_data鐨勬暟鎹緇撴瀯緇存姢浜嗘暣涓璋冨害鍣ㄦ祦紼嬨傚湪涓涓鏀鎸佷簡cgroup鍔熻兘鐨刢fq涓錛屽叏閮ㄨ繘紼嬭鍒嗘垚浜嗚嫢騫蹭釜contral group榪涜岀$悊銆
姣忎釜cgroup鍦╟fq涓閮芥湁涓涓猚fq_group鐨勭粨鏋勮繘琛屾弿榪幫紝鎵鏈夌殑cgroup閮借浣滀負涓涓璋冨害瀵硅薄鏀捐繘涓涓綰㈤粦鏍戜腑錛屽苟浠vdisktime涓簁ey榪涜屾帓搴忋
vdisktime榪欎釜鏃墮棿綰褰曠殑鏄褰撳墠cgroup鎵鍗犵敤鐨剗o鏃墮棿錛屾瘡嬈″筩group榪涜岃皟搴︽椂錛屾繪槸閫氳繃綰㈤粦鏍戦夋嫨褰撳墠vdisktime鏃墮棿鏈灝戠殑cgroup榪涜屽勭悊錛屼互淇濊瘉鎵鏈塩groups涔嬮棿鐨処O璧勬簮鍗犵敤鈥滃叕騫斥濄
褰撶劧鎴戜滑鐭ラ亾錛宑group鏄鍙浠ュ筨lkio榪涜岃祫婧愭瘮渚嬪垎閰嶇殑錛屽叾浣滅敤鍘熺悊灝辨槸錛屽垎閰嶆瘮渚嬪ぇ鐨刢group鍗犵敤vdisktime鏃墮棿澧為暱杈冩參錛屽垎閰嶆瘮渚嬪皬鐨剉disktime鏃墮棿澧為暱杈冨揩錛屽揩鎱涓庡垎閰嶆瘮渚嬫垚姝f瘮銆
榪欐牱灝卞仛鍒頒簡涓嶅悓鐨刢group鍒嗛厤鐨処O姣斾緥涓嶄竴鏍鳳紝騫朵笖鍦╟fq鐨勮掑害鐪嬫潵渚濈劧鏄鈥滃叕騫斥滅殑銆
閫夋嫨濂戒簡闇瑕佸勭悊鐨刢group錛坈fq_group錛変箣鍚庯紝璋冨害鍣ㄩ渶瑕佸喅絳栭夋嫨涓嬩竴姝ョ殑service_tree銆
service_tree榪欎釜鏁版嵁緇撴瀯瀵瑰簲鐨勯兘鏄涓緋誨垪鐨勭孩榛戞爲錛屼富瑕佺洰鐨勬槸鐢ㄦ潵瀹炵幇璇鋒眰浼樺厛綰у垎綾葷殑錛屽氨鏄疪T銆丅E銆両DLE鐨勫垎綾匯傛瘡涓涓猚fq_group閮界淮鎶や簡7涓猻ervice_trees錛屽叾瀹氫箟濡備笅錛

鍏朵腑service_tree_idle灝辨槸鐢ㄦ潵緇橧DLE綾誨瀷鐨勮鋒眰榪涜屾帓闃熺敤鐨勭孩榛戞爲銆
鑰屼笂闈浜岀淮鏁扮粍錛岄栧厛絎涓涓緇村害閽堝筊T鍜孊E鍒嗗埆鍚勫疄鐜頒簡涓涓鏁扮粍錛屾瘡涓涓鏁扮粍涓閮界淮鎶や簡涓変釜綰㈤粦鏍戱紝鍒嗗埆瀵瑰簲涓夌嶄笉鍚屽瓙綾誨瀷鐨勮鋒眰錛屽垎鍒鏄錛歋YNC銆丼YNC_NOIDLE浠ュ強ASYNC銆
鎴戜滑鍙浠ヨや負SYNC鐩稿綋浜嶴YNC_IDLE騫朵笌SYNC_NOIDLE瀵瑰簲銆俰dling鏄痗fq鍦ㄨ捐′笂涓轟簡灝介噺鍚堝苟榪炵畫鐨処O璇鋒眰浠ヨ揪鍒版彁楂樺悶鍚愰噺鐨勭洰鐨勮屽姞鍏ョ殑鏈哄埗錛屾垜浠鍙浠ョ悊瑙d負鏄涓縐嶁滅┖杞鈥濈瓑寰呮満鍒躲
絀鴻漿鏄鎸囷紝褰撲竴涓闃熷垪澶勭悊涓涓璇鋒眰緇撴潫鍚庯紝浼氬湪鍙戠敓璋冨害涔嬪墠絀虹瓑涓灝忎細鏃墮棿錛屽傛灉涓嬩竴涓璇鋒眰鍒版潵錛屽垯鍙浠ュ噺灝戠佸ご瀵誨潃錛岀戶緇澶勭悊欏哄簭鐨処O璇鋒眰銆
涓轟簡瀹炵幇榪欎釜鍔熻兘錛宑fq鍦╯ervice_tree榪欏眰鏁版嵁緇撴瀯榪欏疄鐜頒簡SYNC闃熷垪錛屽傛灉璇鋒眰鏄鍚屾ラ『搴忚鋒眰錛屽氨鍏ラ槦榪欎釜service tree錛屽傛灉璇鋒眰鏄鍚屾ラ殢鏈鴻鋒眰錛屽垯鍏ラ槦SYNC_NOIDLE闃熷垪錛屼互鍒ゆ柇涓嬩竴涓璇鋒眰鏄鍚︽槸欏哄簭璇鋒眰銆
鎵鏈夌殑寮傛ュ啓鎿嶄綔璇鋒眰灝嗗叆闃烝SYNC鐨剆ervice tree錛屽苟涓旈拡瀵硅繖涓闃熷垪娌℃湁絀鴻漿絳夊緟鏈哄埗銆
姝ゅ栵紝cfq榪樺筍SD榪欐牱鐨勭‖鐩樻湁鐗規畩璋冩暣錛屽綋cfq鍙戠幇瀛樺偍璁懼囨槸涓涓猻sd紜鐩樿繖鏍風殑闃熷垪娣卞害鏇村ぇ鐨勮懼囨椂錛屾墍鏈夐拡瀵瑰崟鐙闃熷垪鐨勭┖杞閮藉皢涓嶇敓鏁堬紝鎵鏈夌殑IO璇鋒眰閮藉皢鍏ラ槦SYNC_NOIDLE榪欎釜service tree銆
姣忎竴涓猻ervice tree閮藉瑰簲浜嗚嫢騫蹭釜cfq_queue闃熷垪錛屾瘡涓猚fq_queue闃熷垪瀵瑰簲涓涓榪涚▼錛岃繖涓鎴戜滑鍚庣畫鍐嶈︾粏璇存槑銆
cfq_group榪樼淮鎶や簡涓涓鍦╟group鍐呴儴鎵鏈夎繘紼嬪叕鐢ㄧ殑寮傛IO璇鋒眰闃熷垪錛屽叾緇撴瀯濡備笅錛

寮傛ヨ鋒眰涔熷垎鎴愪簡RT銆丅E銆両DLE榪欎笁綾昏繘琛屽勭悊錛屾瘡涓綾誨瑰簲涓涓猚fq_queue榪涜屾帓闃熴
BE鍜孯T涔熷疄鐜頒簡浼樺厛綰х殑鏀鎸侊紝姣忎竴涓綾誨瀷鏈塈OPRIO_BE_NR榪欎箞澶氫釜浼樺厛綰э紝榪欎釜鍊煎畾涔変負8錛屾暟緇勪笅鏍囦負0-7銆
鎴戜滑鐩鍓嶅垎鏋愮殑鍐呮牳浠g爜鐗堟湰涓篖inux 4.4錛屽彲浠ョ湅鍑猴紝浠巆fq鐨勮掑害鏉ヨ達紝宸茬粡鍙浠ュ疄鐜板紓姝IO鐨刢group鏀鎸佷簡錛屾垜浠闇瑕佸畾涔変竴涓嬭繖閲屾墍璋撳紓姝IO鐨勫惈涔夛紝瀹冧粎浠呰〃紺轟粠鍐呭瓨鐨刡uffer/cache涓鐨勬暟鎹鍚屾ュ埌紜鐩樼殑IO璇鋒眰錛岃屼笉鏄痑io(man 7 aio)鎴栬卨inux鐨刵ative寮傛io浠ュ強lio鏈哄埗錛屽疄闄呬笂榪欎簺鎵璋撶殑鈥滃紓姝モ滻O鏈哄埗錛屽湪鍐呮牳涓閮芥槸鍚屾ュ疄鐜扮殑錛堟湰璐ㄤ笂鍐璇轟紛鏇艱$畻鏈烘病鏈夌湡姝g殑鈥滃紓姝モ濇満鍒訛級銆
鎴戜滑鍦ㄤ笂闈㈠凡緇忚存槑榪囷紝鐢變簬榪涚▼姝e父鎯呭喌涓嬮兘鏄灝嗘暟鎹鍏堝啓鍏buffer/cache錛屾墍浠ヨ繖縐嶅紓姝IO閮芥槸緇熶竴鐢眂fq_group涓鐨刟sync璇鋒眰闃熷垪澶勭悊鐨勩
閭d箞涓轟粈涔堝湪涓婇潰鐨剆ervice_tree涓榪樿佸疄鐜板拰涓涓獮SYNC鐨勭被鍨嬪憿錛
榪欏綋鐒舵槸涓轟簡鏀鎸佸尯鍒嗚繘紼嬬殑寮傛IO騫朵嬌涔嬪彲浠モ滃畬鍏ㄥ叕騫斥濆仛鍑嗗囧柦銆
瀹為檯涓婂湪鏈鏂扮殑cgroup v2鐨刡lkio浣撶郴涓錛屽唴鏍稿凡緇忔敮鎸佷簡閽堝筨uffer IO鐨刢group闄愰熸敮鎸侊紝鑰屼互涓婅繖浜涘彲鑳藉規槗娣鋒穯鐨勪竴鍫嗙被鍨嬶紝閮芥槸鍦ㄦ柊鐨勪綋緋諱笅闇瑕佺敤鍒扮殑綾誨瀷鏍囪般
鏂頒綋緋葷殑澶嶆潅搴︽洿楂樹簡錛屽姛鑳戒篃鏇村姞寮哄ぇ錛屼絾鏄澶у跺厛涓嶈佺潃鎬ワ紝姝e紡鐨刢group v2浣撶郴錛屽湪Linux 4.5鍙戝竷鐨勬椂鍊欎細姝e紡璺熷ぇ瀹惰侀潰銆
鎴戜滑緇х畫閫夋嫨service_tree鐨勮繃紼嬶紝涓夌嶄紭鍏堢駭綾誨瀷鐨剆ervice_tree鐨勯夋嫨灝辨槸鏍規嵁綾誨瀷鐨勪紭鍏堢駭鏉ュ仛閫夋嫨鐨勶紝RT浼樺厛綰ф渶楂橈紝BE鍏舵★紝IDLE鏈浣庛傚氨鏄璇達紝RT閲屾湁錛屽氨浼氫竴鐩村勭悊RT錛孯T娌′簡鍐嶅勭悊BE銆
姣忎釜service_tree瀵瑰簲涓涓鍏冪礌涓篶fq_queue鎺掗槦鐨勭孩榛戞爲錛岃屾瘡涓猚fq_queue灝辨槸鍐呮牳涓鴻繘紼嬶紙綰跨▼錛夊壋寤虹殑璇鋒眰闃熷垪銆
姣忎竴涓猚fq_queue閮戒細緇存姢涓涓猺b_key鐨勫彉閲忥紝榪欎釜鍙橀噺瀹為檯涓婂氨鏄榪欎釜闃熷垪鐨処O鏈嶅姟鏃墮棿錛坰ervice time錛夈
榪欓噷榪樻槸閫氳繃綰㈤粦鏍戞壘鍒皊ervice time鏃墮棿鏈鐭鐨勯偅涓猚fq_queue榪涜屾湇鍔★紝浠ヤ繚璇佲滃畬鍏ㄥ叕騫斥濄
閫夋嫨濂戒簡cfq_queue涔嬪悗錛屽氨瑕佸紑濮嬪勭悊榪欎釜闃熷垪閲岀殑IO璇鋒眰浜嗐傝繖閲岀殑璋冨害鏂瑰紡鍩烘湰璺焏eadline綾諱技銆
cfq_queue浼氬硅繘鍏ラ槦鍒楃殑姣忎竴涓璇鋒眰榪涜屼袱嬈″叆闃燂紝涓涓鏀捐繘fifo涓錛屽彟涓涓鏀捐繘鎸夎塊棶鎵囧尯欏哄簭浣滀負key鐨勭孩榛戞爲涓銆
榛樿や粠綰㈤粦鏍戜腑鍙栬鋒眰榪涜屽勭悊錛屽綋璇鋒眰鐨勫歡鏃舵椂闂磋揪鍒癲eadline鏃訛紝灝變粠綰㈤粦鏍戜腑鍙栫瓑寰呮椂闂存渶闀跨殑榪涜屽勭悊錛屼互淇濊瘉璇鋒眰涓嶈楗挎匯
榪欏氨鏄鏁翠釜cfq鐨勮皟搴︽祦紼嬶紝褰撶劧鍏朵腑榪樻湁寰堝氱粏鏋濇湯鑺傛病鏈変氦浠o紝姣斿傚悎騫跺勭悊浠ュ強欏哄簭澶勭悊絳夌瓑銆
1.2 cfq鐨勫弬鏁拌皟鏁
鐞嗚В鏁翠釜璋冨害嫻佺▼鏈夊姪浜庢垜浠鍐崇瓥濡備綍璋冩暣cfq鐨勭浉鍏沖弬鏁般傛墍鏈塩fq鐨勫彲璋冨弬鏁伴兘鍙浠ュ湪/sys/class/block/sda/queue/iosched/鐩褰曚笅鎵懼埌錛屽綋鐒訛紝鍦ㄤ綘鐨勭郴緇熶笂錛岃峰皢sda鏇挎崲涓虹浉搴旂殑紓佺洏鍚嶇О銆傛垜浠鏉ョ湅涓涓嬮兘鏈変粈涔堬細

榪欎簺鍙傛暟閮ㄥ垎鏄璺熸満姊扮‖鐩樼佸ご瀵婚亾鏂瑰紡鏈夊叧鐨勶紝濡傛灉鍏惰存槑浣犵湅涓嶆噦錛岃峰厛琛ュ厖鐩稿叧鐭ヨ瘑錛
back_seek_max:紓佸ご鍙浠ュ悜鍚庡誨潃鐨勬渶澶ц寖鍥達紝榛樿ゅ間負16M銆
back_seek_penalty:鍚戝悗瀵誨潃鐨勬儵緗氱郴鏁般傝繖涓鍊兼槸璺熷悜鍓嶅誨潃榪涜屾瘮杈冪殑銆
浠ヤ笂涓や釜鏄涓轟簡闃叉㈢佸ご瀵婚亾鍙戠敓鎶栧姩鑰屽艱嚧瀵誨潃榪囨參鑰岃劇疆鐨勩傚熀鏈鎬濊礬鏄榪欐牱錛屼竴涓猧o璇鋒眰鍒版潵鐨勬椂鍊欙紝cfq浼氭牴鎹鍏跺誨潃浣嶇疆棰勪及涓涓嬪叾紓佸ご瀵婚亾鎴愭湰銆
璁劇疆涓涓鏈澶у糱ack_seek_max錛屽逛簬璇鋒眰鎵璁塊棶鐨勬墖鍖哄彿鍦ㄧ佸ご鍚庢柟鐨勮鋒眰錛屽彧瑕佸誨潃鑼冨洿娌℃湁瓚呰繃榪欎釜鍊礆紝cfq浼氬儚鍚戝墠瀵誨潃鐨勮鋒眰涓鏍峰勭悊瀹冦
鍐嶈劇疆涓涓璇勪及鎴愭湰鐨勭郴鏁癰ack_seek_penalty錛岀浉瀵逛簬紓佸ご鍚戝墠瀵誨潃錛屽悜鍚庡誨潃鐨勮窛紱諱負1/2(1/back_seek_penalty)鏃訛紝cfq璁や負榪欎袱涓璇鋒眰瀵誨潃鐨勪唬浠鋒槸鐩稿悓銆
榪欎袱涓鍙傛暟瀹為檯涓婃槸cfq鍒ゆ柇璇鋒眰鍚堝苟澶勭悊鐨勬潯浠墮檺鍒訛紝鍑′簨澶嶅悎榪欎釜鏉′歡鐨勮鋒眰錛岄兘浼氬敖閲忓湪鏈嬈¤鋒眰澶勭悊鐨勬椂鍊欎竴璧峰悎騫跺勭悊銆
fifo_expire_async:璁劇疆寮傛ヨ鋒眰鐨勮秴鏃舵椂闂淬
鍚屾ヨ鋒眰鍜屽紓姝ヨ鋒眰鏄鍖哄垎涓嶅悓闃熷垪澶勭悊鐨勶紝cfq鍦ㄨ皟搴︾殑鏃跺欎竴鑸鎯呭喌閮戒細浼樺厛澶勭悊鍚屾ヨ鋒眰錛屼箣鍚庡啀澶勭悊寮傛ヨ鋒眰錛岄櫎闈炲紓姝ヨ鋒眰絎﹀悎涓婅堪鍚堝苟澶勭悊鐨勬潯浠墮檺鍒惰寖鍥村唴銆
褰撴湰榪涚▼鐨勯槦鍒楄璋冨害鏃訛紝cfq浼氫紭鍏堟鏌ユ槸鍚︽湁寮傛ヨ鋒眰瓚呮椂錛屽氨鏄瓚呰繃fifo_expire_async鍙傛暟鐨勯檺鍒躲傚傛灉鏈夛紝鍒欎紭鍏堝彂閫佷竴涓瓚呮椂鐨勮鋒眰錛屽叾浣欒鋒眰浠嶇劧鎸夌収浼樺厛綰т互鍙婃墖鍖虹紪鍙峰ぇ灝忔潵澶勭悊銆
fifo_expire_sync:榪欎釜鍙傛暟璺熶笂闈㈢殑綾諱技錛屽尯鍒鏄鐢ㄦ潵璁劇疆鍚屾ヨ鋒眰鐨勮秴鏃舵椂闂淬
slice_idle:鍙傛暟璁劇疆浜嗕竴涓絳夊緟鏃墮棿銆傝繖璁ヽfq鍦ㄥ垏鎹cfq_queue鎴杝ervice tree鐨勬椂鍊欑瓑寰呬竴孌墊椂闂達紝鐩鐨勬槸鎻愰珮鏈烘扮‖鐩樼殑鍚炲悙閲忋
涓鑸鎯呭喌涓嬶紝鏉ヨ嚜鍚屼竴涓猚fq_queue鎴栬卻ervice tree鐨処O璇鋒眰鐨勫誨潃灞閮ㄦф洿濂斤紝鎵浠ヨ繖鏍峰彲浠ュ噺灝戠佺洏鐨勫誨潃嬈℃暟銆傝繖涓鍊煎湪鏈烘扮‖鐩樹笂榛樿や負闈為浂銆
褰撶劧鍦ㄥ滻鎬佺‖鐩樻垨鑰呯‖RAID璁懼囦笂璁劇疆榪欎釜鍊間負闈為浂浼氶檷浣庡瓨鍌ㄧ殑鏁堢巼錛屽洜涓哄滻鎬佺‖鐩樻病鏈夌佸ご瀵誨潃榪欎釜姒傚康錛屾墍浠ュ湪榪欐牱鐨勮懼囦笂搴旇ヨ劇疆涓0錛屽叧闂姝ゅ姛鑳姐
group_idle:榪欎釜鍙傛暟涔熻窡涓婁竴涓鍙傛暟綾諱技錛屽尯鍒鏄褰揷fq瑕佸垏鎹cfq_group鐨勬椂鍊欎細絳夊緟涓孌墊椂闂淬
鍦╟group鐨勫満鏅涓嬶紝濡傛灉鎴戜滑娌跨敤slice_idle鐨勬柟寮忥紝閭d箞絀鴻漿絳夊緟鍙鑳戒細鍦╟group緇勫唴姣忎釜榪涚▼鐨刢fq_queue鍒囨崲鏃跺彂鐢熴
榪欐牱浼氬傛灉榪欎釜榪涚▼涓鐩存湁璇鋒眰瑕佸勭悊鐨勮瘽錛岄偅涔堢洿鍒拌繖涓猚group鐨勯厤棰濊鑰楀敖錛屽悓緇勪腑鐨勫叾瀹冭繘紼嬩篃鍙鑳芥棤娉曡璋冨害鍒般傝繖鏍蜂細瀵艱嚧鍚岀粍涓鐨勫叾瀹冭繘紼嬮タ姝昏屼駭鐢烮O鎬ц兘鐡墮堛
鍦ㄨ繖縐嶆儏鍐典笅錛屾垜浠鍙浠ュ皢slice_idle 錛 0鑰実roup_idle 錛 8銆傝繖鏍風┖杞絳夊緟灝辨槸浠cgroup涓哄崟浣嶈繘琛岀殑錛岃屼笉鏄浠cfq_queue鐨勮繘紼嬩負鍗曚綅榪涜岋紝浠ラ槻姝涓婅堪闂棰樹駭鐢熴
low_latency:榪欎釜鏄鐢ㄦ潵寮鍚鎴栧叧闂璫fq鐨勪綆寤舵椂錛坙ow latency錛夋ā寮忕殑寮鍏熾
褰撹繖涓寮鍏蟲墦寮鏃訛紝cfq灝嗕細鏍規嵁target_latency鐨勫弬鏁拌劇疆鏉ュ規瘡涓涓榪涚▼鐨勫垎鐗囨椂闂達紙slice time錛夎繘琛岄噸鏂拌$畻銆
榪欏皢鏈夊埄浜庡瑰悶鍚愰噺鐨勫叕騫籌紙榛樿ゆ槸瀵規椂闂寸墖鍒嗛厤鐨勫叕騫籌級銆
鍏抽棴榪欎釜鍙傛暟錛堣劇疆涓0錛夊皢蹇界暐target_latency鐨勫箋傝繖灝嗕嬌緋葷粺涓鐨勮繘紼嬪畬鍏ㄦ寜鐓ф椂闂寸墖鏂瑰紡榪涜孖O璧勬簮鍒嗛厤銆傝繖涓寮鍏抽粯璁ゆ槸鎵撳紑鐨勩
鎴戜滑宸茬粡鐭ラ亾cfq璁捐′笂鏈夆滅┖杞鈥濓紙idling錛夎繖涓姒傚康錛岀洰鐨勬槸涓轟簡鍙浠ヨ╄繛緇鐨勮誨啓鎿嶄綔灝藉彲鑳藉氱殑鍚堝苟澶勭悊錛屽噺灝戠佸ご鐨勫誨潃鎿嶄綔浠ヤ究澧炲ぇ鍚炲悙閲忋
濡傛灉鏈夎繘紼嬫繪槸寰堝揩鐨勮繘琛岄『搴忚誨啓錛岄偅涔堝畠灝嗗洜涓篶fq鐨勭┖杞絳夊緟鍛戒腑鐜囧緢楂樿屽艱嚧鍏跺畠闇瑕佸勭悊IO鐨勮繘紼嬪搷搴旈熷害涓嬮檷錛屽傛灉鍙︿竴涓闇瑕佽皟搴︾殑榪涚▼涓嶄細鍙戝嚭澶ч噺欏哄簭IO琛屼負鐨勮瘽錛岀郴緇熶腑涓嶅悓榪涚▼IO鍚炲悙閲忕殑琛ㄧ幇灝變細寰堜笉鍧囪銆
灝辨瘮濡傦紝緋葷粺鍐呭瓨鐨刢ache涓鏈夊緢澶氳剰欏佃佸啓鍥炴椂錛屾岄潰鍙堣佹墦寮涓涓嫻忚堝櫒榪涜屾搷浣滐紝榪欐椂鑴忛〉鍐欏洖鐨勫悗鍙拌屼負灝卞緢鍙鑳戒細澶ч噺鍛戒腑絀鴻漿鏃墮棿錛岃屽艱嚧嫻忚堝櫒鐨勫皬閲廔O涓鐩寸瓑寰咃紝璁╃敤鎴鋒劅瑙夋祻瑙堝櫒榪愯屽搷搴旈熷害鍙樻參銆
榪欎釜low_latency涓昏佹槸瀵硅繖縐嶆儏鍐佃繘琛屼紭鍖栫殑閫夐」錛屽綋鍏舵墦寮鏃訛紝緋葷粺浼氭牴鎹畉arget_latency鐨勯厤緗瀵瑰洜涓哄懡涓絀鴻漿鑰屽ぇ閲忓崰鐢↖O鍚炲悙閲忕殑榪涚▼榪涜岄檺鍒訛紝浠ヨ揪鍒頒笉鍚岃繘紼婭O鍗犵敤鐨勫悶鍚愰噺鐨勭浉瀵瑰潎琛°傝繖涓寮鍏蟲瘮杈冨悎閫傚湪綾諱技妗岄潰搴旂敤鐨勫満鏅涓嬫墦寮銆
target_latency:褰搇ow_latency鐨勫間負寮鍚鐘舵佹椂錛宑fq灝嗘牴鎹榪欎釜鍊奸噸鏂拌$畻姣忎釜榪涚▼鍒嗛厤鐨処O鏃墮棿鐗囬暱搴︺
quantum:榪欎釜鍙傛暟鐢ㄦ潵璁劇疆姣忔′粠cfq_queue涓澶勭悊澶氬皯涓狪O璇鋒眰銆傚湪涓涓闃熷垪澶勭悊浜嬩歡鍛ㄦ湡涓錛岃秴榪囪繖涓鏁板瓧鐨処O璇鋒眰灝嗕笉浼氳澶勭悊銆傝繖涓鍙傛暟鍙瀵瑰悓姝ョ殑璇鋒眰鏈夋晥銆
slice_sync:褰撲竴涓猚fq_queue闃熷垪琚璋冨害澶勭悊鏃訛紝瀹冨彲浠ヨ鍒嗛厤鐨勫勭悊鎬繪椂闂存槸閫氳繃榪欎釜鍊兼潵浣滀負涓涓璁$畻鍙傛暟鎸囧畾鐨勩傚叕寮忎負錛歵ime_slice = slice_sync + (slice_sync/5 * (4 - prio))銆傝繖涓鍙傛暟瀵瑰悓姝ヨ鋒眰鏈夋晥銆
slice_async:榪欎釜鍊艱窡涓婁竴涓綾諱技錛屽尯鍒鏄瀵瑰紓姝ヨ鋒眰鏈夋晥銆
slice_async_rq:榪欎釜鍙傛暟鐢ㄦ潵闄愬埗鍦ㄤ竴涓猻lice鐨勬椂闂磋寖鍥村唴錛屼竴涓闃熷垪鏈澶氬彲浠ュ勭悊鐨勫紓姝ヨ鋒眰涓鏁般傝鋒眰琚澶勭悊鐨勬渶澶т釜鏁拌繕璺熺浉鍏寵繘紼嬭璁劇疆鐨剗o浼樺厛綰ф湁鍏熾
1.3 cfq鐨処OPS妯″紡
鎴戜滑宸茬粡鐭ラ亾錛岄粯璁ゆ儏鍐典笅cfq鏄浠ユ椂闂寸墖鏂瑰紡鏀鎸佺殑甯︿紭鍏堢駭鐨勮皟搴︽潵淇濊瘉IO璧勬簮鍗犵敤鐨勫叕騫熾
楂樹紭鍏堢駭鐨勮繘紼嬪皢寰楀埌鏇村氱殑鏃墮棿鐗囬暱搴︼紝鑰屼綆浼樺厛綰х殑榪涚▼鏃墮棿鐗囩浉瀵硅緝灝忋
褰撴垜浠鐨勫瓨鍌ㄦ槸涓涓楂橀熷苟涓旀敮鎸丯CQ錛堝師鐢熸寚浠ら槦鍒楋級鐨勮懼囩殑鏃跺欙紝鎴戜滑鏈濂藉彲浠ヨ╁叾鍙浠ヤ粠澶氫釜cfq闃熷垪涓澶勭悊澶氳礬鐨勮鋒眰錛屼互渚挎彁鍗嘚CQ鐨勫埄鐢ㄧ巼銆
姝ゆ椂浣跨敤鏃墮棿鐗囩殑鍒嗛厤鏂瑰紡鍒嗛厤璧勬簮灝辨樉寰椾笉鍚堟椂瀹滀簡錛屽洜涓哄熀浜庢椂闂寸墖鐨勫垎閰嶏紝鍚屼竴鏃跺埢鏈澶氳兘澶勭悊鐨勮鋒眰闃熷垪鍙鏈変竴涓銆
榪欐椂錛屾垜浠闇瑕佸垏鎹cfq鐨勬ā寮忎負IOPS妯″紡銆傚垏鎹㈡柟寮忓緢綆鍗曪紝灝辨槸灝唖lice_idle=0鍗沖彲銆傚唴鏍鎬細鑷鍔ㄦ嫻嬩綘鐨勫瓨鍌ㄨ懼囨槸鍚︽敮鎸丯CQ錛屽傛灉鏀鎸佺殑璇漜fq浼氳嚜鍔ㄥ垏鎹涓篒OPS妯″紡銆
鍙﹀栵紝鍦ㄩ粯璁ょ殑鍩轟簬浼樺厛綰х殑鏃墮棿鐗囨柟寮忎笅錛屾垜浠鍙浠ヤ嬌鐢╥onice鍛戒護鏉ヨ皟鏁磋繘紼嬬殑IO浼樺厛綰с傝繘紼嬮粯璁ゅ垎閰嶇殑IO浼樺厛綰ф槸鏍規嵁榪涚▼鐨刵ice鍊艱$畻鑰屾潵鐨勶紝璁$畻鏂規硶鍙浠ュ湪man ionice涓鐪嬪埌錛岃繖閲屼笉鍐嶅簾璇濄
2銆乨eadline錛氭渶緇堟湡闄愯皟搴
deadline璋冨害綆楁硶鐩稿筩fq瑕佺畝鍗曞緢澶氥傚叾璁捐$洰鏍囨槸錛
鍦ㄤ繚璇佽鋒眰鎸夌収璁懼囨墖鍖虹殑欏哄簭榪涜岃塊棶鐨勫悓鏃訛紝鍏奸【鍏跺畠璇鋒眰涓嶈楗挎伙紝瑕佸湪涓涓鏈緇堟湡闄愬墠琚璋冨害鍒般
鎴戜滑鐭ラ亾紓佸ご瀵圭佺洏鐨勫婚亾鏄鍙浠ヨ繘琛岄『搴忚塊棶鍜岄殢鏈鴻塊棶鐨勶紝鍥犱負瀵婚亾寤舵椂鏃墮棿鐨勫叧緋伙紝欏哄簭璁塊棶鏃禝O鐨勫悶鍚愰噺鏇村ぇ錛岄殢鏈鴻塊棶鐨勫悶鍚愰噺灝忋
濡傛灉鎴戜滑鎯充負涓涓鏈烘扮‖鐩樿繘琛屽悶鍚愰噺浼樺寲鐨勮瘽錛岄偅涔堝氨鍙浠ヨ╄皟搴﹀櫒鎸夌収灝介噺澶嶅悎欏哄簭璁塊棶鐨処O璇鋒眰榪涜屾帓搴忥紝涔嬪悗璇鋒眰浠ヨ繖鏍風殑欏哄簭鍙戦佺粰紜鐩橈紝灝卞彲浠ヤ嬌IO鐨勫悶鍚愰噺鏇村ぇ銆
浣嗘槸榪欐牱鍋氫篃鏈夊彟涓涓闂棰橈紝灝辨槸濡傛灉姝ゆ椂鍑虹幇浜嗕竴涓璇鋒眰錛屽畠瑕佽塊棶鐨勭侀亾紱葷洰鍓嶇佸ご鎵鍦ㄧ侀亾寰堣繙錛屽簲鐢ㄧ殑璇鋒眰鍙堝ぇ閲忛泦涓鍦ㄧ洰鍓嶇侀亾闄勮繎銆
瀵艱嚧澶ч噺璇鋒眰涓鐩翠細琚鍚堝苟鍜屾彃闃熷勭悊錛岃岄偅涓瑕佽塊棶姣旇緝榪滅侀亾鐨勮鋒眰灝嗗洜涓轟竴鐩翠笉鑳借璋冨害鑰岄タ姝匯
deadline灝辨槸榪欐牱涓縐嶈皟搴﹀櫒錛岃兘鍦ㄤ繚璇両O鏈澶у悶鍚愰噺鐨勬儏鍐典笅錛屽敖閲忎嬌榪滅璇鋒眰鍦ㄤ竴涓鏈熼檺鍐呰璋冨害鑰屼笉琚楗挎葷殑璋冨害鍣ㄣ

『伍』 IO的提高緩存

衡量性能的幾個指標的計算中我們可以看到一個15k轉速的磁碟在隨機讀寫訪問的情況下IOPS竟然只有140左右,但在實際應用中我們卻能看到很多標有5000IOPS甚至更高的存儲系統,有這么大IOPS的存儲系統怎麼來的呢?這就要歸結於各種存儲技術的使用了,在這些存儲技術中使用最廣的就是高速緩存(Cache)和磁碟冗餘陣列(RAID)了,本文就將探討緩存和磁碟陣列提高存儲IO性能的方法。 在當下的各種存儲產品中,按照速度從快到慢應該就是內存>快閃記憶體>磁碟>磁帶了,然而速度越快也就意味著價格越高,快閃記憶體雖然說是發展勢頭很好,磁碟的速度無疑是計算機系統中最大的瓶頸了,所以在必須使用磁碟而又想提高性能的情況下,人們想出了在磁碟中嵌入一塊高速的內存用來保存經常訪問的數據從而提高讀寫效率的方法來折中的解決,這塊嵌入的內存就被稱為高速緩存。
說到緩存,到操作系統層,再到磁碟控制器,還有CPU內部,單個磁碟的內部也都存在緩存,所有這些緩存存在的目的都是相同的,就是提高系統執行的效率。
當然在這里我們只提跟IO性能相關的緩存,與IO性能直接相關的幾個緩存分別是文件系統緩存(File SySTem Cache)、磁碟控制器緩存(Disk CONtroller Cache)和磁碟緩存(Disk Cache,也稱為Disk Buffer),不過當在計算一個磁碟系統性能的時候文件系統緩存也是不會考慮在內的,我們重點考察的就是磁碟控制器緩存和磁碟緩存。
不管是控制器緩存還是磁碟緩存,他們所起的作用主要是分為三部分:緩存數據、預讀(Read-ahead)和回寫(Write-back)。
緩存數據
首先是系統讀取過的數據會被緩存在高速緩存中,這樣下次再次需要讀取相同的數據的時候就不用在訪問磁碟,直接從緩存中取數據就可以了。當然使用過的數據也不可能在緩存中永久保留的,緩存的數據一般那是採取LRU演算法來進行管理,目的是將長時間不用的數據清除出緩存,那些經常被訪問的卻能一直保留在緩存中,直到緩存被清空。
預讀
預讀是指採用預讀演算法在沒有系統的IO請求的時候事先將數據從磁碟中讀入到緩存中,然後在系統發出讀IO請求的時候,就會實現去檢查看看緩存裡面是否存在要讀取的數據,如果存在(即命中)的話就直接將結果返回,這時候的磁碟不再需要定址、旋轉等待、讀取數據這一序列的操作了,這樣是能節省很多時間的;如果沒有命中則再發出真正的讀取磁碟的命令去取所需要的數據。
緩存的命中率跟緩存的大小有很大的關系,理論上是緩存越大的話,所能緩存的數據也就越多,這樣命中率也自然越高,當然緩存不可能太大,畢竟成本在那兒呢。如果一個容量很大的存儲系統配備了一個很小的讀緩存的話,這時候問題會比較大的,因為小緩存緩存的數據量非常小,相比整個存儲系統來說比例非常低,這樣隨機讀取(資料庫系統的大多數情況)的時候命中率也自然就很低,這樣的緩存不但不能提高效率(因為絕大部分讀IO都還要讀取磁碟),反而會因為每次去匹配緩存而浪費時間。
執行讀IO操作是讀取數據存在於緩存中的數量與全部要讀取數據的比值稱為緩存命中率(Read Cache Hit Radio),假設一個存儲系統在不使用緩存的情況下隨機小IO讀取能達到150IOPS,而它的緩存能提供10%的緩存命中率的話,那麼實際上它的IOPS可以達到150/(1-10%)=166。
回寫
要先說一下,用於回寫功能的那部分緩存被稱為寫緩存(Write Cache)。在一套寫緩存打開的存儲中,操作系統所發出的一系列寫IO命令並不會被挨個的執行,這些寫IO的命令會先寫入緩存中,然後再一次性的將緩存中的修改推到磁碟中,這就相當於將那些相同的多個IO合並成一個,多個連續操作的小IO合並成一個大的IO,還有就是將多個隨機的寫IO變成一組連續的寫IO,這樣就能減少磁碟定址等操作所消耗的時間,大大的提高磁碟寫入的效率。
讀緩存雖然對效率提高是很明顯的,但是它所帶來的問題也比較嚴重,因為緩存和普通內存一樣,掉電以後數據會全部丟失,當操作系統發出的寫IO命令寫入到緩存中後即被認為是寫入成功,而實際上數據是沒有被真正寫入磁碟的,此時如果掉電,緩存中的數據就會永遠的丟失了,這個對應用來說是災難性的,目前解決這個問題最好的方法就是給緩存配備電池了,保證存儲掉電之後緩存數據能如數保存下來。
和讀一樣,寫緩存也存在一個寫緩存命中率(Write Cache Hit Radio),不過和讀緩存命中情況不一樣的是,盡管緩存命中,也不能將實際的IO操作免掉,只是被合並了而已。
控制器緩存和磁碟緩存除了上面的作用之外還承當著其他的作用,比如磁碟緩存有保存IO命令隊列的功能,單個的磁碟一次只能處理一個IO命令,但卻能接收多個IO命令,這些進入到磁碟而未被處理的命令就保存在緩存中的IO隊列中。
RAID(Rendant ArrayOf Inexpensive Disks)
如果你是一位資料庫管理員或者經常接觸伺服器,那對RAID應該很熟悉了,作為最廉價的存儲解決方案,RAID早已在伺服器存儲中得到了普及。在RAID的各個級別中,應當以RAID10和RAID5(不過RAID5已經基本走到頭了,RAID6正在崛起中,看看這里了解下原因)應用最廣了。下面將就RAID0,RAID1,RAID5,RAID6,RAID10這幾種級別的RAID展開說一下磁碟陣列對於磁碟性能的影響,當然在閱讀下面的內容之前你必須對各個級別的RAID的結構和工作原理要熟悉才行,這樣才不至於滿頭霧水,推薦查看wikipedia上面的如下條目:RAID,Standard RAID levels,Nested RAID levels。 RAID0將數據條帶化(striping)將連續的數據分散在多個磁碟上進行存取,系統發出的IO命令(不管讀IO和寫IO都一樣)就可以在磁碟上被並行的執行,每個磁碟單獨執行自己的那一部分請求,這樣的並行的IO操作能大大的增強整個存儲系統的性能。假設一個RAID0陣列有n(n>=2)個磁碟組成,每個磁碟的隨機讀寫的IO能力都達到140的話,那麼整個磁碟陣列的IO能力將是140*n。同時如果在陣列匯流排的傳輸能力允許的話RAID0的吞吐率也將是單個磁碟的n倍。
其他RAID區域
· RAID1鏡像磁碟,使用2塊硬碟,一般做系統盤的鏡像,讀IO為一塊硬碟的IO,寫IO為2塊硬碟的IO。
RAID10既能增加IO的讀寫性能又能實現數據的冗餘,使用盤的數量為2的倍數且要大於等於4,且硬碟空間相同,這樣的缺點是要實現IO擴展就必須增加相應的硬碟數量,實現同樣的性能硬碟成本要成倍增長。允許不同硬碟數據的任何一塊丟失。
RAID3拿出單獨一塊盤做奇偶校驗盤,做到數據的冗餘
這種情況下允許一塊硬碟損壞。由於磁碟的任何數據發生改變都會重新對校驗盤進行改寫,所以過多的寫操作會成為整個系統的瓶頸,此種RAID級別只能用於對讀請求相對較高,寫請求不多的環境。RAID3已基本淘汰,一般用RAID5技術替代。

『陸』 I/O 表示什麼其作用是什麼

如下:

I/O是 input/output的縮寫,即輸入輸出埠。每個設備都會有一個專用的I/O地址,用來處理自己的輸入輸出信息。

CPU與外部設備、存儲器的連接和數據交換都需要通過介面設備來實現,前者被稱為I/O介面,而後者則被稱為存儲器介面。

IO提高緩存:

衡量性能的幾個指標的計算中我們可以看到一個15k轉速的磁碟在隨機讀寫訪問的情況下IOPS竟然只有140左右,但在實際應用中我們卻能看到很多標有5000IOPS甚至更高的存儲系統,有這么大IOPS的存儲系統怎麼來的呢。

這就要歸結於各種存儲技術的使用了,在這些存儲技術中使用最廣的就是高速緩存(Cache)和磁碟冗餘陣列(RAID)了,本文就將探討緩存和磁碟陣列提高存儲IO性能的方法。

熱點內容
買的騰訊伺服器是裝在電腦上嗎 發布:2025-01-15 23:25:58 瀏覽:411
如何查看電腦的配置是不是i5 發布:2025-01-15 23:24:21 瀏覽:434
PI資料庫 發布:2025-01-15 23:14:42 瀏覽:882
我的世界手機版暖心伺服器 發布:2025-01-15 23:05:02 瀏覽:169
xts壓縮比 發布:2025-01-15 23:02:41 瀏覽:424
怎麼看聯系人存儲位置 發布:2025-01-15 22:47:14 瀏覽:794
旗艦560配置的是什麼發動機 發布:2025-01-15 22:40:59 瀏覽:626
sql多表連接查詢 發布:2025-01-15 22:33:12 瀏覽:221
android網路休眠 發布:2025-01-15 22:32:12 瀏覽:350
怎麼不下魯大師查看電腦配置 發布:2025-01-15 22:30:23 瀏覽:311