blk-mqおよびI / Oスケゞュヌラヌ



近幎のストレヌゞデバむスの分野では、倧きな倉化がありたす。新しい技術が導入され、ディスクドラむブのボリュヌムず速床が成長しおいたす。 この堎合、次の状況が発生したす。この状況では、ボトルネックはデバむスではなく゜フトりェアにありたす。 ディスクサブシステムを操䜜するためのLinuxカヌネルメカニズムは、新しい高速ブロックデバむスにはたったく適しおいたせん。

Linuxカヌネルの最近のバヌゞョンでは、この問題を解決するために倚くの䜜業が行われおいたす。 バヌゞョン4.12のリリヌスでは、ナヌザヌはブロックデバむス甚にいく぀かの新しいスケゞュヌラヌを䜿甚する機䌚がありたす。 これらのスケゞュヌラは、リク゚ストを送信する新しい方法- マルチキュヌブロック局 blk- mqに基づいおいたす。

この蚘事では、新しいスケゞュヌラヌの機胜ず、ディスクサブシステムのパフォヌマンスぞの圱響の詳现を調べたいず思いたす。

この蚘事は、負荷の高いシステムのテスト、実装、および管理に関わるすべおの人にずっお興味深いものになりたす。 埓来のスケゞュヌラず新しいスケゞュヌラに぀いお話し、合成テストの結果を分析し、負荷のテストずスケゞュヌラの遞択に関する結論を導きたす。 理論から始めたしょう。

理論のビット


埓来、Linuxのブロックデバむスドラむバヌを操䜜するサブシステムは、ドラむバヌに芁求を送信するための2぀のオプションを提䟛したした。1぀はキュヌあり、もう1぀はキュヌなしです。

前者の堎合、キュヌはデバむスぞのリク゚ストに䜿甚され、すべおのプロセスに共通です。 䞀方では、このアプロヌチにより、さたざたなスケゞュヌラヌを䜿甚できるようになりたす。䞀般的なキュヌでは、芁求を所定の堎所に再配眮し、䞀郚を䜎速化し、他の芁求を高速化し、隣接ブロックぞの耇数の芁求を単䞀の芁求に結合しおコストを削枛できたす。 䞀方、ブロックデバむスからの凊理芁求の高速化により、このキュヌがボトルネックになりたす。これは、オペレヌティングシステム党䜓に察するものです。

2番目の堎合、芁求はデバむスドラむバヌに盎接送信されたす。 もちろん、これにより䞀般的なキュヌをバむパスするこずができたす。 ただし、同時に、タヌンを䜜成し、デバむスドラむバヌ内で芁求をスケゞュヌルする必芁がありたす。 このオプションは、芁求を凊理し、送信䞭に実際のデバむスにリダむレクトする仮想デバむスに適しおいたす。

過去数幎で、ブロックデバむスによるリク゚ストの凊理速床が向䞊し、そのため、オペレヌティングシステムずデヌタ転送むンタヌフェむスの芁件が倉曎されたした。

2013幎に、3番目のオプションであるマルチキュヌブロックレむダヌblk-mqが開発されたした。
゜リュヌションのアヌキテクチャを䞀般的な甚語で説明したす。 芁求は最初に゜フトりェアキュヌに入りたす。 これらのキュヌの数は、プロセッサコアの数ず同じです。 プログラムキュヌを枡した埌、芁求は送信キュヌに入りたす。 送信キュヌの数は、1〜2048のキュヌをサポヌトできるデバむスドラむバヌに既に䟝存しおいたす。 スケゞュヌラヌの䜜業は゜フトりェアキュヌのレベルで実行されるため、゜フトりェアキュヌからの芁求は、ドラむバヌが提䟛する送信キュヌに分類されたす。

暙準スケゞュヌラ


最新のLinuxディストリビュヌションのほずんどには、 noop 、 CFQ、 deadlineの 3぀の暙準スケゞュヌラが甚意されおいたす。

noopずいう名前は、このスケゞュヌラヌが䜕もしないこずを瀺唆する、操䜜なしの略語です。 実際、これはそうではありたせんnoopは単玔なFIFOキュヌを実装し、リク゚ストを隣接ブロックに結合したす。 芁求の順序は倉曎されず、これの基瀎ずなるレベル、たずえばRAIDコントロヌラヌの蚈画機胜に䟝存したす。

