導航:首頁 > 編程系統 > linux系統如何查看io

linux系統如何查看io

發布時間:2024-10-18 00:28:22

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

前段時間,幾台測試伺服器的Web應用響應速度非常慢,系統負載也比較高,> 10, 但CPU和內存卻很閑,於是懷疑是磁碟的性能瓶頸,通過vmstat和iostat看到IO的讀寫量非常大,尤其是用iostat -x 1命令可以很直觀的看到IO的使用率一直在100%。
但究竟是什麼進程導致的高IO呢,由於每台伺服器上都有JBoss和MySQL的存在,JBoss會不停的產生很多小的數據文件和生成文本資料庫的數據,而MySQL則會不停的從Master同步新的數據。因此我們懷疑是這兩個進程導致的高IO,通過停止了JBoss和MySQL之後,IO立刻降為0%. 但我們還是不能確定誰是主因,於是尋找可以查看特定進程IO的方法。
最後,找到了兩個方法可以查看進程IO的活動狀況。
1. 第一個方法是通過一個python腳本來實現。
方法是將以下內容另存為一個叫io.py的腳本中,然後直接以root身份執行腳本,就可以看到如下圖所示的信息(由於我們已經通過升級到SSD硬碟解決了MySQL的IO問題,所以不能提供關於MySQL的截圖了),其中出現次數最多,數據最大的進程,就是導致高IO的主因。不過比較遺憾的是這個腳本並不能顯示進程在每一秒的准確的IO讀寫。

# vim io.py
# chmod +x io.py
# ./io.py
#!/usr/bin/python
# Monitoring per-process disk I/O activity
# written by http://www.vpsee.com

import sys, os, time, signal, re

class DiskIO:
def __init__(self, pname=None, pid=None, reads=0, writes=0):
self.pname = pname
self.pid = pid
self.reads = 0
self.writes = 0

def main():
argc = len(sys.argv)
if argc != 1:
print "usage: ./iotop"
sys.exit(0)

if os.getuid() != 0:
print "must be run as root"
sys.exit(0)

signal.signal(signal.SIGINT, signal_handler)
os.system('echo 1 > /proc/sys/vm/block_mp')
print "TASK PID READ WRITE"
while True:
os.system('dmesg -c > /tmp/diskio.log')
l = []
f = open('/tmp/diskio.log', 'r')
line = f.readline()
while line:
m = re.match(\
'^(\S+)\((\d+)\): (READ|WRITE) block (\d+) on (\S+)', line)
if m != None:
if not l:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
continue
found = False
for item in l:
if item.pid == m.group(2):
found = True
if m.group(3) == "READ":
item.reads = item.reads + 1
elif m.group(3) == "WRITE":
item.writes = item.writes + 1
if not found:
l.append(DiskIO(m.group(1), m.group(2)))
line = f.readline()
time.sleep(1)
for item in l:
print "%-10s %10s %10d %10d" % \
(item.pname, item.pid, item.reads, item.writes)

def signal_handler(signal, frame):
os.system('echo 0 > /proc/sys/vm/block_mp')
sys.exit(0)

if __name__=="__main__":
main()

2. 另一個方法是將Linux的內核升級到 >=2.6.20,然後安裝一個iotop軟體來實現。
不過這種改動並不適用於生產環境,因為在RHEL5.6和5.7上,內核都在 2.6.20以下。但是它所顯示的結果是非常准確的,所以對於新上線的機器以及測試環境,非常值得一試,具體方法如下:

下載和升級新內核(>=2.6.20),編譯時打開 TASK_DELAY_ACCT 和 TASK_IO_ACCOUNTING 選項。
解壓內核後進入配置界面:
# wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.tar.gz
# tar jxvf linux-2.6.39.tar.gz
# mv linux-2.6.39 /usr/src/
# cd /usr/src/linux-2.6.39
# make oldconfig //使用make oldconfig可以繼承老的kernel的配置,為自己的配置省去很多麻煩。
# make menuconfig
把General setup - Enable per-task storage I/O accounting這個選項選上。

# vim .config
將#CONFIG_SYSFS_DEPRECATED_V2 is not set的注釋去掉的,將其改為y,即修改為CONFIG_SYSFS_DEPRECATED_V2=y。
保存內核後編譯內核:
# make
# make moles
# make moles_install
# make install
修改默認以新的內核啟動:
# vi /boot/grub/grub.conf
default=0
將新的內核配置文件復制到/boot目錄:
# cp /usr/src/linux-2.6.39/.config /boot/config-2.6.39
重啟伺服器:
# reboot
# uname –r
2.6.39
重啟完成後確認內核版本是否正確。
源碼安裝iotop所需的Python 2.7.2(>= 2.5):
# wget http://www.python.org/ftp/python/2.7.2/Python-2.7.2.tgz
# tar xzvf Python-2.7.2.tgz
# cd Python-2.7.2
# ./configure
# make; make install
下載並安裝iotop:
# wget http://guichaz.free.fr/iotop/files/iotop-0.4.4.tar.bz2
# tar -xjvf iotop-0.4.4.tar.bz2
# cd iotop-0.4.4
# python setup.py build
# python setup.py install
然後就可以使用iotop看到如下圖所示的信息:

