日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
linux的數(shù)據(jù)一致性和io類型怎么理解

這篇文章主要講解了“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”吧!

我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、潞城ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的潞城網(wǎng)站制作公司

對linux內(nèi)核來說,讀寫要經(jīng)過層層路徑,才能真正讀寫硬盤。從io路徑來說,io要經(jīng)過page cache,io調(diào)度隊列,dispatch隊列,ncq隊列和硬盤cache,才能真正到達(dá)硬盤。

Page cache:page cache是linux內(nèi)核提供的緩存接口,page cache的名字就說明內(nèi)核是通過page單元(通常4K大?。﹣砉芾韈ache。讀操作首先在page cache查找,如果找到,就復(fù)制page cache的內(nèi)容返回,找不到,才真正調(diào)用下層處理。寫操作,buffer io 寫到page cache就返回,真正的磁盤寫,是由內(nèi)核的pdflush內(nèi)核線程負(fù)責(zé)

IO調(diào)度隊列:

Linux內(nèi)核提供了四種io調(diào)度算法,as,deadline,cfq,noop。每種調(diào)度算法都實現(xiàn)了一個調(diào)度隊列,io首先在隊列中排序(noop最簡單,不排序),然后根據(jù)條件,決定是否到dispatch隊列。從調(diào)度隊列下發(fā),涉及一個unplug的概念。也就是說,調(diào)度隊列通常處于阻塞(plug)狀態(tài),當(dāng)執(zhí)行unplug操作時,io離開調(diào)度隊列,開始下發(fā)。unplug是個循環(huán)動作,將調(diào)度隊列的所有io都嘗試下發(fā),直到不能下發(fā)為止。
總結(jié)一下,執(zhí)行unplug有下列條件:

  • 第一個io啟動了三毫秒的定時器,定時器到了,會unplug,開始下發(fā)

  • io請求超過設(shè)定的限制(缺省是4),執(zhí)行unplug,開始下發(fā)

  • Sync標(biāo)志的io,立即unplug,開始下發(fā)。

  • Barrier標(biāo)志的io,清空調(diào)度隊列后,執(zhí)行unplug,開始下發(fā)

  • 一個io執(zhí)行完畢,也要unplug隊列。

dispatch隊列:dispatch隊列對應(yīng)用關(guān)系不大。但是內(nèi)核層對日志文件系統(tǒng)的joural數(shù)據(jù),提供了一種barrier io,這個主要在dispatch隊列實現(xiàn)。

Ncq隊列:
NCQ是sata硬盤自身的隊列。(sas硬盤的隊列叫TCQ)。NCQ隊列是由操作系統(tǒng)創(chuàng)建的,但是加入到NCQ隊列的io,是由硬盤來決定執(zhí)行順序。為了實現(xiàn)這個,NCQ隊列創(chuàng)建在內(nèi)核的DMA內(nèi)存中,然后通知硬盤,至于硬盤選擇那個io執(zhí)行,是硬盤自身選擇的結(jié)果。

硬盤cache:
硬盤cache是硬盤內(nèi)部的cache。如果打開硬盤cache的話,寫硬盤的io,首先是到硬盤cache,而非直接落到硬盤。

一. Pdflush的回寫邏輯

Pdflush提供了四個參數(shù)來控制回寫。在內(nèi)核實現(xiàn)中,pdflush的回寫策略控制還比較復(fù)雜。

但是簡單一點說,內(nèi)核缺省情況下,每5秒鐘掃描臟頁,如果臟頁生存時間超過30秒(缺省數(shù)值),就刷臟頁到磁盤。

詳細(xì)的可參考本人寫的《linux內(nèi)核回寫機(jī)制和調(diào)整》一文。

二. 數(shù)據(jù)下盤和一致性分析

從上文的分析,通常的io寫,到page cache層就結(jié)束返回了,并沒真正寫到硬盤。這樣機(jī)器掉電或者故障的時候,就有丟失數(shù)據(jù)的風(fēng)險。為了盡快下io,系統(tǒng)又提供了一些措施解決這個問題。

O_SYNC:打開文件的時候,可以設(shè)置O_SYNC標(biāo)志,在page cache的寫完成后,如果文件有O_SYNC標(biāo)志,立即開始將io下發(fā),進(jìn)入調(diào)度隊列。隨后將文件系統(tǒng)的meta data數(shù)據(jù)也下發(fā),然后開始循環(huán)執(zhí)行unplug操作,直到所有的寫io完成。和回寫機(jī)制比較,O_SYNC沒有等臟頁生存30秒,就嘗試立即下發(fā)到硬盤。

O_SYNC本質(zhì)就是io下發(fā),然后執(zhí)行unplug操作。O_SYNC的幾個問題是:

  • 寫page cache時候要把io拆成4k的單元?;貙懸彩敲看螌?K的頁面,如果是大io,就需要內(nèi)核的調(diào)度層把4k的io重新再合并起來。這是冗余的過程

  • 每個io都要立即unplug,這樣就不能實現(xiàn)io的排序和合并。O_SYNC的性能相當(dāng)?shù)汀?/p>

  • 如果多個進(jìn)程并發(fā)寫,不能保證寫操作的順序。Ncq隊列根據(jù)硬盤磁頭的位置和磁盤旋轉(zhuǎn)位置確定執(zhí)行的順序。一般是meta data數(shù)據(jù)一起寫,這樣存在不同步的風(fēng)險。

  • 如果硬盤cache打開了,那么寫只到硬盤cache就返回了。存在丟數(shù)據(jù)的風(fēng)險。通常存儲廠商都要求硬盤cache關(guān)閉。不過騰訊的服務(wù)器都是打開硬盤cache的。

