當前位置:首頁 » 操作系統 » linuxio進程

linuxio進程

發布時間: 2025-01-29 03:13:08

A. 如何查看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~

B. linux怎樣查看那個進程佔用網路io

查看linux進程佔用埠步驟如下:

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


    C. 如何查看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看到如下圖所示的信息:

熱點內容
朗行選哪個配置 發布:2025-01-30 12:59:19 瀏覽:220
安卓轉蘋果的用戶適合什麼游戲 發布:2025-01-30 12:59:18 瀏覽:758
python書籍推薦知乎 發布:2025-01-30 12:57:52 瀏覽:632
android輸入法自動彈出 發布:2025-01-30 12:57:39 瀏覽:34
循環碼編解碼實驗的心得體會 發布:2025-01-30 12:53:15 瀏覽:674
煙能解壓碼 發布:2025-01-30 12:34:06 瀏覽:853
vbnet字元串加密 發布:2025-01-30 12:21:56 瀏覽:458
帝國3存儲 發布:2025-01-30 12:18:47 瀏覽:849
壓縮句子的題 發布:2025-01-30 12:07:33 瀏覽:803
文件夾側面標簽尺寸 發布:2025-01-30 12:00:36 瀏覽:97