真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

linux查看io命令,linux怎么查看io使用情況

linux查看網(wǎng)絡(luò)io使用率

sar -n DEV

額爾古納網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,額爾古納網(wǎng)站設(shè)計制作,有大型網(wǎng)站制作公司豐富經(jīng)驗。已為額爾古納成百上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個售后服務(wù)好的額爾古納做網(wǎng)站的公司定做!

不帶其他參數(shù) 看當天的網(wǎng)絡(luò)IO 缺省取樣時間為1秒,間隔為10分鐘

加 -f /var/log/sa/saxx可察看某日的歷史,xx為當月或上月的日期(day of the month)前提是改文件存在

察看即時IO用sar -n DEV 1 999 表示取樣間隔為1秒,取樣999次

具體字段的含義我就不醉贅述了

linux怎樣查看那個進程占用網(wǎng)絡(luò)io

查看linux進程占用端口步驟如下:

lsof -i 用以顯示符合條件的進程情況,lsof(list open files)是一個列出當前系統(tǒng)打開文件的工具。以root用戶來執(zhí)行l(wèi)sof -i命令,如下圖

lsof -i:端口號,用于查看某一端口的占用情況,比如查看22號端口使用情況,lsof -i:22,如下圖

netstat -tunlp用于顯示tcp,udp的端口和進程等相關(guān)情況,如下圖

netstat -tunlp|grep 端口號,用于查看指定端口號的進程情況,如查看22端口的情況,netstat -tunlp|grep 22,如下圖

Linux 磁盤IO

磁盤結(jié)構(gòu)與數(shù)據(jù)存儲方式, 數(shù)據(jù)是如何存儲的,又通過怎樣的方式被訪問?

機械硬盤主要由磁盤盤片、磁頭、主軸與傳動軸等組成;數(shù)據(jù)就存放在磁盤盤片中

現(xiàn)代硬盤尋道都是采用CHS( Cylinder Head Sector )的方式,硬盤讀取數(shù)據(jù)時,讀寫磁頭沿徑向移動,移到要讀取的扇區(qū)所在磁道的上方,這段時間稱為 尋道時間(seek time) 。 因讀寫磁頭的起始位置與目標位置之間的距離不同,尋道時間也不同 。磁頭到達指定磁道后,然后通過盤片的旋轉(zhuǎn),使得要讀取的扇區(qū)轉(zhuǎn)到讀寫磁頭的下方,這段時間稱為 旋轉(zhuǎn)延遲時間(rotational latencytime) 。然后再讀寫數(shù)據(jù),讀寫數(shù)據(jù)也需要時間,這段時間稱為 傳輸時間(transfer time) 。

固態(tài)硬盤主要由主控芯片、閃存顆粒與緩存組成;數(shù)據(jù)就存放在閃存芯片中

通過主控芯片進行尋址, 因為是電信號方式, 沒有任何物理結(jié)構(gòu), 所以尋址速度非常快且與數(shù)據(jù)存儲位置無關(guān)

如何查看系統(tǒng)IO狀態(tài)

查看磁盤空間

調(diào)用 open , fwrite 時到底發(fā)生了什么?

在一個IO過程中,以下5個API/系統(tǒng)調(diào)用是必不可少的

Create 函數(shù)用來打開一個文件,如果該文件不存在,那么需要在磁盤上創(chuàng)建該文件

Open 函數(shù)用于打開一個指定的文件。如果在 Open 函數(shù)中指定 O_CREATE 標記,那么 Open 函數(shù)同樣可以實現(xiàn) Create 函數(shù)的功能

Clos e函數(shù)用于釋放文件句柄

Write 和 Read 函數(shù)用于實現(xiàn)文件的讀寫過程

O_SYNC (先寫緩存, 但是需要實際落盤之后才返回, 如果接下來有讀請求, 可以從內(nèi)存讀 ), write-through