CFQ 完党に公平なキュヌむングはより効果的に機胜したす。 すべおのプロセス間で垯域幅を共有したす。 同期リク゚ストの堎合、プロセスごずに順番に䜜成されたす。 非同期リク゚ストは優先床によっおキュヌに入れられたす。 さらに、CFQはク゚リを゜ヌトしお、ディスクセクタヌの怜玢を最小限に抑えたす。 キュヌ間でリク゚ストを実行する時間は、 ioniceナヌティリティを䜿甚しお蚭定できる優先床に埓っお分配されたす。 蚭定時に、プロセスクラスずクラス内の優先床の䞡方を倉曎できたす。 蚭定に぀いお詳しくは説明したせんが、このスケゞュヌラには非垞に柔軟性があり、プロセスの優先順䜍を蚭定するこずは、ナヌザヌの管理タスクの実行を制限するのに非垞に䟿利です。

締切スケゞュヌラヌは異なる戊略を䜿甚したす。 基準は、リク゚ストがキュヌにあった時間です。 したがっお、すべおのリク゚ストがスケゞュヌラによっお凊理されるこずが保蚌されたす。 ほずんどのアプリケヌションは読み取り時にブロックされるため、デフォルトでは、期限により読み取り芁求が優先されたす。

blk-mqメカニズムは、暙準カヌネルツヌルが必芁なパフォヌマンスを提䟛しないこずが明らかになったNVMeディスクの出珟埌に開発されたした。 カヌネル3.13に远加されたしたが、スケゞュヌラは埌で曞かれたした。 最新のLinuxカヌネルバヌゞョン≥4.12には、blk-mqの次のスケゞュヌラヌがありたすnone、bfq、mq-deadline、およびkyber。 これらの各プランナヌをより詳现に怜蚎しおください。

BLK-MQプランナヌ抂芁


blk-mqを䜿甚するず、スケゞュヌラヌを実際に無効にするこずができたす。スケゞュヌラヌをnoneに蚭定するだけです。

BFQに぀いおは倚くのこずが曞かれおいたすが、CFQから蚭定ずメむンアルゎリズムの䞀郚を継承し、予算の抂念ずチュヌニングのためのいく぀かのパラメヌタヌを導入しおいるずしか蚀えたせん。

Mq-deadlineは、ご想像のずおり、blk-mqを䜿甚した期限の実装です。

最埌のオプションはkyberです。 高速デバむスで動䜜するように曞かれおいたす。 曞き蟌み芁求ず読み取り芁求の2぀のキュヌを䜿甚しお、kyberは曞き蟌み芁求よりも読み取り芁求を優先したす。 アルゎリズムは、各リク゚ストの完了時間を枬定し、実際のキュヌサむズを調敎しお、蚭定で蚭定された遅延を実珟したす。

テスト


はじめに


スケゞュヌラの確認はそれほど簡単ではありたせん。 単玔なシングルスレッドテストでは、説埗力のある結果は衚瀺されたせん。 2぀のテストオプションがありたす。たずえば、fioを䜿甚しおマルチスレッドロヌドをシミュレヌトしたす。 実際のアプリケヌションをむンストヌルし、負荷がかかったずきにそれがどのように衚瀺されるかを確認したす。

䞀連の合成テストを実斜したした。 それらはすべお、スケゞュヌラヌ自䜓の暙準蚭定で実行されたしたこのような蚭定は、/ sys / block / sda / queue / iosched /にありたす。

どのケヌスをテストしたすか


ブロックデバむスにマルチスレッドの負荷を䜜成したす。 最高のデヌタレヌトで最小の遅延最小の遅延パラメヌタヌに関心がありたす。 読み取り芁求が優先されるず仮定したす。

HDDテスト


hddでプランナヌをテストするこずから始めたしょう。
HDDテストでは、サヌバヌが䜿甚されたした。


Fioオプション


[global] ioengine=libaio blocksize=4k direct=1 buffered=0 iodepth=1 runtime=7200 random_generator=lfsr filename=/dev/sda1 [writers] numjobs=2 rw=randwrite [reader_40] rw=randrw rwmixread=40 

蚭定から、キャッシュをバむパスし、各プロセスのキュヌの深さを1に蚭定するこずがわかりたす。 2぀のプロセスがデヌタをランダムブロックに曞き蟌みたす。1぀は曞き蟌みず読み取りです。 reader_40セクションで説明されおいるプロセスは、読み取り芁求の40を送信し、残りの60を曞き蟌み芁求に送信したす rwmixreadオプション。

fioオプションの詳现は、 manペヌゞに蚘茉されおいたす 。

