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:为用户打开的伪终端或虚拟终端