国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

這篇具有很好參考價值的文章主要介紹了Linux·內(nèi)核的 4 大 IO 調(diào)度算法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Linux 內(nèi)核包含4個IO調(diào)度器,分別是 Noop IO scheduler、Anticipatory IO scheduler、Deadline IO scheduler 與 CFQ IO scheduler。

anticipatory, 預(yù)期的;提早發(fā)生的;期待著的

通常磁盤的讀寫影響是由磁頭到柱面移動造成了延遲,解決這種延遲內(nèi)核主要采用兩種策略:緩存和IO調(diào)度算法來進行彌補.

本文做一簡單介紹.

調(diào)度算法概念

  1. 當(dāng)向設(shè)備寫入數(shù)據(jù)塊或是從設(shè)備讀出數(shù)據(jù)塊時,請求都被安置在一個隊列中等待完成.
  2. 每個塊設(shè)備都有它自己的隊列.
  3. I/O調(diào)度程序負(fù)責(zé)維護這些隊列的順序,以更有效地利用介質(zhì).I/O調(diào)度程序?qū)o序的I/O操作變?yōu)橛行虻腎/O操作.
  4. 內(nèi)核必須首先確定隊列中一共有多少個請求,然后才開始進行調(diào)度.

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

IO調(diào)度器(IO Scheduler)

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

IO調(diào)度器(IO Scheduler)是操作系統(tǒng)用來決定塊設(shè)備上IO操作提交順序的方法。存在的目的有兩個,一是提高IO吞吐量,二是降低IO響應(yīng)時間。然而IO吞吐量和IO響應(yīng)時間往往是矛盾的,為了盡量平衡這兩者,IO調(diào)度器提供了多種調(diào)度算法來適應(yīng)不同的IO請求場景。其中,對數(shù)據(jù)庫這種隨機讀寫的場景最有利的算法是DEANLINE。

IO調(diào)度器在內(nèi)核棧中所處位置如下:

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

塊設(shè)備最悲劇的地方就是磁盤轉(zhuǎn)動,這個過程會很耗時間。 每個塊設(shè)備或者塊設(shè)備的分區(qū),都對應(yīng)有自身的請求隊列(request_queue),而每個請求隊列都可以選擇一個I/O調(diào)度器來協(xié)調(diào)所遞交的request。I/O調(diào)度器的基本目的是將請求按照它們對應(yīng)在塊設(shè)備上的扇區(qū)號進行排列,以減少磁頭的移動,提高效率。每個設(shè)備的請求隊列里的請求將按順序被響應(yīng)。實際上,除了這個隊列,每個調(diào)度器自身都維護有不同數(shù)量的隊列,用來對遞交上來的request進行處理,而排在隊列最前面的request將適時被移動到請求隊列中等待響應(yīng)。

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

IO scheduler 的作用主要是為了減少磁盤轉(zhuǎn)動的需求。主要通過2中方式實現(xiàn):

1.合并 2.排序

每個設(shè)備都會自己對應(yīng)請求隊列,所有的請求在被處理之前都會在請求隊列上。 在新來一個請求的時候如果發(fā)現(xiàn)這個請求和前面的某個請求請求的位置是相鄰的,那么就可以合并為一個請求。如果不能找到合并的,就會按照磁盤的轉(zhuǎn)動方向進行排序。通常IO scheduler 的作用就是為了在進行合并和排序的同時,也不會太影響單個請求的處理時間。

1、NOOP

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

FIFO

  1. noop是什么? noop是一種輸入輸出調(diào)度算法 . NOOP, No Operation. 什么都不做,請求來一個處理一個。這種方式事實起來簡單,也更有效。問題就是disk seek 太多,對于傳統(tǒng)磁盤,這是不能接受的。 但對于SSD 磁盤就可以,因為SSD 磁盤不需要轉(zhuǎn)動。
  2. noop的別稱 又稱為電梯調(diào)度算法.
  3. noop原理是怎樣的?

將輸入輸出請求放到一個FIFO隊列中,然后按次序執(zhí)行隊列中的輸入輸出請求:

當(dāng)來一個新請求時:

  1. 如果能合并就合并
  2. 如果不能合并,就會嘗試排序。 如果隊列上的請求都已經(jīng)很老了,這個新的請求就不能插隊,只能放到最后面。否則就插到合適的位置
  3. 如果既不能合并,有沒有合適的位置插入,就放到請求隊列的最后。
  4. 適用場景