❷ linux系統如何查看網路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%,說明產生的I/O請求太多,I/O系統已經滿負荷,該磁碟可能存在瓶頸。

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

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

vmstat -1

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

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

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

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

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

您好,很高興為您解答。伺服器cpu使用率不高,load比較高,所以要查看一下IO。硬碟IO可以通過命令vmstat或iostat獲得(也可以用yum安裝dstat獲得),網路IO可以用iftop命令獲取。但是不知道那個進程使用硬碟IO比較高,通過查找沒有找到相關命令,只好自己寫個腳本進行統計處理。本腳本在CentOS6下(kernel2.6以上)python2.6測試通過。直接運行腳本,默認情況下收集3秒鍾數據,顯示讀寫最高的前三個進程。如用參數可以使用命令「pythonfhip.py453」,第一個數位每次收集讀寫數據的間隔秒數,第二個數是列印出讀寫最多的n個進程,第三個為運行腳本的次數。因為參數部分寫的比較簡單那,所以用參數必須3個全寫。。#!/bin/python#-*-coding:utf-8-*-#Filename:ind_high_io_process#Revision:1.0#Date:2013-3-8#Author:simonzhang#web:#######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={}#獲取系統讀寫數據process_info_list_frist=collect_info()time.sleep(_sleep_time)process_info_list_second=collect_info()#將讀數據和寫數據進行分組,寫入兩個字典中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#計算第二次獲得數據域第一次獲得數據的差_sort_read_dict[loop]=second_read_v-frist_read_v_sort_write_dict[loop]=second_write_v-frist_write_v#將讀寫數據進行排序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)#列印統計結果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 系統查看哪個進程佔io

方法一:

安個iotop

以ubuntu為例:

安裝 root@ubuntu:~# apt-get install iotop

安裝完成後 執行iotop 就可以看到類似top一樣的顯示

按進程顯示IO各項指標

PS:內核需要升級到 >=2.6.20

方法二:

執行以下python腳本:

#!/usr/bin/python

# Monitoring per-process disk I/O activity

# written by http://www.vpsee.com


import sys, os, time, signal, re


class DiskIO:

def __init__(self, pname=None, pid=None, reads=0, writes=0):

self.pname = pname

self.pid = pid

self.reads = 0

self.writes = 0


def main():

argc = len(sys.argv)

if argc != 1:

print "usage: ./iotop"

sys.exit(0)


if os.getuid() != 0:

print "must be run as root"

sys.exit(0)


signal.signal(signal.SIGINT, signal_handler)

os.system('echo 1 > /proc/sys/vm/block_mp')

print "TASK PID READ WRITE"

while True:

os.system('dmesg -c > /tmp/diskio.log')

l = []

f = open('/tmp/diskio.log', 'r')

line = f.readline()

while line:

m = re.match(

'^(S+)((d+)): (READ|WRITE) block (d+) on (S+)', line)

if m != None:

if not l:

l.append(DiskIO(m.group(1), m.group(2)))

line = f.readline()

continue

found = False

for item in l:

if item.pid == m.group(2):

found = True

if m.group(3) == "READ":

item.reads = item.reads + 1

elif m.group(3) == "WRITE":

item.writes = item.writes + 1

if not found:

l.append(DiskIO(m.group(1), m.group(2)))

line = f.readline()

time.sleep(1)

for item in l:

print "%-10s %10s %10d %10d" %

(item.pname, item.pid, item.reads, item.writes)


def signal_handler(signal, frame):

os.system('echo 0 > /proc/sys/vm/block_mp')

sys.exit(0)


if __name__=="__main__":

main()

閱讀全文

與linux系統如何查看io相關的資料

熱點內容
每次都要到多個平台更改配置文件 瀏覽:495
RAM讀取數據和地址有什麼關系 瀏覽:494
小情歌哪個版本好聽 瀏覽:289
ios游戲在哪個文件夾 瀏覽:475
linux怎樣打開鏈接文件 瀏覽:48
ug6加工配置文件下載 瀏覽:308
方糖app如何下載 瀏覽:82
win10無法記憶桌面圖標 瀏覽:577
更新代碼 瀏覽:56
bde的配置文件 瀏覽:66
mac和windows系統哪個更適合編程 瀏覽:162
小米11手機桌面文件夾改名 瀏覽:481
文件壓縮方法 瀏覽:893
換購手機怎麼克隆數據 瀏覽:203
什麼是字元串數據 瀏覽:666
linux文件另存為 瀏覽:688
win10ssd激活工具 瀏覽:961
qq活躍數據怎麼看 瀏覽:435
為什麼編程機構進入不了學校 瀏覽:514
壓縮文件打開有臨時文件 瀏覽:824

友情鏈接