evgenyl 28.09.2009 14:05

PythonЧитаем /proc

Продолжаю серию статей о питоне, решил затронуть тему замечательной файловой системы /proc.

Я напишу несколько примеров для получения информации из proc, это можно реализовать на любом языке, тут в общем важен принцип.



1) Для начала получим загрузку процессора.

Немного теории, ЦП не заргужен как мы это представляем на 5% или 10%, он либо работает либо спит.

Загрузка считается за промежуток времени в виде разницы между отработынных тиков и тиков которые процессор бездействовал.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import time

def cpu_get_state():

state={}

data=map( int, open(&#39;/proc/stat').readlines()<0>.split()<1:5> )

state<&#39;busy'>=sum(data<:-1>)

state<&#39;work'>=sum(data)

return state

def cpu_load():

state1=cpu_get_state()

time.sleep(1)

state2=cpu_get_state()

return 100.0*(state2<&#39;busy'>-state1<'busy'>)/(state2<'work'>-state1<'work'>)



while 1:

print cpu_load(), &#39;%'





2) Загрузка сети

Тут вообще все просто, опять же считаем, сколько байт передалось за секунду.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import time

def net_get_state(iface):

return time.time(),map(int, < i for i in open(&#39;/proc/net/dev').readlines() if i.find(iface)>0 ><0>.replace(':',' ').split()<1:><::8> )

def net_load(iface):

&#39;''(rx, tx) kb/s'''

t1,state1=net_get_state(iface)

time.sleep(1)

t2,state2=net_get_state(iface)

return map( lambda i,j: 1.0*(i-j)/(t2-t1)/1024, state2, state1)



while 1:

print net_load(&#39;eth0')





3) Чтение запись с винта.

В статистике доступно только кол-во прочтенных секторов т.е. * 512 чтобы получить байты.

Программа показывает скорость чтения и записи устройства.

 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
import time



def disk_state(disk):

return time.time(), map(int, < i.split()<3:> for i in open(&#39;/proc/diskstats').readlines() if i.find(disk)>0 ><0> )

def disk_load(disk):

&#39;''(read, write) kb/s'''

t1,s1=disk_state(disk)

time.sleep(1)

t2,s2=disk_state(disk)

dt=t2-t1

return (s2<2>-s1<2>)/dt*512/1024,(s2<6>-s1<6>)/dt*512/1024



while 1:

print disk_load(&#39;sda')





Можно рисовать графики, опрашивать сервера, короче все что душе угодно.



PS: Я не привожу описание файлов из proc, их очень легко найти с подробными комментариями в гугле.


Тэги:
+ 10 -
Похожие Поделиться

Kane 20.10.2009 13:38 #
Хех, год назад назад писал курсовик — диспетчер задач, данные шли из /proc естественно