4.1 在不希望修改輸入輸出請求先后順序的場景下;   4.2 在輸入輸出之下具有更加智能調(diào)度算法的設(shè)備,如NAS存儲設(shè)備;   4.3 上層應(yīng)用程序已經(jīng)精心優(yōu)化過的輸入輸出請求;   4.4 非旋轉(zhuǎn)磁頭式的磁盤設(shè)備,如SSD磁盤

2、CFQ(Completely Fair Queuing, 完全公平排隊)

CFQ(Completely Fair Queuing)算法,顧名思義,絕對公平算法。它試圖為競爭塊設(shè)備使用權(quán)的所有進程分配一個請求隊列和一個時間片,在調(diào)度器分配給進程的時間片內(nèi),進程可以將其讀寫請求發(fā)送給底層塊設(shè)備,當(dāng)進程的時間片消耗完,進程的請求隊列將被掛起,等待調(diào)度。

每個進程的時間片和每個進程的隊列長度取決于進程的IO優(yōu)先級,每個進程都會有一個IO優(yōu)先級,CFQ調(diào)度器將會將其作為考慮的因素之一,來確定該進程的請求隊列何時可以獲取塊設(shè)備的使用權(quán)。

IO優(yōu)先級從高到低可以分為三大類:

RT(real time) BE(best try) IDLE(idle)

其中RT和BE又可以再劃分為8個子優(yōu)先級??梢酝ㄟ^ionice 去查看和修改。 優(yōu)先級越高,被處理的越早,用于這個進程的時間片也越多,一次處理的請求數(shù)也會越多。

實際上,我們已經(jīng)知道CFQ調(diào)度器的公平是針對于進程而言的,而只有同步請求(read或syn write)才是針對進程而存在的,他們會放入進程自身的請求隊列,而所有同優(yōu)先級的異步請求,無論來自于哪個進程,都會被放入公共的隊列,異步請求的隊列總共有8(RT)+8(BE)+1(IDLE)=17個。

從Linux 2.6.18起,CFQ作為默認(rèn)的IO調(diào)度算法。對于通用的服務(wù)器來說,CFQ是較好的選擇。具體使用哪種調(diào)度算法還是要根據(jù)具體的業(yè)務(wù)場景去做足benchmark來選擇,不能僅靠別人的文字來決定。

3、DEADLINE

DEADLINE在CFQ的基礎(chǔ)上,解決了IO請求餓死的極端情況。

除了CFQ本身具有的IO排序隊列之外,DEADLINE額外分別為讀IO和寫IO提供了FIFO隊列。

Linux·內(nèi)核的 4 大 IO 調(diào)度算法

讀FIFO隊列的最大等待時間為500ms,寫FIFO隊列的最大等待時間為5s(當(dāng)然這些參數(shù)都是可以手動設(shè)置的)。

FIFO隊列內(nèi)的IO請求優(yōu)先級要比CFQ隊列中的高,,而讀FIFO隊列的優(yōu)先級又比寫FIFO隊列的優(yōu)先級高。優(yōu)先級可以表示如下:

FIFO(Read) > FIFO(Write) > CFQ

deadline 算法保證對于既定的 IO 請求以最小的延遲時間,從這一點理解,對于 DSS 應(yīng)用應(yīng)該會是很適合的。

deadline 實際上是對Elevator 的一種改進: 1 避免有些請求太長時間不能被處理。 2 區(qū)分對待讀操作和寫操作。

deadline IO 維護3個隊列。第一個隊列和Elevator 一樣, 盡量按照物理位置排序。 第二個隊列和第三個隊列都是按照時間排序,不同的是一個是讀操作一個是寫操作。

deadline IO 之所以區(qū)分讀和寫是因為設(shè)計者認(rèn)為如果應(yīng)用程序發(fā)了一個讀請求,一般就會阻塞到那里,一直等到的結(jié)果返回。 而寫請求則不是通常是應(yīng)用請求寫到內(nèi)存即可,由后臺進程再寫回磁盤。應(yīng)用程序一般不等寫完成就繼續(xù)往下走。 所以讀請求應(yīng)該比寫請求有更高的優(yōu)先級。

在這種設(shè)計下,每個新增請求都會先放到第一個隊列,算法和Elevator的方式一樣,同時也會增加到讀或者寫隊列的尾端。這樣首先處理一些第一隊列的請求,同時檢測第二/三隊列前幾個請求是否等了太長時間,如果已經(jīng)超過一個閥值,就會去處理一下。 這個閥值對于讀請求時 5ms, 對于寫請求時5s.

個人認(rèn)為對于記錄數(shù)據(jù)庫變更日志的分區(qū),例如oracle 的online log, mysql 的binlog 等等,最好不要使用這種分區(qū)。 因為這類寫請求通常是調(diào)用fsync 的。 如果寫完不成,也會很影響應(yīng)用性能的。

