0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何快速分析定位 I/O 性能問題

科技綠洲 ? 來源:Linux開發(fā)架構(gòu)之路 ? 作者:Linux開發(fā)架構(gòu)之路 ? 2023-11-13 14:15 ? 次閱讀

如何快速分析定位 I/O 性能問題

1. 文件系統(tǒng) I/O性能指標(biāo)

首先,想到是存儲空間的使用情況,包括容量、使用量、以及剩余空間等。我們通常也稱這些為磁盤空間的用量,但是這只是文件系統(tǒng)向外展示的空間使用,而非在磁盤空間的真實用量,因為文件系統(tǒng)的元數(shù)據(jù)也會占用磁盤空間。而且,如果你配置了RAID,從文件系統(tǒng)看到的使用量跟實際磁盤的占用空間,也會因為RAID級別不同而不一樣。

除了數(shù)據(jù)本身的存儲空間,還有一個容易忽略的是索引節(jié)點的使用情況,包括容量、使用量、剩余量。如果文件系統(tǒng)小文件數(shù)過多,可能會碰到索引節(jié)點容量已滿的問題。

其次,緩存使用情況,包括頁緩存、索引節(jié)點緩存、目錄項緩存以及各個具體文件系統(tǒng)的緩存。通過使用內(nèi)存,來臨時緩存文件數(shù)據(jù)或者文件系統(tǒng)元數(shù)據(jù),從而減少磁盤訪問次數(shù)。·

最后,文件 I/O的性能指標(biāo),包括IOPS(r/s、w/s)、響應(yīng)時間(延遲)、吞吐量(B/s)等??疾爝@類指標(biāo)時,還要結(jié)合實際文件讀寫情況,文件大小、數(shù)量、I/O類型等,綜合分析文件 I/O 的性能。

2. 磁盤 I/O性能指標(biāo)

磁盤 I/O的性能指標(biāo),主要由四個核心指標(biāo):使用率、IOPS、響應(yīng)時間、吞吐量,還有一個前面提到過,緩沖區(qū)。

考察這些指標(biāo)時,一定要注意綜合 I/O的具體場景來分析,比如讀寫類型(順序讀寫還是隨機讀寫)、讀寫比例、讀寫大小、存儲類型(有無RAID、RAID級別、本地存儲還是網(wǎng)絡(luò)存儲)等。

不過考察這些指標(biāo)時,有一個大忌,就是把不同場景的 I/O指標(biāo)拿過來作對比。

圖片

3. 性能工具

一類:df、top、iostat、pidstat;

二類:/proc/meminfo、/proc/slabinfo、slabtop;

三類:strace、lsof、filetop、opensnoop

4. 性能指標(biāo)及性能工具之間的關(guān)系

圖片

5. 如何迅速分析 I/O性能瓶頸

簡單來說,就是找關(guān)聯(lián)。多種性能指標(biāo)間,都是存在一定的關(guān)聯(lián)性。想弄清楚指標(biāo)之間的關(guān)聯(lián)性,就要知曉各種指標(biāo)的工作原理。出現(xiàn)性能問題,基本的分析思路是:

先用 iostat發(fā)現(xiàn)磁盤 I/O的性能瓶頸;

再借助 pidstat,定位導(dǎo)致性能瓶頸的進程;

隨后分析進程 I/O的行為;

最后,結(jié)合應(yīng)用程序的原理,分析這些 I/O的來源。

圖片

圖中列出最常用的幾個文件系統(tǒng)和磁盤 I/O的性能分析工具,及相應(yīng)的分析流程。

磁盤 I/O性能優(yōu)化的幾個思路

1. I/O基準(zhǔn)測試

在優(yōu)化之前,我們要清楚 I/O性能優(yōu)化的目標(biāo)是什么?也就是說,我們觀察的這些 I/O指標(biāo)(IOPS、吞吐量、響應(yīng)時間等),要達到多少才合適?為了更客觀合理地評估優(yōu)化效果,首先應(yīng)該對磁盤和文件系統(tǒng)進行基準(zhǔn)測試,得到它們的極限性能。

fio(Flexible I/O Tester),它是常用的文件系統(tǒng)和磁盤 I/O的性能基準(zhǔn)測試工具。它提供了大量的可定制化的選項,可以用來測試,裸盤或者文件系統(tǒng)在各種場景下的 I/O性能,包括不同塊大小、不同 I/O引擎以及是否使用緩存等場景。

fio的選項非常多,這里介紹幾個常用的:

