psutil库介绍(一)

参考

安装

pip install psutil 

测试

import psutil
psutil.test()

输出:

USER         PID %CPU %MEM     VSZ     RSS TTY           START    TIME  COMMAND
root           1  0.0  0.2  182700    3140 ?             Jul03   00:04  systemd
root           2  0.0    ?       ?       ? ?             Jul03   00:00  kthreadd
root           3  0.0    ?       ?       ? ?             Jul03   00:07  ksoftirqd/0
root           5  0.0    ?       ?       ? ?             Jul03   00:00  kworker/0:0H
root           7  0.0    ?       ?       ? ?             Jul03   06:43  rcu_sched
...

cpu部分

测试代码:

import psutil
cts = psutil.cpu_times()
cputime = 0
for item in cts:
    if item != 0:
        cputime = cputime + item
        
print '用户时间:%f%%' % (cts.user/cputime * 100)
print '内核时间:%f%%' % (cts.system/cputime * 100)
print '空闲时间:%f%%' % (cts.idle/cputime * 100)

输出:

scputimes(user=8888.84, nice=358.84, system=9442.12, idle=287258.54, iowait=171.63, irq=0.1, softirq=207.79, steal=0.0, guest=0.0, guest_nice=0.0)
用户时间:2.901741%
内核时间:3.082358%
空闲时间:93.774866%

相关的名词解释:

> user:CPU执行用户进程所花费的时间

> nice:系统调整进程优先级所花费的时间

> system:CPU在内核运行时间,包括IRQ和softirq时间

> idle:系统处于空闲期,等待进程运行所花费的时间

> iowait:CPI在等待I/O操作完成所花费的时间

> irq:系统处理硬中断所花费的时间

> softirq:系统处理软中断中断所花费的时间

> steal:被强制等待(involuntary wait)虚拟CPU的时间,此时hypervisor在为另一个虚拟处理器服务

> guest:虚拟CPU上所花费的时间

> guest_nice:虚拟机调整进程优先级所花费的时间

测试代码:

import psutil
#逻辑CPU为物理个数*核数
print psutil.cpu_count()#逻辑CPU个数,
print psutil.cpu_count(logical=False)#物理cpu数量,

输出:

4
2

测试代码:

import psutil
#3秒内CPU使用率
psutil.cpu_percent(interval=3)
#3秒内CPU时间
psutil.cpu_times_percent(interval=3)

输出:

0.2
scputimes(user=0.1, nice=0.0, system=0.1, idle=99.8, iowait=0.0, irq=0.0, softirq=0.0, steal=0.0, guest=0.0, guest_nice=0.0)

测试代码:

import psutil
#获取每个每个逻辑cpu的cpu时间
cts = psutil.cpu_times(percpu=True)
for item in cts:
    print item

输出:

scputimes(user=2238.06, nice=93.16, system=2428.54, idle=72457.66, iowait=42.92, irq=0.08, softirq=97.32, steal=0.0, guest=0.0, guest_nice=0.0)
scputimes(user=2252.32, nice=91.35, system=2422.54, idle=72640.16, iowait=41.35, irq=0.0, softirq=26.46, steal=0.0, guest=0.0, guest_nice=0.0)
scputimes(user=2259.44, nice=87.5, system=2302.4, idle=72809.27, iowait=43.23, irq=0.02, softirq=68.16, steal=0.0, guest=0.0, guest_nice=0.0)
scputimes(user=2165.43, nice=90.67, system=2300.54, idle=72947.44, iowait=44.75, irq=0.0, softirq=16.87, steal=0.0, guest=0.0, guest_nice=0.0)

内存部分

测试代码:

import psutil
mem = psutil.virtual_memory()
print mem
print (mem.total-mem.available)/float(mem.total) * 100

输出:

svmem(total=2081054720L, available=424890368L, percent=79.6, used=1977294848L, free=103759872L, active=731291648, inactive=692670464, buffers=25604096L, cached=295526400)
79.5829314858

相关的名词解释:

>total:可识别的内存总数,不含页面文件,有时候会略微少于物理内存,是因为被硬件保留。

>available:空闲的内存数量,已经被操作系统控制但未被具体分配的内存,这实际是的空闲内存。

>percent:使用内存占用的百分比。

>used:使用的物理内存总量。

>free:没有被系统所使用的内存,这部分内存暂时不会被任何应用或者内核所使用,可以说这部分内存实际上是被浪费掉了

>active:活跃内存。

>inactive:非活跃内存。

>buffers:用作内核缓存的内存量。

>cached:缓冲的交换区总量。 内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖, 该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。

测试代码:

import psutil
print psutil.swap_memory()

输出:

sswap(total=1071640576L, used=664248320L, free=407392256L, percent=62.0, sin=1829502976, sout=2796204032)

相关的名词解释:

>sin:每秒交换回内存(Swap in)的总量。