4、ANTICIPATORY

CFQ和DEADLINE考慮的焦點在于滿足零散IO請求上。對于連續(xù)的IO請求,比如順序讀,并沒有做優(yōu)化。

為了滿足隨機IO和順序IO混合的場景,Linux還支持ANTICIPATORY調(diào)度算法。ANTICIPATORY的在DEADLINE的基礎(chǔ)上,為每個讀IO都設(shè)置了6ms的等待時間窗口。如果在這6ms內(nèi)OS收到了相鄰位置的讀IO請求,就可以立即滿足。

小結(jié)

IO調(diào)度器算法的選擇,既取決于硬件特征,也取決于應(yīng)用場景。

在傳統(tǒng)的SAS盤上,CFQ、DEADLINE、ANTICIPATORY都是不錯的選擇;對于專屬的數(shù)據(jù)庫服務(wù)器,DEADLINE的吞吐量和響應(yīng)時間都表現(xiàn)良好。然而在新興的固態(tài)硬盤比如SSD、Fusion IO上,最簡單的NOOP反而可能是最好的算法,因為其他三個算法的優(yōu)化是基于縮短尋道時間的,而固態(tài)硬盤沒有所謂的尋道時間且IO響應(yīng)時間非常短。

Linux·內(nèi)核的 4 大 IO 調(diào)度算法文章來源地址http://www.zghlxwxcb.cn/news/detail-405821.html