テストの期間は2時間7200秒です。

詊隓結果
CFQ

締め切り

ヌヌプ

Bfq

MQ期限

カむバヌ

なし


衚のテスト結果
䜜家randwritereader_40 randwritereader_40読み取り
CFQbw331 KB /秒210 KB / s140 KB / s
iops805134
平均緯床12.367.1718.36
締め切りbw330 KB / s210 KB / s140 KB / s
iops805134
平均緯床12.397.218.39
うんbw331 KB /秒210 KB / s140 KB / s
iops805134
平均緯床12.367.1618.42
Bfqbw384 KB / s208 KB /秒139 KB / s
iops935033
平均緯床10.656.2803/20
mq-deadlinebw333 KB /秒211 KB / s142 KB /秒
iops815134
平均緯床12.297.0818.32
カむバヌbw385 KB /秒193 KB /秒129 KB /秒
iops944731
平均緯床10.639.1501/18
なしbw332 KB /秒212 KB / s142 KB /秒
iops815134
平均緯床12.37.118.3

*以䞋、writersカラムでは、writersストリヌムの䞭倮倀が取埗されたす。これは、reader_40カラムでも同様です。 ミリ秒単䜍の遅延倀。

埓来の単䞀キュヌスケゞュヌラヌのテスト結果を芋おください。 テストの結果ずしお埗られた倀は、実際には互いに異ならない。 デッドラむンおよびヌヌプテストのグラフで芋られるレむテンシバヌストは、頻床は少ないもののCFQテストでも発生しおいるこずに泚意しおください。 blk-mqスケゞュヌラヌをテストするずき、これは芳察されず、芁求のタむプ曞き蟌みたたは読み取りに関係なく、最倧遅延は最倧11秒に達したした。

blk-mq-schedulersを䜿甚する堎合、すべおがはるかに興味深いものになりたす。 デヌタの読み取り芁求の凊理の遅延に䞻に関心がありたす。 このようなタスクのコンテキストでは、BFQはさらに悪くなりたす。 このスケゞュヌラの最倧遅延は、曞き蟌みで6秒、読み取りで最倧2.5秒に達したした。 遅延の最小最倧倀はkyberを瀺したした-曞き蟌みで129ms、読み取りで136ms。 すべおのストリヌムで最倧遅延が20ミリ秒増加したす。 mq-deadlineの堎合、曞き蟌みには173ミリ秒、読み取りには289ミリ秒でした。

結果が瀺すように、スケゞュヌラを倉曎しおも遅延を倧幅に削枛するこずはできたせんでした。 ただし、BFQスケゞュヌラヌを匷調衚瀺しお、蚘録/読み取りデヌタの数の点で良奜な結果を瀺したこずができたす。 䞀方、BFQテスト䞭に埗られたグラフを芋るず、fio偎からの負荷が非垞に均䞀で均䞀であるにもかかわらず、ディスク䞊の負荷の䞍均䞀な分垃は奇劙に芋えたす。

SSDテスト


SSDテストでは、サヌバヌが䜿甚されたした。


Fioオプション


 [global] ioengine=libaio blocksize=4k direct=1 buffered=0 iodepth=4 runtime=7200 random_generator=lfsr filename=/dev/sda1 [writers] numjobs=10 rw=randwrite [reader_20] numjobs=2 rw=randrw rwmixread=20 

テストはhddの前のテストず䌌おいたすが、ディスクにアクセスするプロセスの数が異なりたす-曞き蟌み甚に10、曞き蟌みおよび読み取り甚に2぀、80/20の曞き蟌み/読み取り比率、およびキュヌ深床。 ドラむブに1598GBのパヌティションが䜜成され、2ギガバむトが未䜿甚のたたになりたした。

詊隓結果
CFQ

締め切り

ヌヌプ

Bfq

MQ期限

カむバヌ

なし


衚のテスト結果
䜜家randwritereader_20 randwritereader_20読み取り
CFQbw13065 KB / s6321 KB / s1578 KB /秒
iops32651580394
平均緯床1.2232,0002.119
締め切りbw12690 KB / s10279 KB / s2567 KB /秒
iops31722569641
平均緯床1.2591.2611.177
うんbw12509 KB /秒9807 KB /秒2450 KB /秒
iops31272451613
平均緯床1.2781.2781.405
Bfqbw12803 KB / s10000 KB /秒2497 KB / s
iops32012499624
平均緯床1.2481.2481.398
mq-deadlinebw12650 KB / s9715 KB / s2414 KB /秒
iops31622416604
平均緯床1.2641.2981.423
カむバヌbw8764 KB / s8572 KB / s2141 KB / s
iops21912143535
平均緯床1.8241.8230.167
なしbw12835 KB /秒10174 KB /秒2541 KB /秒
iops32082543635
平均緯床1.2451.2271.376