O_DSYNC (D=data, 類似O_SYNC, 但是只同步數(shù)據(jù), 不同步元數(shù)據(jù))

O_DIRECT (直接寫盤, 不經(jīng)過緩存)

O_ASYNC (異步IO, 使用信號機制實現(xiàn), 不推薦, 直接用aio_xxx)

O_NOATIME (讀取的時候不更新文件 atime(access time))

sync() 全局緩存寫回磁盤

fsync() 特定fd的sync()

fdatasync() 只刷數(shù)據(jù), 不同步元數(shù)據(jù)

mount noatime(全局不記錄atime), re方式(只讀), sync(同步方式)

一個IO的傳奇一生 這里有一篇非常好的資料,講述了整個IO過程;

下面簡單記錄下自己的理解的一次常見的Linux IO過程, 想了解更詳細及相關(guān)源碼,非常推薦閱讀上面的原文

Linux IO體系結(jié)構(gòu)

[站外圖片上傳中...(image-38a7b-1644137945193)]

Superblock 超級描述了整個文件系統(tǒng)的信息。為了保證可靠性,可以在每個塊組中對superblock進行備份。為了避免superblock冗余過多,可以采用稀疏存儲的方式,即在若干個塊組中對superblock進行保存,而不需要在所有的塊組中都進行備份

GDT 組描述符表 組描述符表對整個組內(nèi)的數(shù)據(jù)布局進行了描述。例如,數(shù)據(jù)塊位圖的起始地址是多少?inode位圖的起始地址是多少?inode表的起始地址是多少?塊組中還有多少空閑塊資源等。組描述符表在superblock的后面

數(shù)據(jù)塊位圖 數(shù)據(jù)塊位圖描述了塊組內(nèi)數(shù)據(jù)塊的使用情況。如果該數(shù)據(jù)塊已經(jīng)被某個文件使用,那么位圖中的對應(yīng)位會被置1,否則該位為0

Inode位圖 Inode位圖描述了塊組內(nèi)inode資源使用情況。如果一個inode資源已經(jīng)使用,那么對應(yīng)位會被置1

Inode表 (即inode資源)和數(shù)據(jù)塊。這兩塊占據(jù)了塊組內(nèi)的絕大部分空間,特別是數(shù)據(jù)塊資源

一個文件是由inode進行描述的。一個文件占用的數(shù)據(jù)塊block是通過inode管理起來的 。在inode結(jié)構(gòu)中保存了直接塊指針、一級間接塊指針、二級間接塊指針和三級間接塊指針。對于一個小文件,直接可以采用直接塊指針實現(xiàn)對文件塊的訪問;對于一個大文件,需要采用間接塊指針實現(xiàn)對文件塊的訪問

最簡單的調(diào)度器。它本質(zhì)上就是一個鏈表實現(xiàn)的 fifo 隊列,并對請求進行簡單的 合并 處理。

調(diào)度器本身并沒有提供任何可以配置的參數(shù)

讀寫請求被分成了兩個隊列, 一個用訪問地址作為索引,一個用進入時間作為索引,并且采用兩種方式將這些request管理起來;

在請求處理的過程中,deadline算法會優(yōu)先處理那些訪問地址臨近的請求,這樣可以最大程度的減少磁盤抖動的可能性。

只有在有些request即將被餓死的時候,或者沒有辦法進行磁盤順序化操作的時候,deadline才會放棄地址優(yōu)先策略,轉(zhuǎn)而處理那些即將被餓死的request

deadline算法可調(diào)整參數(shù)

read_expire : 讀請求的超時時間設(shè)置(ms)。當一個讀請求入隊deadline的時候,其過期時間將被設(shè)置為當前時間+read_expire,并放倒fifo_list中進行排序

write_expire :寫請求的超時時間設(shè)置(ms)

