python模块之psutil

一、模块安装

1、简介

psutil是一个跨平台库(http://pythonhosted.org/psutil/)能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息。
它主要用来做系统监控,性能分析,进程管理。它实现了同等命令行工具提供的功能:
如ps、top、lsof、netstat、ifconfigwhodfkillfreenice、ionice、iostat、iotop、uptimepidof、tty、taskset、pmap等。
目前支持32位和64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统.

 

2、安装

CentOS安装psutil包:
python版本:3.5
 
wget https://pypi.python.org/packages/source/p/psutil/psutil-3.2.1.tar.gz --no-check-certificate
tar zxvf psutil-3.2.1.tar.gz
cd psutil-3.2.1
python setup.py install



Windows安装:
pip3.exe install psutil

 

二、获取系统基本信息的使用

1、CPU

使用cpu_times方法获取cpu的完整信息,如下所示:
>>> import psutil
>>> psutil.cpu_times()
scputimes(user=26712.69, nice=6.59, system=16096.79, idle=23242025.75, iowait=37.75, irq=0.0, softirq=568.43, steal=0.0, guest=0.0, guest_nice=0.0)




获取单个数据,如用户的cpu时或io等待时间,如下所示:
>>> psutil.cpu_times().user
26712.98

>>> psutil.cpu_times().iowait
37.75




获取cpu逻辑和物理个数,默认logical值为True:
#CPU逻辑个数
>>> psutil.cpu_count()
6

#CPU物理个数
>>> psutil.cpu_count(logical=False)
2




获取cpu的使用率:
>>> psutil.cpu_percent()
0.2

>>> psutil.cpu_percent(1)
0.0

 

2、内存信息

内存信息的获取主要使用virtual_memory方法。swap使用就用swap_memory方法。

>>> MEM = psutil.virtual_memory()
>>> MEM
svmem(total=4136796160L, available=3620245504L, percent=12.5, used=1297555456L, free=2839240704L, active=627490816, inactive=404381696, buffers=974848L, cached=780029952)

>>> MEM.total
4136796160L

>>> MEM.used
1297555456L

>>> MEM.free
2839240704L

#也可以格式化一下单位: M
>>> print(MEM.free/1024/1024)
2707



其中percent表示实际已经使用的内存占比。available表示还可以使用的内存。

 

3、磁盘信息

磁盘信息主要有两部分,一个是磁盘的利用率,另一个是io,他们分别可以通过disk_usage和disk_io_counters方法获取。

如下先获取分区信息,然后看下根分区的使用情况:
>>> psutil.disk_partitions()
[sdiskpart(device='/dev/mapper/centos-root', mountpoint='/', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota'), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,relatime,attr2,inode64,noquota')]

>>> psutil.disk_usage('/')
sdiskusage(total=304470978560, used=46186463232, free=258284515328, percent=15.2)




默认disk_io_counters方法获取的是硬盘总的io数和读写信息,如果需要获取单个分区的io和读写信息加上"perdisk=True"参数。

>>> psutil.disk_io_counters()
sdiskio(read_count=22311, write_count=2684382, read_bytes=871543808, write_bytes=24955394048, read_time=133691, write_time=41573396)

>>> psutil.disk_io_counters(perdisk=True)
{'fd0': sdiskio(read_count=1, write_count=0, read_bytes=4096, write_bytes=0, read_time=64, write_time=0), 'sr0': sdiskio(read_count=11, write_count=0, read_bytes=45056, write_bytes=0, 
read_time=79, write_time=0), 
'sda2': sdiskio(read_count=10925, write_count=1253459, read_bytes=424309760, write_bytes=12476611584, read_time=63902, write_time=18987876), 'sda1': sdiskio(read_count=297, 
write_count=2073, read_bytes=23391232, write_bytes=2179072, read_time=617, write_time=354), 'dm-0': sdiskio(read_count=10948, write_count=1428852, read_bytes=422695936, 
write_bytes=12476611584, read_time=68948, write_time=22585166), 'dm-1': sdiskio(read_count=129, write_count=0, read_bytes=1097728, write_bytes=0, read_time=81, write_time=0)}

 

4、网络信息

网络io和磁盘io使用方法差不多,主要使用net_io_counters方法,如果需要获取单个网卡的io信息,加上pernic=True参数。


#获取网络总的io情况
>>> psutil.net_io_counters()
snetio(bytes_sent=3297791475, bytes_recv=1389796856, packets_sent=8756507, packets_recv=16250143, errin=0, errout=0, dropin=776532, dropout=0)

#获取网卡的io情况
>>> psutil.net_io_counters(pernic=True)
{'lo': snetio(bytes_sent=4706567, bytes_recv=4706567, packets_sent=71051, packets_recv=71051, errin=0, errout=0, dropin=0, dropout=0), 'ens192': snetio(bytes_sent=3293097784, 
bytes_recv=1385095182, packets_sent=8685489, packets_recv=16179153, errin=0, errout=0, dropin=776535, dropout=0)}

 

5、其他系统信息

1.获取开机时间
#以linux时间格式返回,可以使用时间戳转换
>>> psutil.boot_time()
1560134542.0

>>> import datetime
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H: %M: %S")
'2019-06-10 10: 42: 22'




2.查看系统全部进程
>>> psutil.pids()
[1, 2, 3, 4, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21, 22, 23, 24, 26, 27, 28, 29, 30, 32, 33, 34, 35, 36, 38, 39, 40, 41, 42, 44, 45, 46, 47, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 
61, 62, 65, 115, 118, 119, 120, 121, 122, 123, 125, 138, 361, 362, 363, 364, 365, 366, 367, 368, 370, 371, 453, 462, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 562, 582, 
590, 678, 698, 699, 700, 701, 702, 703, 704, 705, 729, 747, 748, 752, 753, 759, 763, 767, 769, 788, 827, 828, 866, 1001, 1003, 1009, 1010, 1011, 1025, 1116, 1124, 1125, 1126, 1127, 
1128, 1409, 1411, 1459, 2221, 2329, 2330, 2331, 2332, 2334, 2335, 2337, 2338, 2339, 2340, 2920, 2967, 3043, 4002, 4255, 4257, 4283, 4284, 4300, 4547, 4677, 5304, 5307, 5871, 
6189, 6252, 6529, 6559, 6560, 6588, 10618, 10622, 10629, 10631, 20556, 21194, 24406, 25219, 28097]




3.查看单个进程
p = psutil.Process(10631)

p.name()      #进程名

p.exe()         #进程的bin路径

p.cwd()        #进程的工作目录绝对路径

p.status()     #进程状态

p.create_time()  #进程创建时间

p.uids()      #进程uid信息

p.gids()      #进程的gid信息

p.cpu_times()    #进程的cpu时间信息,包括user,system两个cpu信息

p.cpu_affinity()  #get进程cpu亲和度,如果要设置cpu亲和度,将cpu号作为参考就好

p.memory_percent()  #进程内存利用率

p.memory_info()    #进程内存rss,vms信息

p.io_counters()    #进程的IO信息,包括读写IO数字及参数

p.connectios()    #返回进程列表

p.num_threads()  #进程开启的线程数

psutil的Popen方法启动应用程序,可以跟踪程序的相关信息
from subprocess import PIPE
p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE)
p.name()
p.username()

 

