1.1 系统性能信息模块psutil

1.1 系统性能信息模块psutil

psutil是一个跨平台库,能够轻松实现获取系统运行的进程和系统利用率信息。它主要是应用于系统监控,分析和限制系统资源及进程的管理,它实现了同等命令行工具提供的功能。

>>> import psutil
>>> psutil.virtual_memory()
svmem(total=8184156160, available=6610153472, percent=19.2, used=1244897280, free=3709169664, active=2863775744, inactive=983326720, buffers=2134016, cached=3227955200, shared=15917056, slab=344432640)
>>> mem = psutil.virtual_memory()
>>> print(mem)
svmem(total=8184156160, available=6625705984, percent=19.0, used=1229377536, free=3724574720, active=2846990336, inactive=983355392, buffers=2134016, cached=3228069888, shared=15917056, slab=344645632)
>>> print(mem.total)
8184156160

1.1.1 获取系统性能信息
Linux的CPU利用率有以下几个部分:
user time: 执行用户进程的时间百分比
system time: 执行内核进程和终端的时间百分比
wait io: 由于IO等待而使CPU处于idle(空闲)状态的时间百分比
idle:CPU处于idle状态的时间百分比

(1)CPU信息

>>> import psutil
>>> psutil.cpu_times()  #获取CPU完整信息
scputimes(user=618.58, nice=41.44, system=307.79, idle=142080.4, iowait=18.77, irq=0.0, softirq=10.61, steal=0.0, guest=0.0, guest_nice=0.0)
>>> psutil.cpu_times().user  ¥获取单项数据信息,例如用户user的CPU时间比
618.93
>>> psutil.cpu_count()    #获取CPU的逻辑个数,默认logical=True4
8
>>> psutil.cpu_count(logical=False)  #获取CPU的物理个数
8

(2)内存信息
Linux系统的内存的利用率信息涉及total(内存总数),used(已使用的内存数),free(空闲内存数),buffers(缓冲使用数),cache(缓存使用数),sqap(交换分区使用数)等。

>>> import psutil
>>> mem = psutil.virtual_memory()  #获取内存完整信息,并存入变量mem
>>> mem
svmem(total=8184156160, available=6622851072, percent=19.1, used=1232232448, free=3719753728, active=2849816576, inactive=984956928, buffers=2134016, cached=3230035968, shared=15917056, slab=344829952)
>>> mem.total   #获取内存总数
8184156160
>>> mem.free  #获取空闲内存数
3719753728
>>> psutil.swap_memory()  #获取SWAP分区信息
sswap(total=3221221376, used=0, free=3221221376, percent=0.0, sin=0, sout=0)

(3)磁盘信息
读IO数:read_count
写IO数:write_count
IO读字节数:read_bytes
IO写字节数:write_bytes
磁盘读时间:read_time
磁盘写时间:write_time