>sout:每秒交换出内存(Swap out)的总量。

硬盘分区部分

测试代码:

import psutil
devs = psutil.disk_partitions()
for dev in devs:
    print '挂在设备:%s,挂载点:%s' % (dev.device,dev.mountpoint)

输出:


sdiskpart(device='/dev/disk/by-uuid/1690f26d-4893-4c2f-8e0e-3ef22b1f4d14', mountpoint='/', fstype='ext4', opts='rw,relatime,errors=remount-ro,data=ordered')
挂在设备:/dev/disk/by-uuid/1690f26d-4893-4c2f-8e0e-3ef22b1f4d14,挂载点:/
sdiskpart(device='/dev/sr0', mountpoint='/media/shixin/CDROM', fstype='iso9660', opts='ro,nosuid,nodev,relatime,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500')
挂在设备:/dev/sr0,挂载点:/media/shixin/CDROM
sdiskpart(device='/dev/sr1', mountpoint='/media/shixin/Ubuntu-Kylin 15.04 amd64', fstype='iso9660', opts='ro,nosuid,nodev,relatime,uid=1000,gid=1000,iocharset=utf8,mode=0400,dmode=0500')
挂在设备:/dev/sr1,挂载点:/media/shixin/Ubuntu-Kylin 15.04 amd64
sdiskpart(device='/dev/fd0', mountpoint='/media/floppy0', fstype='vfat', opts='rw,nosuid,nodev,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro')
挂在设备:/dev/fd0,挂载点:/media/floppy0

相关的名词解释:

>mountpoint:文件卷在目录层次内存在的位置

>fstype:指定挂载设备的文件系统类型

>device:挂载设备

>opts:挂载参数

网络部分

测试代码:

import psutil
nets = psutil.net_io_counters(pernic=True)
for k in nets:
    print nets[k]

输出:

snetio(bytes_sent=363926917, bytes_recv=363926917, packets_sent=390824, packets_recv=390824, errin=0, errout=0, dropin=0, dropout=0)
snetio(bytes_sent=219786003, bytes_recv=537915337, packets_sent=540269, packets_recv=1044552, errin=0, errout=0, dropin=6491, dropout=0)

相关的名词解释:

> bytes_sent:发送总量

> bytes_recv:接收总量

> packets_sent:发送包总量

> packets_recv:接收包总量

> errin:接收错误次数

> errout:发送错误次数

> dropin:接收丢包次数

> dropout:发送丢包次数

测试代码:

import psutil
conns = psutil.net_connections()
for conn in conns:
    print conn

输出:

sconn(fd=37, family=2, type=1, laddr=('127.0.0.1', 38280), raddr=(), status='LISTEN', pid=88102)
sconn(fd=41, family=2, type=1, laddr=('127.0.0.1', 35145), raddr=(), status='LISTEN', pid=88102)
sconn(fd=26, family=2, type=1, laddr=('127.0.0.1', 55499), raddr=(), status='LISTEN', pid=88102)
sconn(fd=5, family=2, type=1, laddr=('0.0.0.0', 6379), raddr=(), status='LISTEN', pid=808)
sconn(fd=24, family=2, type=1, laddr=('127.0.0.1', 33292), raddr=(), status='LISTEN', pid=88102)
sconn(fd=8, family=2, type=1, laddr=('0.0.0.0', 111), raddr=(), status='LISTEN', pid=531)
sconn(fd=28, family=2, type=1, laddr=('127.0.0.1', 48689), raddr=(), status='LISTEN', pid=88102)
sconn(fd=5, family=2, type=1, laddr=('127.0.1.1', 53), raddr=(), status='LISTEN', pid=817)
sconn(fd=39, family=2, type=1, laddr=('127.0.0.1', 55286), raddr=(), status='LISTEN', pid=88102)
sconn(fd=30, family=2, type=1, laddr=('127.0.0.1', 49398), raddr=(), status='LISTEN', pid=88102)
...

相关的名词解释:

> fd:文件描述

> family:参数代表地址家族,可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址,AF_UNIX家族用于同一台机器上的进程间通信

> type:参数代表套接字类型,可为SOCK_STREAM(流套接字)和SOCK_DGRAM(数据报套接字)

> laddr:laddr表示本机地址

> raddr:raddr表示远程地址

> status:套接字状态

> pid:进程识别号

用户部分

测试代码:

import psutil
users = psutil.users()
for user in users:
    print user

输出:

suser(name='shixin', terminal=':0', host=':0', started=1435191680.0)
suser(name='shixin', terminal='pts/5', host=':0', started=1435904768.0)
suser(name='shixin', terminal='pts/7', host=':0', started=1435977216.0)

相关的名词解释:

> pts:为用户打开的伪终端或虚拟终端

posted @ 2016-07-07 21:59  4Thing  阅读(1421)  评论(0编辑  收藏  举报