亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

linux的數據一致性和io類型怎么理解

發布時間:2022-01-06 14:41:34 來源:億速云 閱讀:126 作者:iii 欄目:云計算

這篇文章主要講解了“linux的數據一致性和io類型怎么理解”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“linux的數據一致性和io類型怎么理解”吧!

對linux內核來說,讀寫要經過層層路徑,才能真正讀寫硬盤。從io路徑來說,io要經過page cache,io調度隊列,dispatch隊列,ncq隊列和硬盤cache,才能真正到達硬盤。

Page cache:page cache是linux內核提供的緩存接口,page cache的名字就說明內核是通過page單元(通常4K大小)來管理cache。讀操作首先在page cache查找,如果找到,就復制page cache的內容返回,找不到,才真正調用下層處理。寫操作,buffer io 寫到page cache就返回,真正的磁盤寫,是由內核的pdflush內核線程負責

IO調度隊列:

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

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

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

  • Sync標志的io,立即unplug,開始下發。

  • Barrier標志的io,清空調度隊列后,執行unplug,開始下發

  • 一個io執行完畢,也要unplug隊列。

dispatch隊列:dispatch隊列對應用關系不大。但是內核層對日志文件系統的joural數據,提供了一種barrier io,這個主要在dispatch隊列實現。

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

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

一. Pdflush的回寫邏輯

Pdflush提供了四個參數來控制回寫。在內核實現中,pdflush的回寫策略控制還比較復雜。

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

詳細的可參考本人寫的《linux內核回寫機制和調整》一文。

二. 數據下盤和一致性分析

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

O_SYNC:打開文件的時候,可以設置O_SYNC標志,在page cache的寫完成后,如果文件有O_SYNC標志,立即開始將io下發,進入調度隊列。隨后將文件系統的meta data數據也下發,然后開始循環執行unplug操作,直到所有的寫io完成。和回寫機制比較,O_SYNC沒有等臟頁生存30秒,就嘗試立即下發到硬盤。

O_SYNC本質就是io下發,然后執行unplug操作。O_SYNC的幾個問題是:

  • 寫page cache時候要把io拆成4k的單元。回寫也是每次寫4K的頁面,如果是大io,就需要內核的調度層把4k的io重新再合并起來。這是冗余的過程

  • 每個io都要立即unplug,這樣就不能實現io的排序和合并。O_SYNC的性能相當低。

  • 如果多個進程并發寫,不能保證寫操作的順序。Ncq隊列根據硬盤磁頭的位置和磁盤旋轉位置確定執行的順序。一般是meta data數據一起寫,這樣存在不同步的風險。

  • 如果硬盤cache打開了,那么寫只到硬盤cache就返回了。存在丟數據的風險。通常存儲廠商都要求硬盤cache關閉。不過騰訊的服務器都是打開硬盤cache的。

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

O_DIRECT執行寫io的時候,會置WRITE_SYNC標志。這個標志在io進入調度隊列后,會執行一次unplug操作。而不是像O_SYNC那樣,循環執行unplug操作。

為了避免O_SYNC每個寫io都要阻塞等待的問題,系統提供了fsync和fdatasync系統調用,可以讓應用層自己控制同步的時機。

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

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

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

三. Pdflush的回寫邏輯

Pdflush提供了四個參數來控制回寫。在內核實現中,pdflush的回寫策略控制還比較復雜。

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

四. 內核的barrier io

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

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

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

感謝各位的閱讀,以上就是“linux的數據一致性和io類型怎么理解”的內容了,經過本文的學習后,相信大家對linux的數據一致性和io類型怎么理解這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万州区| 娄底市| 桑日县| 柏乡县| 江陵县| 贵溪市| 调兵山市| 桓仁| 潼南县| 中阳县| 疏附县| 清镇市| 顺昌县| 禄丰县| 满洲里市| 资阳市| 同江市| 黄陵县| 无锡市| 永仁县| 临夏县| 手机| 许昌市| 清远市| 江陵县| 万宁市| 竹溪县| 虞城县| 云霄县| 铜山县| 滦南县| 共和县| 衡南县| 广灵县| 资讯| 朝阳县| 兰州市| 额济纳旗| 德江县| 万载县| 滁州市|