性能分析之從 IO 高定位到具體文件

      網(wǎng)友投稿 740 2025-03-31

      性能分析之從 IO 高定位到具體文件

      概述

      核心原理

      一個(gè)實(shí)驗(yàn)

      總結(jié)

      概述

      核心原理

      一個(gè)實(shí)驗(yàn)

      總結(jié)

      概述

      IO 的性能分析一直是性能分析的重點(diǎn)之一,分析的思路是:

      在代碼的邏輯清晰的情況下,是完全可以知道哪些文件是頻繁讀寫(xiě)的。但是對(duì)性能分析人員來(lái)說(shuō),通常是面對(duì)一個(gè)不是自己編寫(xiě)的系統(tǒng),有時(shí)還是多個(gè)團(tuán)隊(duì)合作產(chǎn)生的系統(tǒng)。這時(shí)就會(huì)出現(xiàn)很多的推諉和爭(zhēng)執(zhí)。如果可以迅速地把問(wèn)題到一個(gè)段具體的代碼,到一個(gè)具體的文件,那就可以提高溝通的效率。

      通常情況在 linux 環(huán)境下,通過(guò) vmstat 或者 iostat 命令可以發(fā)現(xiàn)磁盤(pán) IO 的異常,可以看到系統(tǒng)級(jí)的磁盤(pán)讀寫(xiě)量及 CPU 占用率,但無(wú)法明確定位到是什么進(jìn)程在作祟,安裝 iotop 后,可以定位到進(jìn)程,但并不知道改進(jìn)程在操作什么文件。

      核心原理

      本文是考慮從系統(tǒng)級(jí)的工具來(lái)完成這個(gè)操作,比較具有通用性。在這之前需要先理解一下文件的一個(gè)重要的屬性:inode。

      什么是 inode 呢?先來(lái)看一個(gè)示意圖:

      磁盤(pán)上最小的存儲(chǔ)單元是扇區(qū) sector,每8個(gè)扇區(qū)組成一個(gè)塊 block(4096字節(jié))。如下所示:

      [root@7DGroup2 ~]# tune2fs -l /dev/vda1|grep Block Block count: 10485504 Block size: 4096 Blocks per group: 32768 [root@7DGroup2 ~]#

      文件的存儲(chǔ)就是由這些 塊組成的,當(dāng)塊多了之后就成了如下這樣(其實(shí)磁盤(pán)上的塊比這個(gè)圖中多得多,這里只是示意圖):

      其中紅色的這部分是存儲(chǔ)的文件,我們通常在文件系統(tǒng)中直接ls或者用其他命令操作文件的時(shí)候是根據(jù)路徑來(lái)操作的,那些是上層的命令。當(dāng)我們執(zhí)行了一個(gè)命令之后,操作系統(tǒng)會(huì)來(lái)找到這些文件做相應(yīng)的操作,怎么找到這些文件呢,那就需要 inode 了。Inode 用來(lái)存儲(chǔ)這些文件的元信息,也就是索引節(jié)點(diǎn),它包括的信息有:

      字節(jié)數(shù)

      User ID

      Group ID

      讀、寫(xiě)、執(zhí)行權(quán)限

      時(shí)間戳,共有三個(gè):ctime 指 inode 上一次變動(dòng)的時(shí)間,mtime 指文件內(nèi)容上一次變動(dòng)的時(shí)間,atime 指文件上一次打開(kāi)的時(shí)間

      鏈接數(shù),有多少文件名指向這個(gè) inode

      文件數(shù)據(jù) block 的位置

      通過(guò)這些信息,我們才能實(shí)現(xiàn)對(duì)文件的操作。這個(gè) inode 其實(shí)也是存儲(chǔ)在磁盤(pán)上的,也需要占用一些空間,如上圖中的綠色部分所示。

      當(dāng)我們?cè)谙到y(tǒng)級(jí)看到 IO 過(guò)高的時(shí)候,比如下圖所示:

      從上圖可以看到,這系統(tǒng)幾乎所有的 CPU 都在等 IO。這時(shí)怎么辦?就用我們前面提到的分析的思路,查看進(jìn)程級(jí)和線(xiàn)程級(jí)的 IO,進(jìn)而找到具體的文件。下面我們來(lái)具體實(shí)現(xiàn)。

      這里我們用的是 systemtap,這個(gè)工具 7Dgroup 之前的文章中提到的,但沒(méi)有展開(kāi)說(shuō)。后面如果有可能我們?cè)俣鄬?xiě)些類(lèi)似的工具原理和使用方法。

      Systemtap 的邏輯圖如下:

      從邏輯圖上看,它工作在內(nèi)核層面,不是 shell 的層面。

      SystemTap 為我們開(kāi)啟了一扇通往系統(tǒng)內(nèi)核的大門(mén),SystemTap 自帶的 examples 中提供一些磁盤(pán) IO 相關(guān)的監(jiān)控例子。

      以 iotop.stp 為例,源碼如下:

      #!/usr/bin/stap global reads, writes, total_io probe vfs.read.return { reads[execname()] += bytes_read } probe vfs.write.return { writes[execname()] += bytes_written } # print top 10 IO processes every 5 seconds probe timer.s(5) { foreach (name in writes) total_io[name] += writes[name] foreach (name in reads) total_io[name] += reads[name] printf ("%16s\t%10s\t%10s\n", "Process", "KB Read", "KB Written") foreach (name in total_io- limit 10) printf("%16s\t%10d\t%10d\n", name, reads[name]/1024, writes[name]/1024) delete reads delete writes delete total_io print("\n") }

      執(zhí)行的結(jié)果是:每隔 5 秒打印讀寫(xiě)總量排前 10 位的進(jìn)程。

      該腳本有兩個(gè)問(wèn)題:

      按照進(jìn)程名字統(tǒng)計(jì),存在統(tǒng)計(jì)誤差,進(jìn)程名一致,但 PID 不一樣的進(jìn)程,都統(tǒng)計(jì)到一起;

      我們依然不能知道進(jìn)程操作了什么文件。

      通過(guò)對(duì) probe點(diǎn) 的分析(sudo stap -L'vfs.{write,read}'),我們可以知道,vfs.read,vfs.write 有局部變量 ino 可以利用,ino 是文件的inode,這樣我們就可以明確的探測(cè)到讀寫(xiě)量最多的進(jìn)程及文件。

      $ sudo stap -L 'vfs.{write,read}' vfs.read file:long pos:long buf:long bytes_to_read:long dev:long devname:string ino:long name:string argstr:string $file:struct file* $buf:char* $count:size_t $pos:loff_t* vfs.write file:long pos:long buf:long bytes_to_write:long dev:long devname:string ino:long name:string argstr:string $file:struct file* $buf:char const* $count:size_t $pos:loff_t*

      擴(kuò)展過(guò)的腳本如下:

      #!/usr/bin/stap global reads, writes, total_io probe vfs.read.return { reads[execname(),pid(),ino] += bytes_read } probe vfs.write.return { writes[execname(),pid(),ino] += bytes_written } # print top 10 IO processes every 5 seconds probe timer.s(5) { foreach ([name,process,inode] in writes) total_io[name,process,inode] += writes[name,process,inode] foreach ([name,process,inode] in reads) total_io[name,process,inode] += reads[name,process,inode] printf ("%16s\t%8s\t%8s\t%10s\t%10s\n", "Process", "PID", "inode", "KB Read", "KB Written") foreach ([name,process,inode] in total_io- limit 10) printf("%16s\t%8d\t%8d\t%10d\t%10d\n", name,process,inode, reads[name,process,inode]/1024, writes[name,process,inode]/1024) delete reads delete writes delete total_io print("\n") }

      一個(gè)實(shí)驗(yàn)

      我們來(lái)做個(gè)實(shí)驗(yàn),執(zhí)行 dd 命令來(lái)做一個(gè)高磁盤(pán)讀寫(xiě)操作。

      執(zhí)行命令如下:

      dd bs=64k count=4k if=/dev/zero of=test oflag=dsync

      這條命令執(zhí)行的效果是:dd 在執(zhí)行時(shí)每次都會(huì)進(jìn)行同步寫(xiě)入操作,每次從 /dev/zero 讀取 64 k數(shù)據(jù),然后寫(xiě)入當(dāng)前目錄下的 test 文件,一共重復(fù) 4 K次。在 linux 系統(tǒng)中, /dev/zero 是一個(gè)特殊的文件,當(dāng)你讀它的時(shí)候,它會(huì)提供無(wú)限的空字符(NULL, ASCII NUL, 0x00)。

      iotop.stp 監(jiān)控結(jié)果如下:

      通過(guò)監(jiān)控,我們知道了,PID 為 2978 的 dd 進(jìn)程 讀取 inode 為 1047 的文件,寫(xiě)入 inode 為 663624 的文件,這兩個(gè)是讀寫(xiě)最多的操作。

      通常情況下,我們并不知道 inode 對(duì)應(yīng)文件的位置,可以通過(guò) find / -inum 1047 找到對(duì)應(yīng)的文件。

      通過(guò) stat 命令,我們可以看到文件inode詳細(xì)的描述。

      $ stat /dev/zero 文件:"/dev/zero" 大小:0 塊:0 IO 塊:4096 字符特殊文件 設(shè)備:5h/5d Inode:1047 硬鏈接:1 設(shè)備類(lèi)型:1,5 權(quán)限:(0666/crw-rw-rw-) Uid:( 0/ root) Gid:( 0/ root) 環(huán)境:system_u:object_r:zero_device_t:s0 最近訪(fǎng)問(wèn):2017-05-02 10:50:03.242425632 +0800 最近更改:2017-05-02 10:50:03.242425632 +0800 最近改動(dòng):2017-05-02 10:50:03.242425632 +0800 創(chuàng)建時(shí)間:-

      這個(gè)分析思路在任何一個(gè)系統(tǒng)中都可以說(shuō)是能用的,只是不同的系統(tǒng)用的工具不同。這次用的環(huán)境是 CentOS,那在其他的系統(tǒng)中,只能找到相對(duì)應(yīng)的其他工具了。

      總結(jié)

      再次強(qiáng)調(diào),了解原理、理清思路是性能分析的重點(diǎn)。工具的使用是為了驗(yàn)證思路的正確性。千萬(wàn)不要舍本逐末。

      Linux 任務(wù)調(diào)度 應(yīng)用性能調(diào)優(yōu)

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:加密的活如何去掉密碼(加密怎么解除)
      下一篇:如何從零開(kāi)始學(xué)習(xí)Excel?學(xué)會(huì)這些讓你在工作中熟練應(yīng)用!
      相關(guān)文章
      亚洲成人黄色在线观看| 亚洲精品无码乱码成人| 亚洲精品无码国产| 亚洲Av无码国产情品久久| 亚洲精品国产综合久久久久紧| 亚洲视频欧洲视频| 无码欧精品亚洲日韩一区| 亚洲免费一区二区| 亚洲无码黄色网址| 亚洲欧美日韩一区二区三区| 亚洲无码一区二区三区| 亚洲图片中文字幕| 亚洲人成色77777| 久久久久亚洲精品天堂久久久久久| 久久精品国产亚洲av天美18| 亚洲乱码中文字幕在线| 亚洲sss综合天堂久久久| 亚洲精品免费在线视频| 久久久久久亚洲Av无码精品专口 | 亚洲成a∨人片在无码2023| 国产日本亚洲一区二区三区| 亚洲黄色一级毛片| 亚洲高清在线视频| 亚洲特级aaaaaa毛片| 亚洲无圣光一区二区| 亚洲成a人片在线观看中文app| 亚洲精品在线免费看| 亚洲黄色激情视频| 亚洲成熟丰满熟妇高潮XXXXX| 亚洲av成人一区二区三区在线观看 | 色偷偷女男人的天堂亚洲网 | 亚洲精品国产精品乱码不99 | 小说区亚洲自拍另类| xvideos亚洲永久网址| 亚洲一区二区三区免费| 亚洲人成网亚洲欧洲无码久久| 亚洲国产综合专区在线电影 | 亚洲美女在线国产| 亚洲高清国产AV拍精品青青草原 | 2022年亚洲午夜一区二区福利| 亚洲国产品综合人成综合网站|