到了這里,關(guān)于Linux·內(nèi)核的 4 大 IO 調(diào)度算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • linux性能優(yōu)化-IO調(diào)度優(yōu)化

    Linux I/O調(diào)度器(Linux I/O Scheduler)Linux內(nèi)核中的一個組成部分,用戶可以通過調(diào)整這個調(diào)度器來優(yōu)化系統(tǒng)性能,介于通用塊層和塊設(shè)備驅(qū)動程序之間。 noop(No Operation) :通常用于內(nèi)存存儲的設(shè)備。 cfq(Completely Fair Scheduler ) :完全公平調(diào)度器,進程平均使用IO帶寬。 deadline :針對

    2024年02月10日
    瀏覽(20)
  • 《深入Linux內(nèi)核架構(gòu)》第2章 進程管理和調(diào)度 (2)

    《深入Linux內(nèi)核架構(gòu)》第2章 進程管理和調(diào)度 (2)

    目錄 2.4 進程管理相關(guān)的系統(tǒng)調(diào)用 2.4.1 進程復(fù)制 2.4.2 內(nèi)核線程 2.4.3 啟動新程序 2.4.4 退出進程 本專欄文章將有70篇左右,歡迎+關(guān)注,訂閱后續(xù)文章。 1. _do_fork函數(shù) ????????fork vfork clone都最終調(diào)用_do_fork ????????????????clone:通過CLONE_XX標(biāo)志精確控制父子進程共享哪

    2024年04月11日
    瀏覽(23)
  • Linux內(nèi)核分析(五)--IO機制原理與系統(tǒng)總線

    一、引言 二、I/O設(shè)備 ------2.1、塊設(shè)備 ------2.2、字符設(shè)備 ------2.3、設(shè)備控制器 ------------2.3.1、I/O尋址 ------------2.3.2、內(nèi)存映射 I/O 三、系統(tǒng)總線 ------3.1、數(shù)據(jù)總線 ------3.2、地址總線 ------3.3、控制總線 ------3.4、單總線結(jié)構(gòu) ------3.5、多總線結(jié)構(gòu) ------3.6、添加cache的三總線結(jié)構(gòu)

    2024年02月05日
    瀏覽(21)
  • 【linux 多線程并發(fā)】多任務(wù)調(diào)度器,調(diào)度策略時間片輪轉(zhuǎn),先進先出,多種實時任務(wù)的策略,內(nèi)核級最高優(yōu)先級調(diào)度策略

    ? 專欄內(nèi)容 : 參天引擎內(nèi)核架構(gòu) 本專欄一起來聊聊參天引擎內(nèi)核架構(gòu),以及如何實現(xiàn)多機的數(shù)據(jù)庫節(jié)點的多讀多寫,與傳統(tǒng)主備,MPP的區(qū)別,技術(shù)難點的分析,數(shù)據(jù)元數(shù)據(jù)同步,多主節(jié)點的情況下對故障容災(zāi)的支持。 手寫數(shù)據(jù)庫toadb 本專欄主要介紹如何從零開發(fā),開發(fā)的

    2024年02月03日
    瀏覽(32)
  • 文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析)

    文件IO_文件讀寫(附Linux-5.15.10內(nèi)核源碼分析)

    目錄 1.什么是文件偏移量? 1.1 文件偏移量介紹 1.2 文件偏移量重點 1.3 文件偏移量工作原理 2.文件偏移量設(shè)置 2.1 lseek函數(shù) 2.2?lseek內(nèi)核源碼分析 3.寫文件 3.1 write函數(shù) 3.2 write內(nèi)核源碼分析 4.讀文件 4.1 read函數(shù) 4.2 read內(nèi)核源碼分析 5.文件讀寫,文件偏移量設(shè)置示例代碼 在介紹文

    2024年02月16日
    瀏覽(24)
  • 頻繁設(shè)置CGroup觸發(fā)linux內(nèi)核bug導(dǎo)致CGroup running task不調(diào)度

    頻繁設(shè)置CGroup觸發(fā)linux內(nèi)核bug導(dǎo)致CGroup running task不調(diào)度

    1. 說明 1 本篇是實際工作中l(wèi)inux上碰到的一個問題,一個使用了CGroup的進程處于R狀態(tài)但不執(zhí)行,也不退出,還不能kill,經(jīng)過深入挖掘才發(fā)現(xiàn)是Cgroup的內(nèi)核bug 2發(fā)現(xiàn)該bug后,去年給RedHat提交過漏洞,但可惜并未通過,不知道為什么,這里就發(fā)我博客公開了 3 前面的2個帖子《極簡

    2023年04月15日
    瀏覽(19)
  • 【Linux】進程周邊004之進程的調(diào)度與切換(領(lǐng)略Linux系統(tǒng)進程調(diào)度算法的神奇)

    【Linux】進程周邊004之進程的調(diào)度與切換(領(lǐng)略Linux系統(tǒng)進程調(diào)度算法的神奇)

    ? ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《藍(lán)橋杯試題》 《LeetCode刷題筆記》 《實訓(xùn)項目》 《C++》 《Linux》 ?? 每一個不曾起舞的日子,都是對生命的辜負(fù) 目錄 前言 1.進程切換 2.進程調(diào)度 2.1Linux系統(tǒng)的進程調(diào)度算法如何實現(xiàn)兼顧進程優(yōu)先級的設(shè)計

    2024年02月04日
    瀏覽(19)
  • Spark的內(nèi)核調(diào)度

    Spark的內(nèi)核調(diào)度

    目錄 概述 RDD的依賴 ?DAG和Stage ?DAG執(zhí)行流程圖形成和Stage劃分 ?Stage內(nèi)部流程 Spark Shuffle Spark中shuffle的發(fā)展歷程 優(yōu)化前的Hash shuffle ?經(jīng)過優(yōu)化后的Hash shuffle ?Sort shuffle Sort shuffle的普通機制 Job調(diào)度流程 Spark RDD并行度 Spark內(nèi)核調(diào)度任務(wù): 1.構(gòu)建DAG有向無環(huán)圖 2.劃分stage夾斷 3.Dri

    2024年01月17日
    瀏覽(23)
  • 深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

    深入講解Linux內(nèi)核中常用的數(shù)據(jù)結(jié)構(gòu)和算法

    Linux內(nèi)核代碼中廣泛使用了數(shù)據(jù)結(jié)構(gòu)和算法,其中最常用的兩個是鏈表和紅黑樹。 Linux內(nèi)核代碼大量使用了鏈表這種數(shù)據(jù)結(jié)構(gòu)。鏈表是在解決數(shù)組不能動態(tài)擴展這個缺陷而產(chǎn)生的一種數(shù)據(jù)結(jié)構(gòu)。鏈表所包含的元素可以動態(tài)創(chuàng)建并插入和刪除。鏈表的每個元素都是離散存放的,

    2023年04月16日
    瀏覽(24)
  • 【spark】spark內(nèi)核調(diào)度(重點理解)

    【spark】spark內(nèi)核調(diào)度(重點理解)

    Spark的核心是根據(jù)RDD來實現(xiàn)的,Spark Scheduler則為Spark核心實現(xiàn)的重要一環(huán),其作用就是任務(wù)調(diào)度。Spark的任務(wù)調(diào)度就是如何組織任務(wù)去處理RDD中每個分區(qū)的數(shù)據(jù),根據(jù)RDD的依賴關(guān)系構(gòu)建DAG,基于DAG劃分Stage,將每個Stage中的任務(wù)發(fā)到指定節(jié)點運行?;赟park的任務(wù)調(diào)度原理,可以合

    2024年02月03日
    瀏覽(19)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包