O_DIRECT:打開文件的時候,可設(shè)置O_DIRECT標(biāo)志。O_DIRECT不使用內(nèi)核提供的page cache。這樣讀操作,就不會到page cache中檢查是否有需要數(shù)據(jù)存在。而寫操作,也不會將數(shù)據(jù)寫入page cache,而是送入調(diào)度隊列。

O_DIRECT執(zhí)行寫io的時候,會置WRITE_SYNC標(biāo)志。這個標(biāo)志在io進(jìn)入調(diào)度隊列后,會執(zhí)行一次unplug操作。而不是像O_SYNC那樣,循環(huán)執(zhí)行unplug操作。

為了避免O_SYNC每個寫io都要阻塞等待的問題,系統(tǒng)提供了fsync和fdatasync系統(tǒng)調(diào)用,可以讓應(yīng)用層自己控制同步的時機(jī)。

Fsync:fsync將文件范圍內(nèi),所有的臟頁面都下發(fā)到硬盤。然后也要將臟的元數(shù)據(jù)寫到 硬盤。如果文件的inode本身有變化,同樣需要寫到硬盤。

Fdatasync:fdatasync和fsync的區(qū)別其實很輕微。比如ext2文件系統(tǒng),如果文件的inode只有輕微的變化,fdatasync此時不更新inode。典型的輕微變化是文件atime的變化。而在ext3文件系統(tǒng),fsync和fdatasync是完全一樣的。不管是否輕微變化,都要回寫inode。

Fsync和fdatasync都是對整個文件的操作,如果應(yīng)用只想刷新文件的指定位置,這兩個系統(tǒng)調(diào)用就失效了。所以新的內(nèi)核還提供了sync_file_range來指定范圍寫。不過要注意,sync_file_range是不回寫文件的meta data。必須應(yīng)用層保證meta data沒有更新。

三. Pdflush的回寫邏輯

Pdflush提供了四個參數(shù)來控制回寫。在內(nèi)核實現(xiàn)中,pdflush的回寫策略控制還比較復(fù)雜。

但是簡單一點說,內(nèi)核缺省情況下,每5秒鐘掃描臟頁,如果臟頁生存時間超過30秒(缺省數(shù)值),就刷臟頁到磁盤。

四. 內(nèi)核的barrier io

從上文的分析看出,內(nèi)核沒有為用戶態(tài)提供保證順序的,確定寫到硬盤的系統(tǒng)調(diào)用。但是對于內(nèi)核文件系統(tǒng)來說,必須提供這樣的接口。比如日志文件系統(tǒng),必須要數(shù)據(jù)落到硬盤后,才能修改元數(shù)據(jù)的日志。否則,出錯情況下就可能造成文件系統(tǒng)崩潰。為此,內(nèi)核專門提供了一個barrier方式實現(xiàn)日志的準(zhǔn)確寫到硬盤。

文件系統(tǒng)的barrier io,意味著,這個barrier io之前的寫io必須完成。同時,在barrier io完成之前(是真正寫到硬盤,不是寫到cache就返回),也不能有別的寫io再執(zhí)行。為此,上文分析的dispatch 隊列完成了這個功能。

當(dāng)寫io從調(diào)度隊列進(jìn)入dispatch隊列的時候,要檢查是否是一個barrier io。如果是barrier io,dispatch首先在隊列中插入一個SCSI命令SYNCHRONIZE_CACHE,這個命令指示硬盤cache刷所有的寫io到硬盤。然后再下發(fā)barrier io,之后再插入一個SYNCHRONIZE_CACHE命令,指示硬盤將剛才的barrier io真正寫到硬盤(還有一種方式,是通過命令攜帶FUA標(biāo)志實現(xiàn)不經(jīng)過cache直接下盤)。

感謝各位的閱讀,以上就是“l(fā)inux的數(shù)據(jù)一致性和io類型怎么理解”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對linux的數(shù)據(jù)一致性和io類型怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!


網(wǎng)頁標(biāo)題:linux的數(shù)據(jù)一致性和io類型怎么理解
網(wǎng)站鏈接:http://www.dlmjj.cn/article/poieop.html