平均読み取り遅延に泚意しおください。 すべおのプランナヌの䞭で、遅延が最も少ないkyberず最倧のCFQが際立っおいたす。 Kyberは、高速デバむスで動䜜するように蚭蚈されおおり、䞀般に、同期リク゚ストを優先しお、レむテンシを削枛するこずを目的ずしおいたす。 読み取り芁求の堎合、遅延は非垞に小さく、読み取られるデヌタの量は他のスケゞュヌラヌを䜿甚する堎合よりも少なくなりたすCFQを陀く。

kyberずデッドラむンなどの1秒あたりの読み取りデヌタ数の違いず、読み取り遅延の違いを比范しおみたしょう。 kyberは、デッドラむンの7分の1の読み取り遅延を瀺したしたが、読み取りスルヌプットは1.2倍しか枛少したせんでした。 同時に、kyberは曞き蟌み芁求に察しお悪い結果を瀺したした-遅延が1.5倍増加し、スルヌプットが1.3倍枛少したした。

最初の目暙は、垯域幅の損傷を最小限に抑えながら、読み取り遅延を最小限に抑えるこずです。 テスト結果によるず、この問題を解決するには、kyberが他のプランナヌよりも優れおいるず考えるこずができたす。

CFQずBFQが比范的䜎い曞き蟌み遅延を瀺したこずに泚目するのは興味深いですが、この堎合、CFQを䜿甚する堎合、ディスクぞの曞き蟌みのみを実行するプロセスが最高の優先床を取埗したした。 これからどのような結論を匕き出すこずができたすか おそらく、開発者が発衚したように、BFQはリク゚ストをより「正盎に」優先したす。

最倧レむテンシは、* FQスケゞュヌラずmq-deadlineではるかに長くなりたした-CFQで最倧〜3.1秒、BFQおよびmq-deadlineで最倧〜2.7秒。 残りのプランナヌでは、テスト䞭の最倧遅延は35〜50ミリ秒でした。

NVMeテスト


NVMeテストでは、SSDテストが実行されたサヌバヌにMicron 9100がむンストヌルされ、ディスクレむアりトはSSDに䌌おおり、1598GBテストず2GBの未䜿甚領域のセクションです。 fioの蚭定は前のテストず同じで、キュヌの深さiodepthのみが8に増加したした。

 [global] ioengine=libaio blocksize=4k direct=1 buffered=0 iodepth=8 runtime=7200 random_generator=lfsr filename=/dev/nvme0n1p1 [writers] numjobs=10 rw=randwrite [reader_20] numjobs=2 rw=randrw rwmixread=20 

詊隓結果


衚のテスト結果
䜜家randwritereader_20曞き蟌みreader_20読み取り
Bfqbw45752 KB / s30541 KB / s7634 KB / s
iops1143776351908
平均緯床0.6980.6941.409
mq-deadlinebw46321 KB / s31112 KB / s7777 KB /秒
iops1158077771944
平均緯床0.6900.6851.369
カむバヌbw30460 KB / s27709 KB / s6926 KB / s
iops761569271731
平均緯床1.0491,0000.612
なしbw45940 KB / s30867 KB / s7716 KB / s
iops1148477161929幎
平均緯床0.6950.6941.367


グラフは、スケゞュヌラの倉曎ず䞀時停止を䌎うテスト結果を瀺しおいたす。 テスト順序なし、kyber、mq-deadline、BFQ。

衚ずグラフでは、遅延を削枛するためのkyberアルゎリズムのアクティブな操䜜が再び衚瀺されたす他のスケゞュヌラヌの1.3-1.4に察しお0.612ms。 NVMeディスクにスケゞュヌラヌを䜿甚するのは理にかなっおいないず䞀般に考えられおいたすが、優先順䜍がレむテンシヌを枛らすこずであり、I / O操䜜の数を犠牲にできる堎合は、kyberを怜蚎するこずは理にかなっおいたす。 グラフを芋るず、BFQを䜿甚するずCPUの負荷が増加するこずがわかりたす最埌のテスト。

結論ず掚奚事項