# 隨機讀
fio -name=randread -direct=1 -iodepth=64 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 隨機寫
fio -name=randwrite -direct=1 -iodepth=64 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 順序讀
fio -name=read -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb
# 順序?qū)?/span>
fio -name=write -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/sdb

重點解釋幾個參數(shù)

  • direct,是否跳過系統(tǒng)緩存,iodepth1 是跳過。
  • iodepth,使用異步 I/O(AIO)時,同時發(fā)出的請求上限。
  • rw,I/O模式,順序讀 / 寫、隨機讀 / 寫。
  • ioengine,I/O引擎,支持同步(sync)、異步(libaio)、內(nèi)存映射(mmap)、網(wǎng)絡(luò)等各種 I/O引擎。
  • bs,I/O大小。 4k,默認值。
  • filename,文件路徑,可以是磁盤路徑,也可以是文件路徑。不過要注意,用磁盤路徑測試寫,會破壞這個磁盤的文件系統(tǒng),所以測試前,要注意備份。

下面展示, fio測試順序讀的示例:

read: (g=0): rw=read, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.1
Starting 1 process
Jobs: 1 (f=1): [R(1)][100.0%][r=16.7MiB/s,w=0KiB/s][r=4280,w=0 IOPS][eta 00m:00s]
read: (groupid=0, jobs=1): err= 0: pid=17966: Sun Dec 30 08:31:48 2018
   read: IOPS=4257, BW=16.6MiB/s (17.4MB/s)(1024MiB/61568msec)
    slat (usec): min=2, max=2566, avg= 4.29, stdev=21.76
    clat (usec): min=228, max=407360, avg=15024.30, stdev=20524.39
     lat (usec): min=243, max=407363, avg=15029.12, stdev=20524.26
    clat percentiles (usec):
     |  1.00th=[   498],  5.00th=[  1020], 10.00th=[  1319], 20.00th=[  1713],
     | 30.00th=[  1991], 40.00th=[  2212], 50.00th=[  2540], 60.00th=[  2933],
     | 70.00th=[  5407], 80.00th=[ 44303], 90.00th=[ 45351], 95.00th=[ 45876],
     | 99.00th=[ 46924], 99.50th=[ 46924], 99.90th=[ 48497], 99.95th=[ 49021],
     | 99.99th=[404751]
   bw (  KiB/s): min= 8208, max=18832, per=99.85%, avg=17005.35, stdev=998.94, samples=123
   iops        : min= 2052, max= 4708, avg=4251.30, stdev=249.74, samples=123
  lat (usec)   : 250=0.01%, 500=1.03%, 750=1.69%, 1000=2.07%
  lat (msec)   : 2=25.64%, 4=37.58%, 10=2.08%, 20=0.02%, 50=29.86%
  lat (msec)   : 100=0.01%, 500=0.02%
  cpu          : usr=1.02%, sys=2.97%, ctx=33312, majf=0, minf=75
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%,  >=64=100.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.1%,  >=64=0.0%
     issued rwt: total=262144,0,0, short=0,0,0, dropped=0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=16.6MiB/s (17.4MB/s), 16.6MiB/s-16.6MiB/s (17.4MB/s-17.4MB/s), io=1024MiB (1074MB), run=61568-61568msec

Disk stats (read/write):
  sdb: ios=261897/0, merge=0/0, ticks=3912108/0, in_queue=3474336, util=90.09%

這個示例中,重點關(guān)注幾行,slat、clat、lat,以及 bw和 iops。前三者,都是指 I/O延遲,但是有不同之處:

slat,是指從 I/O提交到實際執(zhí)行 I/O的時長;

clat,是指從 I/O提交到 I/O完成的時長;

lat,是指從 fio創(chuàng)建 I/O 到 I/O完成的時長。

這里需要注意的是,對同步 I/O來說,提交和完成是一個動作,slat就是 I/O完成的時間,clat是0;使用異步 I/O時,lat 約等于 slat + clat。

再來看bw,他表示吞吐量,上面的輸出中,平均吞吐量是16MB(17005/1024)。

最后的IOPS,其實是每秒 I/O的次數(shù),上面輸出的平均 IOPS是 4250.

通常情況下,應(yīng)用程序的IO 讀寫是并行的,每次的 I/O大小也不相同。所以上面的幾個場景并不能精確模擬應(yīng)用程序的 I/O模式。幸運的是,fio支持 I/O 的重放,需要先用 blktrace,記錄磁盤設(shè)備的 I/O訪問情況,再使用 fio,重放 blktrace的記錄。