fifo_batch :在順序(sort_list)請求進行處理的時候,deadline將以batch為單位進行處理。每一個batch處理的請求個數(shù)為這個參數(shù)所限制的個數(shù)。在一個batch處理的過程中,不會產(chǎn)生是否超時的檢查,也就不會產(chǎn)生額外的磁盤尋道時間。這個參數(shù)可以用來平衡順序處理和饑餓時間的矛盾,當饑餓時間需要盡可能的符合預(yù)期的時候,我們可以調(diào)小這個值,以便盡可能多的檢查是否有饑餓產(chǎn)生并及時處理。增大這個值當然也會增大吞吐量,但是會導(dǎo)致處理饑餓請求的延時變長

writes_starved :這個值是在上述deadline出隊處理第一步時做檢查用的。用來判斷當讀隊列不為空時,寫隊列的饑餓程度是否足夠高,以時deadline放棄讀請求的處理而處理寫請求。當檢查存在有寫請求的時候,deadline并不會立即對寫請求進行處理,而是給相關(guān)數(shù)據(jù)結(jié)構(gòu)中的starved進行累計,如果這是第一次檢查到有寫請求進行處理,那么這個計數(shù)就為1。如果此時writes_starved值為2,則我們認為此時饑餓程度還不足夠高,所以繼續(xù)處理讀請求。只有當starved = writes_starved的時候,deadline才回去處理寫請求??梢哉J為這個值是用來平衡deadline對讀寫請求處理優(yōu)先級狀態(tài)的,這個值越大,則寫請求越被滯后處理,越小,寫請求就越可以獲得趨近于讀請求的優(yōu)先級

front_merges :當一個新請求進入隊列的時候,如果其請求的扇區(qū)距離當前扇區(qū)很近,那么它就是可以被合并處理的。而這個合并可能有兩種情況,一個是向當前位置后合并,另一種是向前合并。在某些場景下,向前合并是不必要的,那么我們就可以通過這個參數(shù)關(guān)閉向前合并。默認deadline支持向前合并,設(shè)置為0關(guān)閉

在調(diào)度一個request時,首先需要選擇一個一個合適的cfq_group。Cfq調(diào)度器會為每個cfq_group分配一個時間片,當這個時間片耗盡之后,會選擇下一個cfq_group。每個cfq_group都會分配一個vdisktime,并且通過該值采用紅黑樹對cfq_group進行排序。在調(diào)度的過程中,每次都會選擇一個vdisktime最小的cfq_group進行處理。

一個cfq_group管理了7棵service tree,每棵service tree管理了需要調(diào)度處理的對象cfq_queue。因此,一旦cfq_group被選定之后,需要選擇一棵service tree進行處理。這7棵service tree被分成了三大類,分別為RT、BE和IDLE。這三大類service tree的調(diào)度是按照優(yōu)先級展開的

通過優(yōu)先級可以很容易的選定一類Service tree。當一類service tree被選定之后,采用service time的方式選定一個合適的cfq_queue。每個Service tree是一棵紅黑樹,這些紅黑樹是按照service time進行檢索的,每個cfq_queue都會維護自己的service time。分析到這里,我們知道,cfq算法通過每個cfq_group的vdisktime值來選定一個cfq_group進行服務(wù),在處理cfq_group的過程通過優(yōu)先級選擇一個最需要服務(wù)的service tree。通過該Service tree得到最需要服務(wù)的cfq_queue。該過程在 cfq_select_queue 函數(shù)中實現(xiàn)

一個cfq_queue被選定之后,后面的過程和deadline算法有點類似。在選擇request的時候需要考慮每個request的延遲等待時間,選擇那種等待時間最長的request進行處理。但是,考慮到磁盤抖動的問題,cfq在處理的時候也會進行順序批量處理,即將那些在磁盤上連續(xù)的request批量處理掉

cfq調(diào)度算法的參數(shù)

back_seek_max :磁頭可以向后尋址的最大范圍,默認值為16M

back_seek_penalty :向后尋址的懲罰系數(shù)。這個值是跟向前尋址進行比較的

