psutil-获取系统性能信息模块
内容目录:
- 简介
- psutil模块
-
安装
-
基本使用
-
获取系统总内存和使用内存
-
获取主机cpu核数和物理cpu个数
-
获取磁盘信息
-
获取网络信息
-
获取用户登录信息
-
获取系统开机时间
-
获取系统进程信息
-
简介
psutil 是一个垮平台库,能够轻松实现获取系统运行的进程和系统利用率(CPU、内存、磁盘、网络等)信息。通过它实现率同等命令行工具提供的功能,ps、top、lsof、netstat、ifconfig、who、df、kill、free、nice、ionice、iostat、iotop、uptime、pidof、tty、taskset、pmap等。支持32位及64位的Linux、Windows、OS X、FreeBSD和Sun Solaris等操作系统,2.4以上的python版本。
psutil使用
1、源码安装步骤
wget https://pypi.python.org/packages/source/p/psutil/psutil-2.0.0.tar.gz tar zxf psutil-2.0.0.tar.gz cd psutil-2.0.0 python setup.py install
2、基本使用
psutil获取内存等信息大小单位一般都采用字节方式
1)获取系统总内存和使用内存
mem = psutil.virtual_memory() #内存总信息 mem.total #总内存 8589934592L mem.used #系统使用内存 6736408576L psutil.swap_memory() #swap总信息 sswap(total=3221225472L, used=1972371456L, free=1248854016L, percent=61.2, sin=54952632320L, sout=3776888832L)
2)获取主机cpu核数和物理cpu个数
import psutil psutil.cpu_count() #cpu逻辑个数 4 psutil.cpu_count(logical=False) #cpu物理个数 2
3)获取磁盘信息
在系统的所有磁盘中我们关注的笔调多的是磁盘的使用率和io信息,磁盘的利用率可以用psutil.disk_usage方法获取。磁盘的IO信息可以通过psutil.disk_io_counters()获取,其中io信息包括
read_count:读io数
write_count:写io数
read_bytes:IO读字节数
write_byte:IO写字节数
read_time:磁盘读时间
write_time:磁盘写时间
>>> psutil.disk_partitions() #获取磁盘分区读写信息等 [sdiskpart(device='/dev/vda1', mountpoint='/', fstype='ext4', opts='rw,relatime,data=ordered')] >>> >>> psutil.disk_usage('/') #获取根目录磁盘使用情况,参数为路径path sdiskusage(total=120108089344, used=108555464704, free=11290480640, percent=90.4) >>> >>> psutil.disk_io_counters() #获取硬盘总的io个数、读写信息 sdiskio(read_count=4699627L, write_count=2000421L, read_bytes=98468618240L, write_bytes=66542867456L, read_time=2026157L, write_time=612921L) >>> psutil.disk_io_counters(perdisk=True) #perdisk=True参数获取单个分区IO个数、读写信息 {'disk0': sdiskio(read_count=4700548L, write_count=2001237L, read_bytes=98479378432L, write_bytes=66562835456L, read_time=2026586L, write_time=613130L)} >>>
4)获取网络信息
系统网络信息与磁盘io类似,获取的各个字段数据含义
bytes_sent:发送字节数
bytes_recv:接收字节数
packets_sent:发送数据包数
packets_recv:接收数据包数
>>> psutil.net_io_counters()#网络进出数据总IO信息 snetio(bytes_sent=745142254L, bytes_recv=4592756042L, packets_sent=4926867L, packets_recv=5772501L, errin=0L, errout=0L, dropin=0L, dropout=0) >>> psutil.net_io_counters().bytes_sent 745202707L >>> psutil.net_io_counters(pernic=True) #输出单个网口的IO信息 {'gif0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'utun0': snetio(bytes_sent=268L, bytes_recv=0L, packets_sent=3L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'bridge0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'en0': snetio(bytes_sent=711968154L, bytes_recv=4560084221L, packets_sent=4457290L, packets_recv=5303595L, errin=0L, errout=0L, dropin=0L, dropout=0), 'en1': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'lo0': snetio(bytes_sent=33112941L, bytes_recv=33112941L, packets_sent=469278L, packets_recv=469278L, errin=0L, errout=0L, dropin=0L, dropout=0), 'utun1': snetio(bytes_sent=77994L, bytes_recv=94413L, packets_sent=759L, packets_recv=416L, errin=0L, errout=0L, dropin=0L, dropout=0), 'p2p0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'stf0': snetio(bytes_sent=0L, bytes_recv=0L, packets_sent=0L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0), 'awdl0': snetio(bytes_sent=72716L, bytes_recv=0L, packets_sent=325L, packets_recv=0L, errin=0L, errout=0L, dropin=0L, dropout=0)} >>>
5)获取用户登录信息
>>> psutil.users() [suser(name='user1', terminal='console', host=None, started=1522855040.0)]
6)获取系统开机时间
>>> psutil.boot_time() #返回系统系统开机时间戳 1522855040.0 >>> import datetime >>> datetime.datetime.fromtimestamp(psutil.boot_time ()).strftime("%Y-%m-%d %H:%M:%S") #转换为标准格式 '2018-04-04 23:17:20'
7)获取系统进程信息
通过获取的进程信息可以知道应用程序的运行状态,包括进程的启动时间、查看或设置cpu亲和度、内存使用率、IO信息、socket链接、线程数等,这些信息可以呈现出指定进程是否存活、资源利用情况。
- 进程信息
使用psutil.pids()方法获取所有的进程PID,使用psutil.Process()方法可以获取单个进程的名称、路径、状态、系统资源利用率等。
>>> import psutil >>> psutil.pids() [1, 2, 3, 5, 7, 8, 9, 10, 12, 13, 14, 15, 16, 17, 18, 19, 25, 26, 27, 28, 36, 38, 39, 40, 59, 91, 224, 233, 234, 235, 236, 239, 248, 259, 260, 327, 346, 431, 443, 466, 468, 471, 472, 477, 483, 490, 760, 823, 1069, 1074, 1104, 1303, 1332, 1487, 4966, 6312, 7600, 7804, 8015, 11557, 11559, 11560, 11561, 11562, 11563, 11573, 11597, 11785, 12058, 22552, 22554, 22638, 22642, 22654, 22706, 22823, 22825, 22842, 22847, 22849, 22875, 22899, 22933, 22934, 22937, 22954, 22956, 22976, 31834] >>> psutil.Process(11557) psutil.Process(pid=11557, name='php-fpm', started='2018-03-07 09:33:03') >>> 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() #进程开启的线程数
- popen类的使用
psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态。
>>> import psutil >>> from subprocess import PIPE #通过psutil 的Popen方法启动的应用程序,可以跟踪该程序运行的所有相关信息 >>> p = psutil.Popen(["/usr/bin/python", "-c", "print('hello')"],stdout=PIPE) >>> p.name() 'python' >>> p.username() 'root' >>> p.communicate() ('hello\n', None) >>> p.cpu_times() #获得进程运行的cpu时间