# 使用blktrace跟蹤磁盤I/O,注意指定應(yīng)用程序正在操作的磁盤
$ blktrace /dev/sdb
# 查看blktrace記錄的結(jié)果
# ls
sdb.blktrace.0  sdb.blktrace.1
# 將結(jié)果轉(zhuǎn)化為二進制文件
$ blkparse sdb -d sdb.bin
# 使用fio重放日志
$ fio --name=replay --filename=/dev/sdb --direct=1 --read_iolog=sdb.bin

2. I/O性能優(yōu)化思路

應(yīng)用程序優(yōu)化

應(yīng)用程序處于 I/O棧的最上端,可以通過系統(tǒng)調(diào)用,來調(diào)整 I/O模式(順序還是隨機、同步還是異步),同時也是數(shù)據(jù)的最終來源。下面總結(jié)了幾個方面來優(yōu)化應(yīng)用程序性能:

第一,可以用追加寫代替隨機寫,減少尋址開銷,加快 I/O寫的速度。

第二,借助緩存 I/O,充分利用系統(tǒng)緩存,降低實際 I/O的次數(shù)。

第三,在應(yīng)用程序內(nèi)部構(gòu)建自己緩存,或者使用Redis這種的外部緩存系統(tǒng)。這樣不僅可以在內(nèi)部控制緩存的數(shù)據(jù)和生命周期,而且降低其他應(yīng)用程序使用緩存對自身的影響。比如,C標(biāo)準(zhǔn)庫,提供的fopen、fread等庫函數(shù),都會利用標(biāo)準(zhǔn)庫緩存,減少磁盤的操作。而如果直接使用open、read等系統(tǒng)調(diào)用時,就只能利用操作系統(tǒng)的頁緩存和緩沖區(qū)等。

第四,在需要頻繁讀寫同一塊磁盤空間時,可以使用 mmap 代替 read/write,減少內(nèi)存的拷貝次數(shù)。

第五,在需要同步寫的場景中,盡量將寫請求合并,而不是讓每個請求都同步寫磁盤,即可用fsync() 代替 O_SYNC。

第六,在多個應(yīng)用程序共享相同磁盤時,為了保證 I/O不被某個應(yīng)用完全占用,推薦使用 cgroups 的 I/O子系統(tǒng),來限制進程/進程組的 IOPS 以及吞吐量。

最后,在使用CFQ 調(diào)度器時,可以用 ionice來調(diào)整進程的 I/O調(diào)度優(yōu)先級,特別是提高核心應(yīng)用的 I/O優(yōu)先級,他支持三個優(yōu)先級類:Idle、Best-effort 和 Realtime。其中,后兩者還支持 0-7的級別,數(shù)值越小,優(yōu)先級越高。

文件系統(tǒng)優(yōu)化

應(yīng)用程序在訪問普通文件時,是通過文件系統(tǒng)間接負責(zé),文件在磁盤中的讀寫。所以跟文件系統(tǒng)相關(guān)的也有很多優(yōu)化方式。

第一,可以根據(jù)實際負載場景的不同,選擇合適的文件系統(tǒng)。比如,Ubuntu默認使用ext4,Centos默認使用 xfs。相比于ext4,xfs支持更大的磁盤分區(qū)和更大的文件數(shù)量。xfs支持大于 16TB的磁盤,但它的缺點在于無法收縮,而ext4可以。

第二,在選好文件系統(tǒng)后,可以優(yōu)化文件系統(tǒng)得配置選項。包括文件系統(tǒng)的特性(如 ext_attr、dir_index)、日志模式(如 journal、ordered、writeback等)、掛載選項(如 noatime)等等。比如在使用 tune2fs這個工具,可以調(diào)整文件系統(tǒng)的特性,也常用來查看文件系統(tǒng)超級塊的內(nèi)容。而通過 /etc/fstab,或者mount,來調(diào)整文件系統(tǒng)的日志模式和掛載選項等。

第三,優(yōu)化文件系統(tǒng)的緩存。比如,可以優(yōu)化 pdflush的臟頁刷新頻率(設(shè)置dirty_expire_centisecs 和 dirty_writeback_centisecs)以及臟頁限額(調(diào)整 dirty_background_ratio 和 dirty_ratio)。再如,還可以優(yōu)化內(nèi)核回收目錄項緩存和索引節(jié)點緩存的傾向,及調(diào)整 vfs_cache_pressure(
/proc/sys/vm/vfs_cache_pressure,默認值100),數(shù)值越大,表示越容易回收。