fifo_expire_async :設(shè)置異步請求的超時時間。同步請求和異步請求是區(qū)分不同隊列處理的,cfq在調(diào)度的時候一般情況都會優(yōu)先處理同步請求,之后再處理異步請求,除非異步請求符合上述合并處理的條件限制范圍內(nèi)。當本進程的隊列被調(diào)度時,cfq會優(yōu)先檢查是否有異步請求超時,就是超過fifo_expire_async參數(shù)的限制。如果有,則優(yōu)先發(fā)送一個超時的請求,其余請求仍然按照優(yōu)先級以及扇區(qū)編號大小來處理

fifo_expire_sync :這個參數(shù)跟上面的類似,區(qū)別是用來設(shè)置同步請求的超時時間

slice_idle :參數(shù)設(shè)置了一個等待時間。這讓cfq在切換cfq_queue或service tree的時候等待一段時間,目的是提高機械硬盤的吞吐量。一般情況下,來自同一個cfq_queue或者service tree的IO請求的尋址局部性更好,所以這樣可以減少磁盤的尋址次數(shù)。這個值在機械硬盤上默認為非零。當然在固態(tài)硬盤或者硬RAID設(shè)備上設(shè)置這個值為非零會降低存儲的效率,因為固態(tài)硬盤沒有磁頭尋址這個概念,所以在這樣的設(shè)備上應(yīng)該設(shè)置為0,關(guān)閉此功能

group_idle :這個參數(shù)也跟上一個參數(shù)類似,區(qū)別是當cfq要切換cfq_group的時候會等待一段時間。在cgroup的場景下,如果我們沿用slice_idle的方式,那么空轉(zhuǎn)等待可能會在cgroup組內(nèi)每個進程的cfq_queue切換時發(fā)生。這樣會如果這個進程一直有請求要處理的話,那么直到這個cgroup的配額被耗盡,同組中的其它進程也可能無法被調(diào)度到。這樣會導(dǎo)致同組中的其它進程餓死而產(chǎn)生IO性能瓶頸。在這種情況下,我們可以將slice_idle = 0而group_idle = 8。這樣空轉(zhuǎn)等待就是以cgroup為單位進行的,而不是以cfq_queue的進程為單位進行,以防止上述問題產(chǎn)生

low_latency :這個是用來開啟或關(guān)閉cfq的低延時(low latency)模式的開關(guān)。當這個開關(guān)打開時,cfq將會根據(jù)target_latency的參數(shù)設(shè)置來對每一個進程的分片時間(slice time)進行重新計算。這將有利于對吞吐量的公平(默認是對時間片分配的公平)。關(guān)閉這個參數(shù)(設(shè)置為0)將忽略target_latency的值。這將使系統(tǒng)中的進程完全按照時間片方式進行IO資源分配。這個開關(guān)默認是打開的

target_latency :當low_latency的值為開啟狀態(tài)時,cfq將根據(jù)這個值重新計算每個進程分配的IO時間片長度

quantum :這個參數(shù)用來設(shè)置每次從cfq_queue中處理多少個IO請求。在一個隊列處理事件周期中,超過這個數(shù)字的IO請求將不會被處理。這個參數(shù)只對同步的請求有效

slice_sync :當一個cfq_queue隊列被調(diào)度處理時,它可以被分配的處理總時間是通過這個值來作為一個計算參數(shù)指定的。公式為: time_slice = slice_sync + (slice_sync/5 * (4 - prio)) 這個參數(shù)對同步請求有效

slice_async :這個值跟上一個類似,區(qū)別是對異步請求有效

slice_async_rq :這個參數(shù)用來限制在一個slice的時間范圍內(nèi),一個隊列最多可以處理的異步請求個數(shù)。請求被處理的最大個數(shù)還跟相關(guān)進程被設(shè)置的io優(yōu)先級有關(guān)

