当前位置:首页 » 文件管理 » 存储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 19:56:07 浏览:428
八字源码 发布:2025-01-15 19:54:47 浏览:371
服务器可以变电脑使用吗 发布:2025-01-15 19:40:29 浏览:201
传奇手游免费脚本 发布:2025-01-15 19:30:21 浏览:300
我国当前资源配置存在哪些问题 发布:2025-01-15 19:25:03 浏览:514
存储在哪里呀 发布:2025-01-15 19:11:39 浏览:450
pythonuniquelist 发布:2025-01-15 19:10:41 浏览:477
怎么升安卓系统下载 发布:2025-01-15 19:04:27 浏览:894
mcrypt扩展php 发布:2025-01-15 19:01:12 浏览:436
html源码解析 发布:2025-01-15 19:01:10 浏览:223