最后,在不需要持久化時,可以用內(nèi)存文件系統(tǒng) tmpfs 以獲得更好的 I/O性能。tmpfs直接把數(shù)據(jù)保存在內(nèi)存中,而不是磁盤中。比如 /dev/shm,就是大多數(shù)Linux默認配置的一個內(nèi)存文件系統(tǒng),它的大小默認為系統(tǒng)總內(nèi)存的一半。

磁盤優(yōu)化

數(shù)據(jù)的持久化,最終要落到物理磁盤上,同時磁盤也是整個 I/O棧的最底層。從磁盤角度出發(fā),也有很多優(yōu)化方法:

第一,最簡單的就是SSD代替 HDD。

第二,使用 RAID把多塊磁盤組合成一個邏輯磁盤,構(gòu)成冗余獨立的磁盤陣列,即可以提高數(shù)據(jù)的可靠性,也可以提升數(shù)據(jù)的訪問性能。

第三,針對磁盤和應(yīng)用程序的 I/O模式的特征,可選擇最適合的 I/O調(diào)度算法。

第四,可以針對應(yīng)用程序的數(shù)據(jù),進行磁盤級別的隔離。比如,可以為日志、數(shù)據(jù)庫等 I/O壓力比較重的應(yīng)用,配置單獨的磁盤。

第五,在順序讀比較多的場景中,可以增大磁盤的預(yù)讀數(shù)據(jù),可以通過兩種方法,調(diào)整 /dev/sdb的預(yù)讀大小。一種,調(diào)整內(nèi)核選項,
/sys/block/sdb/queue/read_ahead_kb,默認大小128KB。另一種,blockdev工具,比如,blockdev --setra 8192 /dev/sdb ,注意這里的單位是 512B,所以它的數(shù)值總是 read_ahead_kb的兩倍。

第六,優(yōu)化內(nèi)核塊設(shè)備 I/O的選項。比如,調(diào)整磁盤隊列的長度,
/sys/block/sdb/queue/nr_requests,適當(dāng)增大隊列長度,可以增大磁盤的吞吐量,當(dāng)然也會增大 I/O延遲。

最后,磁盤本身的硬件錯誤,也會導(dǎo)致 I/O性能急劇下降。比如,查看 dmesg中是否有硬件 I/O故障的日志,還可以使用badblocks、smartctl等工具,檢測磁盤的硬件問題,或用 e2fsck等來檢測文件系統(tǒng)錯誤。如果發(fā)現(xiàn)問題,可使用fsck 等工具修復(fù)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    229

    瀏覽量

    26635
  • 磁盤
    +關(guān)注

    關(guān)注

    1

    文章

    361

    瀏覽量

    25154
  • 存儲空間
    +關(guān)注

    關(guān)注

    0

    文章

    54

    瀏覽量

    10663
  • i/o
    i/o
    +關(guān)注

    關(guān)注

    0

    文章

    33

    瀏覽量

    4562