通常在Linux上使用的IO接口是同步方式的,進程調(diào)用 write / read 之后會阻塞陷入到內(nèi)核態(tài),直到本次IO過程完成之后,才能繼續(xù)執(zhí)行,下面介紹的異步IO則沒有這種限制,但是當前Linux異步IO尚未成熟

目前Linux aio還處于較不成熟的階段,只能在 O_DIRECT 方式下才能使用(glibc_aio),也就是無法使用默認的Page Cache機制

正常情況下,使用aio族接口的簡要方式如下:

io_uring 是 2019 年 5 月發(fā)布的 Linux 5.1 加入的一個重大特性 —— Linux 下的全新的異步 I/O 支持,希望能徹底解決長期以來 Linux AIO 的各種不足

io_uring 實現(xiàn)異步 I/O 的方式其實是一個生產(chǎn)者-消費者模型:

邏輯卷管理

RAID0

RAID1

RAID5(糾錯)

條帶化

Linux系統(tǒng)性能調(diào)整:IO過程

Linux的IO調(diào)度

一個IO的傳奇一生

理解inode

Linux 文件系統(tǒng)是怎么工作的?

Linux中Buffer cache性能問題一探究竟

Asynchronous I/O and event notification on linux

AIO 的新歸宿:io_uring

Linux 文件 I/O 進化史(四):io_uring —— 全新的異步 I/O

如何找出Linux系統(tǒng)高IO的思路總結(jié)

前言

I/O Wait是一個需要使用高級的工具來debug問題原因,當然也有許多基本工具的高級用法。I/O wait的問題難以定位的原因是:因為我們有很多工具可以告訴你I/O 受限了,但是并沒有告訴你具體是哪個進程引起的。

1. 如何確認,是否是I/O問題導(dǎo)致系統(tǒng)緩慢

確認是否是I/O導(dǎo)致的系統(tǒng)緩慢我們可以使用多個命令,但是,最簡單的是unix的命令 top

# top

top - 14:31:20 up 35 min, 4 users, load average: 2.25, 1.74, 1.68

Tasks: 71 total, 1 running, 70 sleeping, 0 stopped, 0 zombie

Cpu(s): 2.3%us, 1.7%sy, 0.0%ni, 0.0%id, 96.0%wa, 0.0%hi, 0.0%si, 0.0%st

Mem: 245440k total, 241004k used, 4436k free, 496k buffers

Swap: 409596k total, 5436k used, 404160k free, 182812k cached

從CPU這行,可以發(fā)現(xiàn)CPU的io wait;這里是96.0%。越高就代表CPU用于io wait的資源越多。

2. 找出哪個磁盤正在被寫入

上邊的top命令從一個整體上說明了I/O wait,但是并沒有說明是哪塊磁盤影響的,想知道是哪塊磁盤引發(fā)的問題,可以使用另外一個命令 iostat 命令

$ iostat -x 2 5

avg-cpu: %user %nice %system %iowait %steal %idle

3.66 0.00 47.64 48.69 0.00 0.00

Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util

sda 44.50 39.27 117.28 29.32 11220.94 13126.70 332.17 65.77 462.79 9.80 2274.71 7.60 111.41

dm-0 0.00 0.00 83.25 9.95 10515.18 4295.29 317.84 57.01 648.54 16.73 5935.79 11.48 107.02

dm-1 0.00 0.00 57.07 40.84 228.27 163.35 8.00 93.84 979.61 13.94 2329.08 10.93 107.02

iostat 會每2秒更新一次,一共打印5次信息, -x 的選項是打印出擴展信息

第一個iostat 報告會打印出系統(tǒng)最后一次啟動后的統(tǒng)計信息,這也就是說,在多數(shù)情況下,第一個打印出來的信息應(yīng)該被忽略,剩下的報告,都是基于上一次間隔的時間。舉例子來說,這個命令會打印5次,第二次的報告是從第一次報告出來一個后的統(tǒng)計信息,第三次是基于第二次 ,依次類推

所以,一定記?。旱谝粋€忽略!

