寫(xiě)在前面
博文內(nèi)容涉及,IO調(diào)度器,以及IO負(fù)載工具?fio?介紹,磁盤(pán)整列,IO 分析工具簡(jiǎn)單介紹
理解不足小伙伴幫忙指正
對(duì)每個(gè)人而言,真正的職責(zé)只有一個(gè):找到自我。然后在心中堅(jiān)守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是對(duì)大眾理想的懦弱回歸,是隨波逐流,是對(duì)內(nèi)心的恐懼 ——赫爾曼·黑塞《德米安》
固態(tài)硬盤(pán)正逐步取代磁盤(pán)成為存儲(chǔ)的標(biāo)準(zhǔn)解決方案,傳統(tǒng)磁盤(pán)的轉(zhuǎn)速、尋道時(shí)間、延遲、機(jī)械故障等特點(diǎn),在新的固態(tài)硬盤(pán)中已經(jīng)不復(fù)存在。固態(tài)硬盤(pán)的訪問(wèn)時(shí)間在真?zhèn)€設(shè)備中是統(tǒng)一的,因此碎片和磁道的優(yōu)化也不再需要,固態(tài)硬盤(pán)大小更小、更輕、更節(jié)能。
但是固態(tài)硬盤(pán)也有局限性,比如成本較高。固態(tài)硬盤(pán)的寫(xiě)入次數(shù)有限。
很多傳統(tǒng)硬盤(pán)的優(yōu)化不再適用于固態(tài)硬盤(pán),紅帽不建議在固態(tài)硬盤(pán)設(shè)備使用日志,因?yàn)楣虘B(tài)磨損增加,并且不必要的雙重寫(xiě)入會(huì)導(dǎo)致速度緩慢。
選擇合適的IO 調(diào)度器
在這里插入圖片描述
RHEL8開(kāi)始使用新的多隊(duì)列I/O調(diào)度器來(lái)替代之前的單隊(duì)列調(diào)度器。
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$cat /sys/block/nvme0n1/queue/scheduler [none] mq-deadline kyber bfq ┌──[root@liruilongs.github.io]-[~] └─$cat /sys/block/sr0/queue/scheduler none [mq-deadline] kyber bfq ┌──[root@liruilongs.github.io]-[~] └─$
?
?
?
調(diào)度器分類(lèi):
Noop/none
Noop(none是多隊(duì)列版本的Noop)?調(diào)度算法是 Linux 內(nèi)核中最簡(jiǎn)單的 IO 調(diào)度算法之一。它也被稱(chēng)為電梯調(diào)度算法。Noop 調(diào)度算法將 IO 請(qǐng)求放入一個(gè) FIFO(先進(jìn)先出)隊(duì)列中,并按順序執(zhí)行這些 IO 請(qǐng)求。對(duì)于一些在磁盤(pán)上連續(xù)的 IO 請(qǐng)求,Noop 算法會(huì)適當(dāng)?shù)剡M(jìn)行一些合并操作。這個(gè)調(diào)度算法特別適用于那些不希望調(diào)度器重新組織 IO 請(qǐng)求順序的應(yīng)用程序。
Noop 調(diào)度算法的應(yīng)用案例包括:
底層設(shè)備比內(nèi)核調(diào)度器更優(yōu)秀:當(dāng)?shù)讓釉O(shè)備(如 RAID、SAN、NAS 設(shè)備)具有自己的高效調(diào)度算法時(shí),使用 Noop 算法可以避免重復(fù)的調(diào)度開(kāi)銷(xiāo)。
上層應(yīng)用比內(nèi)核調(diào)度器更優(yōu)秀:某些應(yīng)用程序可能已經(jīng)實(shí)現(xiàn)了自己的 IO 調(diào)度邏輯,使用 Noop 算法可以避免與內(nèi)核調(diào)度器的沖突。
非旋轉(zhuǎn)磁頭的設(shè)備:對(duì)于不需要磁頭尋道的設(shè)備(如 SSD),內(nèi)核調(diào)度器的重新組織 IO 請(qǐng)求可能會(huì)浪費(fèi) CPU 時(shí)間,而 Noop 算法可以節(jié)省這些開(kāi)銷(xiāo)
Deadline/mq-deadline
Deadline 調(diào)度算法旨在確保每個(gè) IO 請(qǐng)求在一定的時(shí)間內(nèi)得到服務(wù),以避免某個(gè)請(qǐng)求饑餓。每個(gè)請(qǐng)求都被賦予一個(gè)期限值,讀請(qǐng)求的默認(rèn)期限是 500 毫秒,寫(xiě)請(qǐng)求的默認(rèn)期限是 5 秒。該算法適用于需要保證 IO 響應(yīng)時(shí)間的應(yīng)用場(chǎng)景。
Deadline應(yīng)用:一些多線程和數(shù)據(jù)庫(kù)的應(yīng)用適合Deadline算法(業(yè)務(wù)壓力重,功能單一的場(chǎng)景)
deadline是單隊(duì)列,mq(multi-queue)是多隊(duì)列,核心算法是一樣的
CFQ(Completely Fair Queuing)
CFQ 是 Linux 內(nèi)核默認(rèn)的 IO 調(diào)度算法,它嘗試為所有需要 IO 的進(jìn)程分配請(qǐng)求隊(duì)列和時(shí)間片。每個(gè)進(jìn)程根據(jù)其 IO 優(yōu)先級(jí)獲得時(shí)間片,并在時(shí)間片內(nèi)發(fā)送其讀寫(xiě)請(qǐng)求給底層塊設(shè)備。此算法旨在提供公平的 IO 資源分配,適用于多任務(wù)環(huán)境。
每個(gè)進(jìn)程的時(shí)間片和每個(gè)進(jìn)程的隊(duì)列長(zhǎng)度取決于進(jìn)程的IO優(yōu)先級(jí),每個(gè)進(jìn)程都會(huì)有一個(gè)IO優(yōu)先級(jí)。通過(guò)ionice可以顯示或修改進(jìn)程的IO優(yōu)先級(jí)!
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$man ionice
?
?
?
BFQ(Budget Fair Queueing)
BFQ 算法將以扇區(qū)數(shù)為單位的預(yù)算分配給每個(gè)進(jìn)程,而不是固定的時(shí)間片。它旨在提供更精確的 IO 資源分配,避免某些任務(wù)占用過(guò)多的 IO 資源。BFQ 算法適用于對(duì)IO 響應(yīng)時(shí)間要求較高的應(yīng)用場(chǎng)景。
Kyber
Kyber 調(diào)度算法類(lèi)似于 Noop,它是一種簡(jiǎn)單的調(diào)度算法,不進(jìn)行顯式的調(diào)度操作。它對(duì)于一些底層設(shè)備已經(jīng)具有高效調(diào)度算法的情況下,可以發(fā)揮更好的性能。
?
注意:NVMe硬盤(pán)默認(rèn)使用none I/O調(diào)度算法,你不能改變NVMe硬盤(pán)的調(diào)度算法。
使用fio工具模擬工作負(fù)載
測(cè)試存儲(chǔ)系統(tǒng)需要模擬真實(shí)的工作負(fù)載。fio命令可以通過(guò)多進(jìn)程和多線程模擬各種工作負(fù)載情況(實(shí)現(xiàn)別發(fā)讀寫(xiě)數(shù)據(jù)),包括順序讀寫(xiě),隨機(jī)讀寫(xiě)以及I/O類(lèi)型。建議通過(guò) /usr/share/doc/fio/HOWTO來(lái)學(xué)習(xí)fio如何使用。
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$dnf provides fio Last metadata expiration check: 3:13:00 ago on Mon Feb 5 04:06:51 2024. fio-3.35-1.el9.x86_64 : Multithreaded IO generation tool Repo : appstream Matched from: Provide : fio = 3.35-1.el9 ┌──[root@liruilongs.github.io]-[~] └─$dnf -y install fio
┌──[root@liruilongs.github.io]-[~] └─$rpm -ql fio | grep HOWTO /usr/share/doc/fio/HOWTO.rst ┌──[root@liruilongs.github.io]-[~] └─$cat $(!!) | grep -i -A 5 "Example output" cat $(rpm -ql fio | grep HOWTO) | grep -i -A 5 "Example output" Example output was based on the following: TZ=UTC fio --iodepth=8 --ioengine=null --size=100M --time_based --rate=1256k --bs=14K --name=quick --runtime=1s --name=mixed --runtime=2m --rw=rw Fio spits out a lot of output. While running, fio will display the status of the -- Example output was based on the following: TZ=UTC fio --iodepth=8 --ioengine=null --size=100M --runtime=58m --time_based --rate=2512k --bs=256K --numjobs=10 --name=readers --rw=read --name=writers --rw=write Fio will condense the thread string as not to take up more space on the command -- Example output was based on the following: TZ=UTC fio --iodepth=16 --ioengine=posixaio --filename=/tmp/fiofile --direct=1 --size=100M --time_based --runtime=50s --rate_iops=89 --bs=7K --name=Client1 --rw=write When fio is done (or interrupted by :kbd:`Ctrl-C`), it will show the data for -- Example output was based on the following: TZ=UTC fio --ioengine=null --iodepth=2 --size=100M --numjobs=2 --rate_process=poisson --io_limit=32M --name=read --bs=128k --rate=11M --name=write --rw=write --bs=2k --rate=700k After each client has been listed, the group statistics are printed. They ┌──[root@liruilongs.github.io]-[~] └─$
?
?
?
下面的命令執(zhí)行隨機(jī)寫(xiě)操作,將512M數(shù)據(jù)寫(xiě)入一個(gè)指定的文件中,寫(xiě)操作是不使用緩存,采用直接寫(xiě)入硬盤(pán)的方式,同時(shí)進(jìn)行2個(gè)相同的操作(2個(gè)進(jìn)程或線程)。
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4K --direct=1 --size=512M --numjobs=2 --group_reporting --filename=/tmp/testfile randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1 ... fio-3.35 Starting 2 processes Jobs: 2 (f=2): [w(2)][95.7%][w=41.9MiB/s][w=10.7k IOPS][eta 00m:01s] randwrite: (groupid=0, jobs=2): err= 0: pid=20196: Mon Feb 5 07:28:25 2024 write: IOPS=11.5k, BW=44.9MiB/s (47.1MB/s)(1024MiB/22803msec); 0 zone resets slat (usec): min=12, max=3836, avg=23.81, stdev=27.13 clat (nsec): min=1709, max=6549.7k, avg=148047.50, stdev=154937.29 lat (usec): min=69, max=6587, avg=171.85, stdev=164.42 clat percentiles (usec): | 1.00th=[ 80], 5.00th=[ 84], 10.00th=[ 86], 20.00th=[ 90], | 30.00th=[ 94], 40.00th=[ 99], 50.00th=[ 106], 60.00th=[ 117], | 70.00th=[ 131], 80.00th=[ 153], 90.00th=[ 221], 95.00th=[ 318], | 99.00th=[ 898], 99.50th=[ 1123], 99.90th=[ 1696], 99.95th=[ 2008], | 99.99th=[ 3097] bw ( KiB/s): min=18528, max=64600, per=99.77%, avg=45878.96, stdev=6563.89, samples=90 iops : min= 4632, max=16150, avg=11469.69, stdev=1641.01, samples=90 lat (usec) : 2=0.01%, 4=0.06%, 10=0.02%, 20=0.01%, 50=0.02% lat (usec) : 100=42.05%, 250=49.94%, 500=4.86%, 750=1.42%, 1000=0.92% lat (msec) : 2=0.64%, 4=0.05%, 10=0.01% cpu : usr=2.16%, sys=9.33%, ctx=270388, majf=0, minf=26 IO depths : 1=100.0%, 2=0.0%, 4=0.0%, 8=0.0%, 16=0.0%, 32=0.0%, >=64=0.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% issued rwts: total=0,262144,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=1 Run status group 0 (all jobs): WRITE: bw=44.9MiB/s (47.1MB/s), 44.9MiB/s-44.9MiB/s (47.1MB/s-47.1MB/s), io=1024MiB (1074MB), run=22803-22803msec Disk stats (read/write): dm-0: ios=0/259699, merge=0/0, ticks=0/38126, in_queue=38126, util=99.67%, aggrios=0/262144, aggrmerge=0/0, aggrticks=0/40150, aggrin_queue=40150, aggrutil=99.56% nvme0n1: ios=0/262144, merge=0/0, ticks=0/40150, in_queue=40150, util=99.56% ┌──[root@liruilongs.github.io]-[~] └─$
?
?
?
randwrite:測(cè)試名稱(chēng)。
rw=randwrite:讀寫(xiě)模式為隨機(jī)寫(xiě)入。
bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B:讀取和寫(xiě)入的塊大小都是 4096 字節(jié)。
ioengine=libaio:使用 libaio 作為 I/O 引擎。
iodepth=1:I/O 深度為 1。
write: IOPS=11.5k, BW=44.9MiB/s:寫(xiě)入操作的 IOPS(每秒輸入/輸出操作數(shù))為 11,500,帶寬為 44.9 MiB/s(兆字節(jié)/秒)。
slat:寫(xiě)入操作的起始時(shí)間統(tǒng)計(jì)。
clat:寫(xiě)入操作的完成時(shí)間統(tǒng)計(jì)。
lat:寫(xiě)入操作的總體響應(yīng)時(shí)間統(tǒng)計(jì)。
bw:寫(xiě)入操作的帶寬統(tǒng)計(jì)。
iops:寫(xiě)入操作的 IOPS 統(tǒng)計(jì)。
cpu:CPU 使用情況統(tǒng)計(jì)。
IO depths:不同 I/O 深度的統(tǒng)計(jì)。
Run status group 0 (all jobs):運(yùn)行狀態(tài)的總結(jié)信息。
WRITE: bw=44.9MiB/s (47.1MB/s), 44.9MiB/s-44.9MiB/s (47.1MB/s-47.1MB/s), io=1024MiB (1074MB), run=22803-22803msec:寫(xiě)入操作的帶寬和持續(xù)時(shí)間統(tǒng)計(jì)。
Disk stats (read/write):磁盤(pán)的讀寫(xiě)統(tǒng)計(jì)信息。
磁盤(pán)陣列
磁盤(pán)陣列是一種虛擬化存儲(chǔ)技術(shù),將多個(gè)磁盤(pán)組成一個(gè)大的磁盤(pán),利用同步寫(xiě)入到這些磁盤(pán)的技術(shù),不但可以加快讀寫(xiě)速度,而且支持?jǐn)?shù)據(jù)恢復(fù)(需要有冗余數(shù)據(jù))。
RAID會(huì)將數(shù)據(jù)打散成很多小數(shù)據(jù)塊,這些數(shù)據(jù)塊會(huì)被寫(xiě)入陣列中的不同磁盤(pán)。這些數(shù)據(jù)需要滿(mǎn)足一個(gè)或多個(gè)策略需求:數(shù)據(jù)條帶化、數(shù)據(jù)鏡像化、數(shù)據(jù)校驗(yàn)。
數(shù)據(jù)條帶化將數(shù)據(jù)劃分為條帶,這些條帶分布在RAID陣列內(nèi)的多個(gè)磁盤(pán)中。
數(shù)據(jù)鏡像提供了將條帶復(fù)制到至少兩個(gè)不同RAID磁盤(pán)得冗余性。數(shù)據(jù)奇偶校驗(yàn)通過(guò)將奇偶校驗(yàn)添加到條帶來(lái)支持?jǐn)?shù)據(jù)冗余,因此與相同數(shù)據(jù)量相關(guān)的其他條帶可以使用工作數(shù)據(jù)及其相關(guān)的
RAID 0:數(shù)據(jù)條帶化(Striping),沒(méi)有冗余。通過(guò)將數(shù)據(jù)分割成條帶并在多個(gè)磁盤(pán)之間分布存儲(chǔ),提高了吞吐量,但沒(méi)有冗余備份。適用于需要高性能和較低成本的應(yīng)用,但不提供故障容錯(cuò)能力。
在這里插入圖片描述
磁盤(pán)要求:至少需要兩個(gè)磁盤(pán)。
容錯(cuò)能力:沒(méi)有冗余,任何一個(gè)磁盤(pán)故障都會(huì)導(dǎo)致數(shù)據(jù)丟失。
RAID 1:數(shù)據(jù)鏡像(Data Mirroring)。通過(guò)將數(shù)據(jù)復(fù)制到至少兩個(gè)不同的 RAID 磁盤(pán)上,提供冗余備份。當(dāng)一個(gè)磁盤(pán)故障時(shí),仍然可以從鏡像磁盤(pán)讀取數(shù)據(jù)。數(shù)據(jù)冗余和讀取冗余帶來(lái)了更高的數(shù)據(jù)可靠性,但寫(xiě)入性能略有降低。
在這里插入圖片描述
磁盤(pán)要求:至少需要兩個(gè)磁盤(pán)。
容錯(cuò)能力:可以容忍一個(gè)磁盤(pán)故障,因?yàn)閿?shù)據(jù)被鏡像到其他磁盤(pán)上。
RAID 4:基于塊的條帶化,帶有專(zhuān)用奇偶校驗(yàn)磁盤(pán)。類(lèi)似于?RAID 0,但額外使用了一個(gè)專(zhuān)用的奇偶校驗(yàn)磁盤(pán)來(lái)存儲(chǔ)奇偶校驗(yàn)信息。該奇偶校驗(yàn)信息用于恢復(fù)任何一個(gè)數(shù)據(jù)塊,從而提供了故障容錯(cuò)能力。
在這里插入圖片描述
磁盤(pán)要求:至少需要三個(gè)磁盤(pán)。
容錯(cuò)能力:可以容忍一個(gè)磁盤(pán)故障,因?yàn)橛幸粋€(gè)專(zhuān)用的奇偶校驗(yàn)磁盤(pán)。
RAID 5:基于塊的條帶化,帶有分布式奇偶校驗(yàn)。類(lèi)似于?RAID 4,但奇偶校驗(yàn)信息分布在所有磁盤(pán)上,而不是單獨(dú)的奇偶校驗(yàn)磁盤(pán)上。這種分布式奇偶校驗(yàn)提供了更好的性能和容錯(cuò)能力。
在這里插入圖片描述
磁盤(pán)要求:至少需要三個(gè)磁盤(pán)。
容錯(cuò)能力:可以容忍一個(gè)磁盤(pán)故障,因?yàn)槠媾夹r?yàn)信息分布在所有磁盤(pán)上。
RAID 6:基于塊的條帶化,帶有雙重分布式奇偶校驗(yàn)。類(lèi)似于?RAID 5,但提供了更高的冗余度。使用兩個(gè)奇偶校驗(yàn)計(jì)算來(lái)提供更高級(jí)別的容錯(cuò)能力,即使在兩個(gè)磁盤(pán)故障的情況下,也能夠恢復(fù)數(shù)據(jù)。
在這里插入圖片描述
磁盤(pán)要求:至少需要四個(gè)磁盤(pán)。
容錯(cuò)能力:可以容忍兩個(gè)磁盤(pán)故障,因?yàn)槭褂昧穗p重分布式奇偶校驗(yàn)。
RAID 10:鏡像的條帶化。將數(shù)據(jù)分成條帶并在多個(gè)磁盤(pán)上進(jìn)行鏡像。提供了數(shù)據(jù)冗余和高性能的組合。數(shù)據(jù)被同時(shí)寫(xiě)入多個(gè)磁盤(pán),提供了冗余備份和更快的讀取性能。
磁盤(pán)要求:至少需要四個(gè)磁盤(pán)。
容錯(cuò)能力:可以容忍多個(gè)磁盤(pán)故障,具體取決于故障發(fā)生在哪個(gè)鏡像組上
創(chuàng)建軟RAID
mdadm 是一個(gè)用于管理 Linux 軟件 RAID 的工具。
?
?
?
//創(chuàng)建RAID,-l指定級(jí)別 [root@localhost ~]# mdadm -C /dev/md0 -l raid0 -n 2 /dev/vd[b-c]1 //停止使用RAID [root@localhost ~]# mdadm --stop /dev/md0 //刪除RAID [root@localhost ~]# mdadm --remove /dev/md0 //將原來(lái)RAID硬盤(pán)中的數(shù)據(jù)清零 [root@localhost ~]# mdadm --zero-superblock /dev/vdb [root@localhost ~]# mdadm --zero-superblock /dev/vdc
?
?
?
創(chuàng)建好RAID之后,最好在格式化文件系統(tǒng)的時(shí)候,讓文件系統(tǒng)和RAID數(shù)據(jù)分塊保持一致。我們需要先了解一下這些信息:
Chunk Size(塊大小):Chunk 是 RAID 中的最小數(shù)據(jù)單元,決定了數(shù)據(jù)如何在磁盤(pán)上進(jìn)行分割和存儲(chǔ)。較小的塊大小可以提供更好的性能,因?yàn)閿?shù)據(jù)可以更細(xì)粒度地分布在多個(gè)磁盤(pán)上。然而,小塊大小可能會(huì)增加磁盤(pán)開(kāi)銷(xiāo)和額外的存儲(chǔ)空間。較大的塊大小可以提供更高的數(shù)據(jù)傳輸效率,但在故障恢復(fù)時(shí)可能需要恢復(fù)更多的數(shù)據(jù)。
Number of Disks(磁盤(pán)數(shù)量):磁盤(pán)數(shù)量決定了 RAID 中可用于存儲(chǔ)數(shù)據(jù)的物理磁盤(pán)數(shù)量。增加磁盤(pán)數(shù)量可以提高性能和存儲(chǔ)容量。更多的磁盤(pán)可以提供更多的并行性,從而提高數(shù)據(jù)傳輸速度。但同時(shí),也意味著更多的磁盤(pán)故障可能會(huì)導(dǎo)致數(shù)據(jù)丟失。
Number of Parity Disks(奇偶校驗(yàn)磁盤(pán)數(shù)量):奇偶校驗(yàn)磁盤(pán)用于存儲(chǔ)冗余信息,以實(shí)現(xiàn)數(shù)據(jù)的容錯(cuò)能力。在 RAID 4、RAID 5 和 RAID 6 級(jí)別中,需要指定奇偶校驗(yàn)磁盤(pán)的數(shù)量。增加奇偶校驗(yàn)磁盤(pán)的數(shù)量可以提供更高的容錯(cuò)能力,因?yàn)楦嗟拇疟P(pán)故障可以被容忍。然而,每個(gè)奇偶校驗(yàn)磁盤(pán)都會(huì)增加額外的存儲(chǔ)開(kāi)銷(xiāo)。
對(duì)于XFS文件系統(tǒng),格式化的時(shí)候可以使用su和sw選項(xiàng)指定RAID的chunk size和number of data disk,保持一致。
?
?
?
mkfs -t xfs -d su=64k,sw=4 /dev/san/lun1
?
?
?
對(duì)于ext4文件系統(tǒng)而言,我們需要掌握除了上面的信息還需要:
文件系統(tǒng)塊大小(block size):文件系統(tǒng)塊大小是文件系統(tǒng)使用的最小數(shù)據(jù)單元。它決定了文件在存儲(chǔ)介質(zhì)上的最小分配單位。較小的塊大小可以提供更好的空間利用率,但在處理大文件時(shí)可能會(huì)增加磁盤(pán)開(kāi)銷(xiāo)。較大的塊大小可以提高順序讀寫(xiě)的性能,但可能會(huì)導(dǎo)致對(duì)小文件的空間浪費(fèi)。
使用這些信息可以計(jì)算stride和stride-width的值
stride是一個(gè)chunk中包含多少個(gè)文件系統(tǒng)block。比如對(duì)于64KiB的chunk磁盤(pán)陣列,如果文件系統(tǒng)block大小為4KiB,則stride=16。
strip-width是一個(gè)條帶中包含多少文件系統(tǒng)block。
?
比如一個(gè)6塊硬盤(pán)組成的RAID6,在RAID6中每個(gè)條帶包含2個(gè)校驗(yàn)盤(pán),所以就有6-2=4塊數(shù)據(jù)盤(pán),一個(gè)條帶有4個(gè)數(shù)據(jù)盤(pán)。這一個(gè)條帶包含多少個(gè)文件系統(tǒng)block呢? 4(disk)* 16(stride) = 64 file system blocks per stripe。 4個(gè)硬盤(pán)代表4個(gè)chunk,每個(gè)chunk可以包含16個(gè)block,所以一個(gè)條帶包含64個(gè)文件系統(tǒng)塊。
?
?
?
# mkfs -t ext4 -E stride=16,stripe-width=64 /dev/san/lun1
?
?
?
通過(guò)邏輯卷配置RAID
RHEL8支持創(chuàng)建RAID級(jí)別的邏輯卷,目前支持RAID0,1,4,5,6, and 10
創(chuàng)建一個(gè)3G容量的RAID0級(jí)別邏輯卷,
--stripes 3: 這指定了要使用的條帶數(shù)(即磁盤(pán)數(shù)量)為3。在RAID 0中,這意味著數(shù)據(jù)將被分割成3部分并分別存儲(chǔ)在3個(gè)磁盤(pán)上。
--stripesize 4K: 這指定了每個(gè)條帶的大小為4KB。這意味著每個(gè)磁盤(pán)上將存儲(chǔ)4KB的數(shù)據(jù)塊。
?
?
?
[root@localhost ~]# lvcreate --type raid0 -L 3G --stripes 3 --stripesize 4K -n raidlv radivg
?
?
?
選擇IO分析工具
最簡(jiǎn)單的工具是使用top命令觀察wa值
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$top top - 10:52:58 up 10:41, 2 users, load average: 0.00, 0.00, 0.00 Tasks: 231 total, 1 running, 230 sleeping, 0 stopped, 0 zombie %Cpu0 : 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st %Cpu1 : 0.0 us, 25.0 sy, 0.0 ni, 75.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 15694.3 total, 14350.9 free, 910.1 used, 730.8 buff/cache MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 14784.3 avail Mem
?
?
?
iostat
使用iostat命令輸出了設(shè)備I/O統(tǒng)計(jì)信息
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$yum -y install sysstat
┌──[root@liruilongs.github.io]-[~] └─$ iostat -Np Linux 5.14.0-362.8.1.el9_3.x86_64 (liruilongs.github.io) 02/05/24 _x86_64_ (2 CPU) avg-cpu: %user %nice %system %iowait %steal %idle 0.14 0.01 0.22 0.01 0.00 99.63 Device tps kB_read/s kB_wrtn/s kB_dscd/s kB_read kB_wrtn kB_dscd nvme0n1 14.28 13.25 67.45 0.00 511266 2602804 0 nvme0n1p1 0.02 1.51 0.06 0.00 58182 2130 0 nvme0n1p2 14.26 11.71 67.39 0.00 451888 2600674 0 sr0 0.00 0.08 0.00 0.00 2936 0 0 rl-root 14.36 11.17 67.39 0.00 431044 2600674 0 rl-swap 0.00 0.06 0.00 0.00 2220 0 0 ┌──[root@liruilongs.github.io]-[~] └─$
?
?
?
iotop
iotop 監(jiān)控Linux系統(tǒng)中的磁盤(pán)I/O使用狀況,實(shí)時(shí)顯示系統(tǒng)中各個(gè)進(jìn)程對(duì)I/O的使用情況。
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$yum -y install iotop
Total DISK READ : 0.00 B/s | Total DISK WRITE : 0.00 B/s Actual DISK READ: 0.00 B/s | Actual DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE> COMMAND 1 be/4 root 0.00 B/s 0.00 B/s systemd --switched-root --system --deserialize 31 2 be/4 root 0.00 B/s 0.00 B/s [kthreadd] 3 be/0 root 0.00 B/s 0.00 B/s [rcu_gp] 4 be/0 root 0.00 B/s 0.00 B/s [rcu_par_gp] 5 be/0 root 0.00 B/s 0.00 B/s [slub_flushwq] 6 be/0 root 0.00 B/s 0.00 B/s [netns] 8 be/0 root 0.00 B/s 0.00 B/s [kworker/0:0H-events_highpri] ...................................
?
?
?
-o(--only)僅顯示當(dāng)前執(zhí)行I/O操作的進(jìn)程和線程信息
-P(--processes)顯示進(jìn)程信息
-a顯示啟動(dòng)iotop命令開(kāi)始的總的I/O數(shù)據(jù)信息
Blktrace
Blktrace是一個(gè)針對(duì)Linux內(nèi)核中Block IO的跟蹤工具,它能夠記錄I/O所經(jīng)歷的各個(gè)步驟,并從中分析是IO Scheduler慢還是硬件響應(yīng)慢。這個(gè)工具可以在運(yùn)行時(shí)捕獲和記錄塊設(shè)備上的I/O操作,并提供詳細(xì)的I/O請(qǐng)求隊(duì)列信息,包括讀寫(xiě)進(jìn)程名、進(jìn)程號(hào)、執(zhí)行時(shí)間、讀寫(xiě)物理塊號(hào)、塊大小等。
?
?
?
yum -y install blktrace
?
?
?
開(kāi)始采集
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$ blktrace -d /dev/mapper/rl-root -o disk.log User defined signal 1
?
?
?
結(jié)束
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$killall -SIGUSR1 blktrace
?
?
?
模擬測(cè)試
?
?
?
┌──[root@liruilongs.github.io]-[~] └─$fio --name=randwrite --ioengine=libaio --iodepth=1 --rw=randwrite --bs=4K --direct=1 --size=512M --numjobs=5 --group_reporting --filename=/tmp/testfile randwrite: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=1
┌──[root@liruilongs.github.io]-[~] └─$btt -i disk.log.blktrace.0 ==================== All Devices ==================== ALL MIN AVG MAX N --------------- ------------- ------------- ------------- ----------- Q2Qdm 0.000001070 0.000257360 17.654174647 655292 Q2Cdm 0.000054524 0.000268875 0.089907542 655281 ==================== Device Overhead ==================== DEV | Q2G G2I Q2M I2D D2C ---------- | --------- --------- --------- --------- --------- ==================== Device Merge Information ==================== DEV | #Q #D Ratio | BLKmin BLKavg BLKmax Total ---------- | -------- -------- ------- | -------- -------- -------- -------- ==================== Device Q2Q Seek Information ==================== DEV | NSEEKS MEAN MEDIAN | MODE ---------- | --------------- --------------- --------------- | --------------- (253, 0) | 655293 362399.7 0 | 0(1798) ---------- | --------------- --------------- --------------- | --------------- Overall | NSEEKS MEAN MEDIAN | MODE Average | 655293 362399.7 0 | 0(1798) ......................................
?
?
?
pcp-system-tools
pcp-system-tools是一個(gè)用于監(jiān)控系統(tǒng)性能的工具包,它提供了多種用于監(jiān)控系統(tǒng)資源使用情況的工具。這個(gè)工具包與pcp(Performance Co-Pilot)框架一起使用,可以提供全面的系統(tǒng)性能監(jiān)控解決方案。
在這里插入圖片描述
atop提供了對(duì)系統(tǒng)資源使用情況的全面視圖,包括CPU、內(nèi)存、磁盤(pán)I/O、網(wǎng)絡(luò)等。它還提供了各種性能指標(biāo)的實(shí)時(shí)和歷史數(shù)據(jù),以及對(duì)系統(tǒng)進(jìn)程和資源的詳細(xì)信息。
?
?
?
ATOP - liruilongs 2024/02/05 11:17:45 ----------------- 11h6m20s elapsedPRC | sys 0.04s | user 0.01s | #proc 243 | #trun 1 | #tslpi 142 | #tslpu 100 | #zombie 0 | clones 1 | | #exit 0 |CPU | sys 0% | user 0% | irq 0% | | idle 199% | wait 0% | steal 0% | guest 0% | | curf 2.42GHz |cpu | sys 0% | user 0% | irq 0% | | idle 99% | cpu001 w 0% | steal 0% | guest 0% | | | cpu | sys 0% | user 0% | irq 0% | | idle 100% | cpu000 w 0% | steal 0% | guest 0% | | | CPL | numcpu 2 | | avg1 0.19 | | avg5 0.35 | avg15 0.19 | | csw 2498 | | intr 1299 |MEM | tot 15.3G | free 13.8G | cache 838.3M | dirty 0.0M | buff 1.7M | slab 171.2M | slrec 87.1M | | pgtab 1.7M | |MEM | numnode 1 | | shmem 15.2M | shrss 0.0M | shswp 0.0M | tcpsk 0.0M | udpsk 0.0M | | | zfarc 0.0M |SWP | tot 2.0G | free 2.0G | swcac 0.0M | zpool 0.0M | zstor 0.0M | ksuse 0.0M | kssav 0.0M | | vmcom 3.5G | vmlim 9.7G |PAG | scan 0 | steal 0 | compact 0 | numamig 0 | migrate 0 | pgin 0 | pgout 64 | swin 0 | swout 0 | oomkill 0 |LVM | rl-root | busy 0% | read 0 | write 5 | discrd 0 | KiB/r 0 | KiB/w 12 | MBr/s 0.0 | MBw/s 0.0 | avio 0.0 ns | DSK | nvme0n1 | busy 0% | read 0 | write 5 | discrd 0 | KiB/r 0 | KiB/w 12 | MBr/s 0.0 | MBw/s 0.0 | avio 0.80 ms | NET | transport | tcpi 2 | tcpo 6 | udpi 0 | udpo 0 | tcpao 0 | tcppo 0 | tcprs 0 | tcpie 0 | udpie 0 |NET | network | ipi 2 | ipo 4 | ipfrw 0 | deliv 2 | | | | icmpi 0 | icmpo 0 |NET | ens160 0% | pcki 2 | pcko 6 | sp 10 Gbps | si 0 Kbps | so 0 Kbps | erri 0 | erro 0 | drpi 0 | drpo 0 | PID SYSCPU USRCPU RDELAY BDELAY VGROW RGROW RDDSK WRDSK RUID EUID ST EXC THR S CPUNR CPU CMD 1/1 21939 0.02s 0.01s 0.00s 0.00s 416.0K 348.0K 0B 0B root root -- - 1 R 1 0% pmdaproc 21987 0.01s 0.00s 0.00s 0.00s 2.5M 2.4M 0B 0B root root -- - 1 S 1 0% pcp-atop 21100 0.01s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 1 0% kworker/1:2-ev 850 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 0 0% /usr/sbin/http 862 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 1 0% php-fpm 21065 0.00s 0.00s 0.01s 0.00s 0B 0B 0B 0B root root -- - 3 S 0 0% blktrace 1 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 1 0% systemd 21934 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B pcp pcp -- - 1 S 0 0% pmcd 21941 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 1 0% pmdalinux 21094 0.00s 0.00s 0.00s 0.00s 0B 712.0K 0B 0B liruilon liruilon -- - 1 S 0 0% sshd 801 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 2 S 0 0% irqbalance 1929 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 1 0% kworker/u256:0 16 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 0 0% pr/tty0 17 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 1 0% rcu_preempt 20419 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 0 0% kworker/0:2-ev 500 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 0 0% scsi_eh_21 25 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 1 0% ksoftirqd/1 37 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 S 1 0% kcompactd0 56 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 0 0% kthrotld 98 0.00s 0.00s 0.00s 0.00s 0B 0B 0B 0B root root -- - 1 I 1 0% kworker/1:1H-k 649 0.00s 0.00s 0.01s 0.00s 0B 0B 0B 0B root root -- - 1 S 0 0% xfsaild/dm-0 21803 0.00s 0.00s 0.00s 0.00s 0B 0B 0B
?
?
?
審核編輯:黃飛
評(píng)論