>>> import psutil
>>> psutil.disk_partitions()  #获取磁盘完整信息
[sdiskpart(device='/dev/sda3', mountpoint='/', fstype='xfs', opts='rw,seclabel,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096), sdiskpart(device='/dev/sda1', mountpoint='/boot', fstype='xfs', opts='rw,seclabel,relatime,attr2,inode64,noquota', maxfile=255, maxpath=4096)]
>>> psutil.disk_usage('/')  #获取分区(参数)的使用情况
sdiskusage(total=28661407744, used=5996216320, free=22665191424, percent=20.9)
>>> psutil.disk_io_counters()  #获取硬盘总的IO个数,读写信息
sdiskio(read_count=33569, write_count=64587, read_bytes=935135744, write_bytes=2736269312, read_time=14209, write_time=30843, read_merged_count=80, write_merged_count=7844, busy_time=18540)
>>> psutil.disk_io_counters(perdisk=True)  #获取单个分区IO个数,读写信息
{'sda': sdiskio(read_count=33539, write_count=64601, read_bytes=934033920, write_bytes=2736373760, read_time=14174, write_time=30855, read_merged_count=80, write_merged_count=7848, busy_time=18516), 'sda1': sdiskio(read_count=1814, write_count=2087, read_bytes=11977216, write_bytes=12877312, read_time=176, write_time=190, read_merged_count=0, write_merged_count=3, busy_time=342), 'sda2': sdiskio(read_count=57, write_count=0, read_bytes=2285568, write_bytes=0, read_time=7, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=7), 'sda3': sdiskio(read_count=31638, write_count=62514, read_bytes=918697984, write_bytes=2723496448, read_time=13989, write_time=30665, read_merged_count=80, write_merged_count=7845, busy_time=18173), 'sr0': sdiskio(read_count=12, write_count=0, read_bytes=49152, write_bytes=0, read_time=11, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=11), 'sr1': sdiskio(read_count=18, write_count=0, read_bytes=1052672, write_bytes=0, read_time=24, write_time=0, read_merged_count=0, write_merged_count=0, busy_time=19)}

(4)网络信息
发送字节数: byter_sent
接受字节数:byter_recv
发送数据包数:packets_sent
接受数据包数:packets_recv

>>> psutil.net_io_counters()  #获取网络总的IO信息,默认pernic=False
snetio(bytes_sent=20628918, bytes_recv=1123313159, packets_sent=339979, packets_recv=851621, errin=0, errout=0, dropin=0, dropout=0)
>>> psutil.net_io_counters(pernic=True)  #输出每个网络接口的IO信息
{'lo': snetio(bytes_sent=352, bytes_recv=352, packets_sent=4, packets_recv=4, errin=0, errout=0, dropin=0, dropout=0), 'virbr0-nic': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'virbr0': snetio(bytes_sent=0, bytes_recv=0, packets_sent=0, packets_recv=0, errin=0, errout=0, dropin=0, dropout=0), 'ens33': snetio(bytes_sent=20628566, bytes_recv=1123314307, packets_sent=339975, packets_recv=851642, errin=0, errout=0, dropin=0, dropout=0)}

(5)其他系统信息
还支持获取用户等率,开机,时间等信息

>>> import psutil
>>> psutil.users()  #返回当前登录系统的用户信息
[suser(name='manekl', terminal=':0', host='localhost', started=1636339328.0, pid=10547), suser(name='manekl', terminal='pts/0', host='localhost', started=1636339328.0, pid=11607)]
>>> import datetime
>>> psutil.boot_time()  #获取开机时间,以Linux时间戳格式返回
1636341195.0
>>> datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")  #转换成自然时间格式
'2021-11-07 19:13:15'

1.1.2 系统进程管理方法
获取当前系统的进程信息,可以让运维人员得知应用程序的运行状态,为问题定位提供很好的数据参考
(1)进程信息
获取所有进程PID:psutil.pids()
获取单个进程的各种信息:psutil.Process()

>>> import psutil
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29, 31, 32, 33, 34, 36, 37, 38, 39, 41, 42, 43, 44, 46, 48, 49, 50, 51, 52, 53, 54, 55, 56, 62, 63, 64, 65, 73, 75, 76, 78, 79, 81, 94, 95, 130, 144, 283, 284, 287, 293, 294, 296, 297, 298, 299, 302, 303, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 419, 443, 454, 486, 577, 578, 579, 580, 581, 582, 583, 584, 634, 636, 6]
>>> p = psutil.Process(1)
>>> p.name()
'systemd'
>>> p.exe()
'/usr/lib/systemd/systemd'
>>> p.cwd()
'/'
>>> p.status()
'sleeping'
>>> p.create_time()
1636341195.05
>>> p.uids()
puids(real=0, effective=0, saved=0)
>>> p.gids()
pgids(real=0, effective=0, saved=0)
>>> p.cpu_times()
pcputimes(user=0.67, system=4.5, children_user=35.65, children_system=39.67, iowait=0.07)
>>> p.cpu_affinity()
[0, 1, 2, 3, 4, 5, 6, 7]
>>> p.memory+percent()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Process' object has no attribute 'memory'
>>> p.memory_percent()
0.08968587422457003
>>> p.memory_info()
pmem(rss=7340032, vms=198631424, shared=4235264, text=1441792, lib=0, data=153952256, dirty=0)
>>> p.io_counters()
pio(read_count=2066246, write_count=214550, read_bytes=336731648, write_bytes=89939968, read_chars=1137880808, write_chars=891194721)
>>> p.connections()
[]
>>> p.num_threads()
1

(2).popen类的使用
psutil提供的popen类的作用是获取用户启动的应用程序进程信息,以便跟踪程序进程的运行状态,具体实现方法如下

>>> import psutil
>>> from subprocess import PIPE  #通过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时间
pcputimes(user=0/01,system=0.0400000000001)
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值