在上面的例子中,sda的%utilized 是111.41%,這個很好的說明了有進程正在寫入到sda磁盤中。

除了%utilized 外,我們可以從iostat得到更加豐富的資源信息,例如每毫秒讀寫請求(rrqm/s wrqm/s)),每秒讀寫的((r/s w/s)。在上邊的例子中,我們的項目看起來正在讀寫非常多的信息。這個對我們查找相應(yīng)的進程非常有用。

3. 找出導(dǎo)致高IO的進程

# iotop

Total DISK READ: 8.00 M/s | Total DISK WRITE: 20.36 M/s

TID PRIO USER DISK READ DISK WRITE SWAPIN IO COMMAND

15758 be/4 root 7.99 M/s 8.01 M/s 0.00 % 61.97 % bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

最簡單的方法就是用iotop找出哪個進程用了最多的存儲資源,從上面可以看到是bonnie++。

iotop很好用,但是不是默認安裝的。

如果沒有iotop,下面的方式也可以讓你有種方法縮小范圍,盡快找到是哪個進程。

ps 命令對內(nèi)存和CPU有一個統(tǒng)計,但是他沒有對磁盤I/O的統(tǒng)計,雖然他沒有顯示磁盤I/O,但是它顯示進行的狀態(tài),我們可以用來知道一個進程是否正在等待I/O

主要的進程狀態(tài)有:

PROCESS STATE CODES

D uninterruptible sleep (usually IO)

R running or runnable (on run queue)

S interruptible sleep (waiting for an event to complete)

T stopped, either by a job control signal or because it is being traced.

W paging (not valid since the 2.6.xx kernel)

X dead (should never be seen)

Z defunct ("zombie") process, terminated but not reaped by its parent.

等待I/O的進程的狀態(tài)一般是“uninterruptible sleep”,或者“D”,我們可以很容易的查找到正在等待I/O的進程

# for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "----"; sleep 5; done

D 248 [jbd2/dm-0-8]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 22 [kswapd0]

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

----

D 16528 bonnie++ -n 0 -u 0 -r 239 -s 478 -f -b -d /tmp

上邊的例子會循環(huán)的輸出狀態(tài)是D的進程,每5秒一次,一共10次

從輸出我們可以知道 bonnie++ 的pid是16528 ,在waiting,bonnie++看起來就是我們想找到的進程,但是,只是從它的狀態(tài),我們沒有辦法證明就是bonnie++引起的I/O等待。

為了證明,我們可以可以查看/proc,每個進程目錄下都有一個叫io的文件,里邊保存這和iotop類似的信息。

# cat /proc/16528/io

rchar: 48752567

wchar: 549961789

syscr: 5967

syscw: 67138

read_bytes: 49020928

write_bytes: 549961728

cancelled_write_bytes: 0

read_bytes和write_bytes是這個進程從磁盤讀寫的字節(jié),在這個例子中,bonnie++進程讀取了46M的數(shù)據(jù)并且寫入了524MB的數(shù)據(jù)到磁盤上。

4. 找出哪個文件正在被大量寫入

lsof 命令可以展示一個進程打開的所有文件。從這個列表中,我們可以找到哪個文件被寫入。

# lsof -p 16528

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

bonnie++ 16528 root cwd DIR 252,0 4096 130597 /tmp

truncated

bonnie++ 16528 root 8u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 9u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 10u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 11u REG 252,0 501219328 131869 /tmp/Bonnie.16528

bonnie++ 16528 root 12u REG 252,0 501219328 131869 strong/tmp/Bonnie.16528/strong

# df /tmp

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/mapper/workstation-root 7667140 2628608 4653920 37% /

# pvdisplay

--- Physical volume ---

PV Name /dev/sda5

VG Name workstation

PV Size 7.76 GiB / not usable 2.00 MiB

Allocatable yes

PE Size 4.00 MiB

Total PE 1986

Free PE 8

Allocated PE 1978

PV UUID CLbABb-GcLB-l5z3-TCj3-IOK3-SQ2p-RDPW5S

使用pvdisplay可以看到,pv設(shè)備就是/dev/sda5,正是我們前面找到的sda。

參考文檔:

如何查看Linux下進程的IO活動狀況 00 Hey,Linux

您好,很高興為您解答。服務(wù)器cpu使用率不高,load比較高,所以要查看一下IO。硬盤IO可以通過命令vmstat或iostat獲得(也可以用yum安裝dstat獲得),網(wǎng)絡(luò)IO可以用iftop命令獲取。但是不知道那個進程使用硬盤IO比較高,通過查找沒有找到相關(guān)命令,只好自己寫個腳本進行統(tǒng)計處理。本腳本在CentOS6下(kernel2.6以上)python2.6測試通過。直接運行腳本,默認情況下收集3秒鐘數(shù)據(jù),顯示讀寫最高的前三個進程。如用參數(shù)可以使用命令“pythonfhip.py453”,第一個數(shù)位每次收集讀寫數(shù)據(jù)的間隔秒數(shù),第二個數(shù)是打印出讀寫最多的n個進程,第三個為運行腳本的次數(shù)。因為參數(shù)部分寫的比較簡單那,所以用參數(shù)必須3個全寫。。#!/bin/python#-*-coding:utf-8-*-#Filename:ind_high_io_process#Revision:1.0#Date:2013-3-8#Author:simonzhang#web:###ENDINITINFOimportosimportreimportsysimporttimefromstringimportstrip####sys_proc_path='/proc/'re_find_process_number='^\d+$'#####通過/proc/$pid/io獲取讀寫信息####defcollect_info():_tmp={}re_find_process_dir=re.compile(re_find_process_number)foriinos.listdir(sys_proc_path):ifre_find_process_dir.search(i):#獲得進程名process_name=open("%s%s/stat"%(sys_proc_path,i),"rb").read().split("")[1]#讀取io信息rw_io=open("%s%s/io"%(sys_proc_path,i),"rb").readlines()for_infoinrw_io:cut_info=strip(_info).split(':')ifstrip(cut_info[0])=="read_bytes":read_io=int(strip(cut_info[1]))ifstrip(cut_info[0])=="write_bytes":write_io=int(strip(cut_info[1]))_tmp[i]={"name":process_name,"read_bytes":read_io,"write_bytes":write_io}return_tmpdefmain(_sleep_time,_list_num):_sort_read_dict={}_sort_write_dict={}#獲取系統(tǒng)讀寫數(shù)據(jù)process_info_list_frist=collect_info()time.sleep(_sleep_time)process_info_list_second=collect_info()#將讀數(shù)據(jù)和寫數(shù)據(jù)進行分組,寫入兩個字典中forloopinprocess_info_list_second.keys():second_read_v=process_info_list_second[loop]["read_bytes"]second_write_v=process_info_list_second[loop]["write_bytes"]try:frist_read_v=process_info_list_frist[loop]["read_bytes"]except:frist_read_v=0try:frist_write_v=process_info_list_frist[loop]["write_bytes"]except:frist_write_v=0#計算第二次獲得數(shù)據(jù)域第一次獲得數(shù)據(jù)的差_sort_read_dict[loop]=second_read_v-frist_read_v_sort_write_dict[loop]=second_write_v-frist_write_v#將讀寫數(shù)據(jù)進行排序sort_read_dict=sorted(_sort_read_dict.items(),key=lambda_sort_read_dict:_sort_read_dict[1],reverse=True)sort_write_dict=sorted(_sort_write_dict.items(),key=lambda_sort_write_dict:_sort_write_dict[1],reverse=True)#打印統(tǒng)計結(jié)果print"pidprocessread(bytes)pidprocesswrite(btyes)"for_numinrange(_list_num):read_pid=sort_read_dict[_num][0]write_pid=sort_write_dict[_num][0]res="%s"%read_pidres+=""*(8-len(read_pid))+process_info_list_second[read_pid]["name"]res+=""*(12-len(process_info_list_second[read_pid]["name"]))+"%s"%sort_read_dict[_num][1]res+=""*(12-len("%s"%sort_read_dict[_num][1]))+write_pidres+=""*(8-len(write_pid))+process_info_list_second[write_pid]["name"]res+=""*(12-len("%s"%process_info_list_second[write_pid]["name"]))+"%s"%sort_write_dict[_num][1]printresprint"\n"*1if__name__=='__main__':try:_sleep_time=sys.argv[1]except:_sleep_time=3try:_num=sys.argv[2]except:_num=3try:loop=sys.argv[3]except:loop=1foriinrange(int(loop)):main(int(_sleep_time),int(_num))如若滿意,請點擊【采納答案】,如若還有問題,請點擊【追問】希望我的回答對您有所幫助,望采納!~O(∩_∩)O~

linux系統(tǒng)如何查看網(wǎng)絡(luò)IO?

首先 、用top命令查看

top - 16:15:05 up 6 days, ?6:25, ?2 users, ?load average: 1.45, 1.77, 2.14

Tasks: 147 total, ? 1 running, 146 sleeping, ? 0 stopped, ? 0 zombie

Cpu(s): ?0.2% us, ?0.2% sy, ?0.0% ni, 86.9% id, 12.6% wa, ?0.0% hi, ?0.0% si

Mem: ? 4037872k total, ?4003648k used, ? ?34224k free, ? ? 5512k buffers

Swap: ?7164948k total, ? 629192k used, ?6535756k free, ?3511184k cached

查看12.6% wa

IO等待所占用的CPU時間的百分比,高過30%時IO壓力高

其次、 用iostat -x 1 10

avg-cpu: ?%user ? %nice ? ?%sys %iowait ? %idle

0.00 ? ? ? 0.00 ? ? 0.25 ? ?33.46 ? ?66.29

Device: ? ?rrqm/s ?wrqm/s ? r/s ? ?w/s ? ? rsec/s ? wsec/s ? ?rkB/s ? ?wkB/s avgrq-sz avgqu-sz ? await ?svctm ?%util

sda ? ? ? ? ?0.00 ? ?0.00 ? ? ?0.00 ? 0.00 ? ?0.00 ? ?0.00 ? ? ? ? 0.00 ? ? 0.00 ? ? 0.00 ? ? ? ? ? 0.00 ? ?0.00 ? ?0.00 ? 0.00

sdb ? ? ? ? ?0.00 ? 1122 ?17.00 ?9.00 ?192.00 9216.00 ? ?96.00 ?4608.00 ? 123.79 ? 137.23 1033.43 ?13.17 100.10

sdc ? ? ? ? ?0.00 ? ?0.00 ? ? 0.00 ? 0.00 ? ? 0.00 ? ? 0.00 ? ? ?0.00 ? ? 0.00 ? ? 0.00 ? ? ? ? ? ? 0.00 ? ?0.00 ? ? ?0.00 ? 0.00

查看%util 100.10 %idle 66.29

如果 %util 接近 100%,說明產(chǎn)生的I/O請求太多,I/O系統(tǒng)已經(jīng)滿負荷,該磁盤可能存在瓶頸。

idle小于70% IO壓力就較大了,一般讀取速度有較多的wait.

同時可以結(jié)合vmstat 查看查看b參數(shù)(等待資源的進程數(shù))

vmstat -1

如果你想對硬盤做一個IO負荷的壓力測試可以用如下命令

time dd if=/dev/zero bs=1M count=2048 of=direct_2G

此命令為在當前目錄下新建一個2G的文件

我們在新建文件夾的同時來測試IO的負荷情況。


名稱欄目:linux查看io命令,linux怎么查看io使用情況
文章網(wǎng)址:http://weahome.cn/article/heeicp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部