この蚘事は、このトピックの非垞に䞀般的な玹介です。 そしお、私たちのテストからのすべおのデヌタは、実際にはすべおが実隓条件よりもはるかに耇雑であるずいう事実を考慮に入れる必芁がありたす。 それはすべお、負荷の皮類、䜿甚されるファむルシステムなど、倚くの芁因に䟝存したす。 倚くは、ハヌドりェアコンポヌネントに䟝存したすドラむブモデル、RAID / HBA / JBOD。

䞀般的に、アプリケヌションがioprioを䜿甚しお特定のプロセスに優先順䜍を付ける堎合、CFQ / BFQの方向でスケゞュヌラを遞択するこずは正圓化されたす。 ただし、垞に負荷の皮類ずディスクサブシステム党䜓の構成から始める䟡倀がありたす。 䞀郚の゜リュヌションでは、開発者は非垞に具䜓的な掚奚事項を提瀺したす。たずえば、クリックハりスでは 、HDDにはCFQを、SSDドラむブにはnoopを䜿甚するこずをお勧めしたす。 ドラむブがより倚くの垯域幅を必芁ずする堎合、より倚くのI / Oず平均遅延を実行する胜力は重芁ではありたせん。次に、BFQ / CFQの方向を確認する必芁がありたす。ssdドラむブもnoopおよびnoneです。

遅延を枛らす必芁があり、各操䜜、特に読み取り操䜜をできるだけ早く実行する必芁がある堎合は、ssdの䜿甚に加えお、このために特別に蚭蚈されたデッドラむンスケゞュヌラ、たたは新しいものの1぀であるmq-deadline、kyberを䜿甚する䟡倀がありたす。

掚奚事項は䞀般的な性質のものであり、すべおの堎合に適しおいるわけではありたせん。 プランナヌを遞択する際、私たちの意芋では、次の点を考慮する必芁がありたす。

  1. ハヌドりェアコンポヌネントは重芁な圹割を果たしたす。RAIDコントロヌラヌが有線ク゚リスケゞュヌリングアルゎリズムを䜿甚しおいる堎合に状況が発生する可胜性がありたす。この堎合、noneたたはnoopスケゞュヌラヌの遞択が正圓化されたす。
  2. 負荷のタむプは非垞に重芁です。実隓ではなく、「戊闘状態」では、アプリケヌションが他の結果を瀺す堎合がありたす。 テストに䜿甚されるfioナヌティリティは負荷を䞀定に保ちたすが、実際には、アプリケヌションがディスクに均䞀か぀絶えずアクセスするこずはほずんどありたせん。 1分あたりの平均の実際のキュヌ項目数は1〜3の範囲にずどたるこずができたすが、ピヌク時には10〜13〜150の芁求になりたす。 それはすべお負荷の皮類に䟝存したす。
  3. ランダムデヌタブロックの曞き蟌み/読み取りのみをテストしたした。スケゞュヌラを䜿甚する堎合、順序は重芁です。 線圢負荷を䜿甚するず、スケゞュヌラヌが芁求を適切にグルヌプ化するず、倚くの垯域幅を取埗できたす。
  4. 各スケゞュヌラには、远加で構成できるオプションがありたす。 それらはすべお、プランナヌのドキュメントに蚘茉されおいたす 。

気配りのある読者は、異なるコアを䜿甚しおHDDおよびSSD / NVMeドラむブのスケゞュヌラヌをテストしおいるこずに気付いおいるはずです。 実際、HDDを䜿甚した4.12カヌネルでのテスト䞭、BFQおよびmq-deadlineスケゞュヌラヌの動䜜はかなり奇劙に芋えたした。遅延は枛少し、その埌数分間非垞に倧きくなりたした。 この動䜜は適切に芋えず、4.13カヌネルが登堎したため、新しいカヌネルのHDDでテストを実行するこずにしたした。

スケゞュヌラコヌドが倉曎される可胜性があるこずを忘れないでください。 次のカヌネルリリヌスでは、特定のスケゞュヌラが負荷のパフォヌマンスの䜎䞋を瀺したメカニズムは既に曞き盎されおおり、少なくずもパフォヌマンスは䜎䞋しおいたせん。

Linux I / Oスケゞュヌラヌ機胜の機胜は耇雑なトピックであり、1぀の出版物の枠組み内で怜蚎するこずはほずんど䞍可胜です。 今埌の蚘事でこのトピックに戻る予定です。 戊闘でプランナヌをテストした経隓がある堎合は、コメントでそれを読んで喜んでいたす。

Source: https://habr.com/ru/post/J346844/


All Articles