6、 查看系统硬件脚本

#!/usr/bin/env python
#coding:utf-8

import psutil
import datetime
import time

# 当前时间
now_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time()))
print(now_time)

# 查看cpu物理个数的信息
print(u"物理CPU个数: %s" % psutil.cpu_count(logical=False))

#CPU的使用率
cpu = (str(psutil.cpu_percent(1))) + '%'
print(u"cup使用率: %s" % cpu)

#查看内存信息,剩余内存.free  总共.total
#round()函数方法为返回浮点数x的四舍五入值。

free = str(round(psutil.virtual_memory().free / (1024.0 * 1024.0 * 1024.0), 2))
total = str(round(psutil.virtual_memory().total / (1024.0 * 1024.0 * 1024.0), 2))
memory = int(psutil.virtual_memory().total - psutil.virtual_memory().free) / float(psutil.virtual_memory().total)
print(u"物理内存: %s G" % total)
print(u"剩余物理内存: %s G" % free)
print(u"物理内存使用率: %s %%" % int(memory * 100))
# 系统启动时间
print(u"系统启动时间: %s" % datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S"))

# 系统用户
users_count = len(psutil.users())
#
# >>> for u in psutil.users():
# ...   print(u)
# ...
# suser(name='root', terminal='pts/0', host='61.135.18.162', started=1505483904.0)
# suser(name='root', terminal='pts/5', host='61.135.18.162', started=1505469056.0)
# >>> u.name
# 'root'
# >>> u.terminal
# 'pts/5'
# >>> u.host
# '61.135.18.162'
# >>> u.started
# 1505469056.0
# >>>

users_list = ",".join([u.name for u in psutil.users()])
print(u"当前有%s个用户,分别是 %s" % (users_count, users_list))

#网卡,可以得到网卡属性,连接数,当前流量等信息
net = psutil.net_io_counters()
bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024)
bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024)
print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent))

io = psutil.disk_partitions()
# print(io)
# print("io[-1]为",io[-1])
#del io[-1]

print('-----------------------------磁盘信息---------------------------------------')

print("系统磁盘信息:" + str(io))

for i in io:
    o = psutil.disk_usage(i.device)
    print("总容量:" + str(int(o.total / (1024.0 * 1024.0 * 1024.0))) + "G")
    print("已用容量:" + str(int(o.used / (1024.0 * 1024.0 * 1024.0))) + "G")
    print("可用容量:" + str(int(o.free / (1024.0 * 1024.0 * 1024.0))) + "G")

print('-----------------------------进程信息-------------------------------------')
# 查看系统全部进程
for pnum in psutil.pids():
    p = psutil.Process(pnum)
    print(u"进程名 %-20s  内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " \
    % (p.name(), p.memory_percent(), p.status(), p.create_time()))

posted @ 2019-07-25 10:00  米兰的小铁將  阅读(621)  评论(0编辑  收藏  举报