收藏 人收藏

    評論

    相關(guān)推薦

    UBIFS損耗均衡對系統(tǒng)I/O性能的影響

    分析flash 文件系統(tǒng)的損耗均衡問題,指出損耗均衡的觸發(fā)條件對系統(tǒng)I/O 性能的影響。在最新UBIFS 文件系統(tǒng)上運行測試程序,結(jié)果證明在不同損耗均衡觸發(fā)條件下,系統(tǒng)
    發(fā)表于 03-30 10:10 ?24次下載

    Linux系統(tǒng)中網(wǎng)絡(luò)I/O性能改進方法的研究

    選擇并設(shè)計高效的網(wǎng)絡(luò)I/O模型是改善服務(wù)器性能的關(guān)鍵。該文通過對Linux系統(tǒng)中幾種網(wǎng)絡(luò)I/O模型的分析
    發(fā)表于 04-09 09:41 ?28次下載

    一種高效的磁盤隊列I/O機制

    分析了傳統(tǒng)磁盤隊列的存儲管理開銷和讀寫性能,針對磁盤隊列I/O已成為影響消息服務(wù)器性能的首要瓶頸,提出了一種高效磁盤隊列
    發(fā)表于 05-14 19:51 ?32次下載

    基于Intel I/O處理器的虛擬磁帶庫設(shè)計

    本文介紹了一種基于Intel 公司高性能I/O 處理器的虛擬磁帶庫系統(tǒng)設(shè)計方法。在分析了虛擬磁帶庫功能架構(gòu)的基礎(chǔ)上,結(jié)合Intel 公司I/
    發(fā)表于 08-29 08:17 ?11次下載

    數(shù)字I/O介紹

    數(shù)字I/O腳有專用和復(fù)用。數(shù)字I/O腳的功能通過9個16位控制寄存器來控制??刂萍拇嫫鞣譃閮深悾海?)I/
    發(fā)表于 09-16 12:20 ?19次下載

    播出服務(wù)器磁盤I/O與緩存性能分析

    播出服務(wù)器磁盤I/O與緩存性能分析:針對電視臺專業(yè)播出服務(wù)器在播出質(zhì)量和播出性能上的高要求,提出了(s,S)策略下讀數(shù)據(jù)緩存和復(fù)用緩存與節(jié)目
    發(fā)表于 01-16 15:09 ?22次下載

    什么是I/O地址

    什么是I/O地址 I/O地址中I是input的簡寫,O是output的簡寫,也就是輸入輸出地址
    發(fā)表于 02-05 10:01 ?1341次閱讀

    I2C I/O擴展芯片特性分析

    簡介   I/O口擴展芯片可用于MCU/DSP通用I/O口的擴展,通過I2C擴展成8或16位GPIO。當(dāng)應(yīng)用
    發(fā)表于 07-20 09:54 ?1.3w次閱讀

    XAPP520將符合2.5V和3.3V I/O標(biāo)準(zhǔn)的7系列FPGA高性能I/O Bank進行連接

    XAPP520將符合2.5V和3.3V I/O標(biāo)準(zhǔn)的7系列FPGA高性能I/O Bank進行連接 The
    發(fā)表于 01-26 18:47 ?75次下載

    Java I/O 的相關(guān)方法分析

    I/O,即 Input/Output(輸入/輸出) 的簡稱。就 I/O 而言,概念上有 5 種模型:blocking I/
    發(fā)表于 09-27 13:18 ?0次下載
    Java <b class='flag-5'>I</b>/<b class='flag-5'>O</b> 的相關(guān)方法<b class='flag-5'>分析</b>

    基于FPGA I/O接口的五大優(yōu)勢與FPGA深層分析

    NI VeriStand是一款用于配置實時測試系統(tǒng)應(yīng)用的軟件環(huán)境,如硬件在環(huán)(HIL)測試系統(tǒng)等。當(dāng)向NI VeriStand添加實時I/O接口時,用戶能夠快速配置多種標(biāo)準(zhǔn)模擬、數(shù)字和通信總線接口
    發(fā)表于 11-18 07:47 ?9459次閱讀
    基于FPGA <b class='flag-5'>I</b>/<b class='flag-5'>O</b>接口的五大優(yōu)勢與FPGA深層<b class='flag-5'>分析</b>

    介紹 I/O NI系統(tǒng),C系列的I/O模塊

    內(nèi)容包括:理想的確定性以太網(wǎng)I/O,具有確定性分布式I/O的NI系統(tǒng),C系列的I/O模塊,與La
    的頭像 發(fā)表于 06-14 06:19 ?4548次閱讀
    介紹 <b class='flag-5'>I</b>/<b class='flag-5'>O</b> NI系統(tǒng),C系列的<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模塊

    過程控制模擬I/O模塊的性能規(guī)格和技術(shù)趨勢分析

    本研討會從系統(tǒng)角度概要介紹工業(yè)控制應(yīng)用中采用的過程控制模擬I/O模塊。我們的系統(tǒng)專家將為模塊設(shè)計人員分析關(guān)鍵性能規(guī)格和技術(shù)趨勢,包括數(shù)據(jù)轉(zhuǎn)換要求,并探討這些因素對模塊架構(gòu)的選擇有何影響
    的頭像 發(fā)表于 06-12 06:14 ?2900次閱讀
    過程控制模擬<b class='flag-5'>I</b>/<b class='flag-5'>O</b>模塊的<b class='flag-5'>性能</b>規(guī)格和技術(shù)趨勢<b class='flag-5'>分析</b>

    Android異常日志快速定位分析小技巧

    Android異常日志快速定位分析小技巧
    的頭像 發(fā)表于 08-09 10:06 ?2624次閱讀
    Android異常日志<b class='flag-5'>快速</b><b class='flag-5'>定位</b><b class='flag-5'>分析</b>小技巧

    RA2快速設(shè)計指南 [6] 寄存器寫保護和I/O端口配置

    RA2快速設(shè)計指南 [6] 寄存器寫保護和I/O端口配置
    的頭像 發(fā)表于 10-24 16:48 ?573次閱讀
    RA2<b class='flag-5'>快速</b>設(shè)計指南 [6] 寄存器寫保護和<b class='flag-5'>I</b>/<b class='flag-5'>O</b>端口配置