若是你须要经过 Python 代码来监控服务器资源信息,好比内容占用状况、cpu 资源消耗以及资源不足发送警报等,那么这篇文章很适合你。python
香香的口味,你吃过没?
辣辣的感受,你尝过没?
网爆红人的歌声,你听过没?
Python 系统资源信息获取的工具,你用过没?
真正的烤面筋
可带劲啦!~~~
让你吃到真正的实惠!
不同的滋味!!!
复制代码
致敬那个不屈的男人(面筋哥 程书林)git
psutil(process and system utilities)是一个跨平台的库,github、官方文档github
咱们能够用它来查看系统运行进程以及资源利用率。它主要用于系统监控、过程资源分析和限制以及运行过程的管理。psutil 的主要功能结构以下图所示缓存
它有三大功能模块,分别是 System related function、Processes 和 Windows Service。bash
psutil 实现了UNIX命令行工具提供的许多功能,好比 top、free、netstat、kill 等,而且还兼容各大操做系统:服务器
咱们能够一边翻阅 psutil 的官方文档,一边编写代码,这样就可以更快的学习。微信
在 Python 环境下安装,直接使用 pip 命令便可:网络
pip install psutil
复制代码
可是,若是你只但愿当前用户可用,而不是整个系统全部用户都能使用,你就须要调整你的命令:数据结构
pip install -user psutil
复制代码
除此以外,它还提供了如 wget、curl 等多种安装方式,具体可参阅文档的 install 部分,可是一般来讲 pip install psutil
命令已经知足咱们的需求了。运维
它为咱们提供了一些系统经常使用的操做内容 可参阅文档。其中包括了 CPU、内存、磁盘、网络、传感器和进程等方面。
能够经过 cpu_times 模块对 cpu 资源进行查看,好比:
>>> import psutil
>>> psutil.cpu_times()
scputimes(user=477.29, nice=0.0, system=262.86, idle=6074.83)
复制代码
cpu_times 中的参数有哪些含义呢?文档中也给出了具体的释义
翻译一下,咱们能够看到它给使用者提供了比较细致的信息监控:
将系统CPU时间做为命名元组返回。每一个属性表示CPU在给定模式下花费的秒数。属性可用性因平台而异:
user:正常进程在用户模式下执行所花费的时间; 在Linux上,这还包括访客时间
system:在内核模式下执行的进程所花费的时间
闲置:无所事事的时间
特定于平台的字段:
nice (UNIX):在用户模式下执行的niced(优先级)进程所花费的时间; 在Linux上,这还包括guest_nice时间
iowait (Linux):等待I / O完成所花费的时间
irq (Linux,BSD):服务硬件中断所花费的时间
softirq (Linux):服务软件中断所花费的时间
steal (Linux 2.6.11+):在虚拟化环境中运行的其余操做系统所花费的时间
guest (Linux 2.6.24+):在Linux内核的控制下为客户操做系统运行虚拟CPU所花费的时间
guest_nice (Linux 3.2.0+):运行niced guest虚拟机所花费的时间(Linux内核控制下的来宾操做系统的虚拟CPU)
interrupt (Windows):服务硬件中断所花费的时间(相似于UNIX上的“irq”)
dpc (Windows):服务延迟过程调用(DPC)所花费的时间;DPC是以比标准中断低的优先级运行的中断。
复制代码
往下看还能够看到其余的 cpu 监控模块,好比咱们最须要的 cpu 资源消耗百分比,cpu_percent(interval=None, percpu=False) 能够返回一个浮点数,表示当前系统范围的CPU利用率百分比。当interval为> 0.0比较间隔以前和以后通过的系统CPU时间(阻塞)。当interval是0.0或None比较自上次调用或模块导入后通过的系统CPU时间,当即返回。这意味着第一次调用它将返回一个无心义的0.0 值,你应该忽略它。在这种状况下,建议0.1在调用之间至少调用此函数的准确性。当percpu是True返回表示利用率的浮点数列表,以每一个CPU的百分比表示。列表的第一个元素是指第一个CPU,第二个元素是第二个CPU,依此类推。列表的顺序在调用之间是一致的。
而经过 cpu_count() 能够查看 cpu 核心数量,它能够返回系统中 cpu 的数量(与 os.cpu_count 的返回相同)
我电脑的 cpu 是 i3 ,可是获得的 cpu 是 4(应该获得的是2) ,为何呢?
cpu_count() 返回的是 cpu 逻辑数量,物理数量得加上参数cpu_count(logical = True ) 运行获得的 cpu 数量为 2,也就是咱们常说的双核四线程。
若是咱们但愿获得相似于 top 命令的使用率排行,那咱们应该如何作呢?鉴于前面学习的 cpu_percent 咱们来尝试一下:
psutil.cpu_percent(interval=3, percpu=True)
复制代码
其中的 interval 表明比较间隔以前和以后通过的系统CPU时间,也就是比较 3 秒间隔中 cpu 的占用率
若是要实现排行,那么就须要不少的记录,意味着咱们能够尝试经过 for 循环来实现(此处将时间间隔设为 1 便可):
固然,这仅仅只是将信息输出了 10 次,若是要进行排行,那么还须要其余的处理。
上图是我电脑的资源信息截图,结合截图来看,咱们经过代码获取的系统资源信息仍是比较可信的
关于 cpu 信息获取的其余知识,请翻阅 psutil 官方文档的 cpu 部分,接下来要学习内存的信息获取了。
virtual_memory()将有关系统内存使用状况的统计信息做为命名元组返回,包括以字节表示的如下字段。主要指标:
总计:总物理内存。
可用:能够在没有系统进入交换的状况下当即提供给进程的内存。这是经过根据平台对不一样的内存值求和来计算的,而且它应该用于以跨平台方式监视实际内存使用状况。
其余指标:
used:使用的内存,根据平台的不一样计算,仅供参考。总计 - 免费不必定匹配使用。
free:内存不被使用(归零),随时可用; 请注意,这并不反映可用的实际内存( 请改用)。总计 - 使用不必定与免费匹配 。
active (UNIX):当前正在使用或最近使用的内存,所以它在RAM中。
inactive (UNIX):标记为未使用的内存。
buffers (Linux,BSD):缓存文件系统元数据之类的东西。
cached (Linux,BSD):缓存各类事物。
shared (Linux,BSD):可由多个进程同时访问的内存。
slab (Linux):内核数据结构缓存。
wired (BSD,macOS):标记为始终保留在RAM中的内存。它永远不会移动到磁盘。
复制代码
固然,咱们并不会关注太细致的内存信息,只须要获取内容总量、当前可用量或者当前已用量等信息便可。
如今有这么一个需求,当监控到内存不足 300M 的时候经过代码发出警告信息,咱们能够将需求简化为:内存不足、发出提示
固然,上面的代码并不可以真正的给咱们发出警告,由于它只是向你表达它可以作到的事。若是须要作到监控,还须要编写更多的代码、设计更好的处理逻辑。
swap_memory() 将系统交换内存统计信息做为命名元组返回:
total:总交换内存(以字节为单位)
used:以字节为单位使用的swap内存
free:以字节为单位的自由交换内存
percent:计算的百分比使用率(total - available) / total * 100
sin:系统从磁盘交换的字节数(累计)
sout:系统从磁盘换出的字节数(累计)
复制代码
不过正常状态下,咱们用得并很少,由于它并非返回系统全部的内存资源信息,而是交换内存的统计信息。
进程信息文档定位,进程信息也是咱们比较关注的方面,psutil.pids() 能够返回当前运行的PID列表,例如:
>>> psutil.pids()
[1, 2, 3, 5, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 18, 19, ..., 32498]
复制代码
文档中有一个比较有意思的介绍
咱们能够按名称过滤进程信息,为何说他有意思呢?
好比咱们能够经过记录 Python 的进程信息、内存资源信息、cpu 资源信息,来分析咱们所写的 Python 代码在服务器上的资源占用状况。咱们尝试筛选出 Python 相关的 pid:
>>> [p.info for p in psutil.process_iter(attrs=['pid', 'name']) if 'python' in p.info['name']]
[{'name': 'python3.6', 'pid': 1447}]
>>>
复制代码
pid 1447 的这个进程,正好是我在控制台中演示代码时,启动的 Python 进程。
好了,关于 psutil 的简单介绍就到这里,感受好像没有学到什么高大上的知识?感受轻轻略过了一遍,并无留下什么深入映像?
由于做者也是这么认为的,可是这并不妨碍咱们脑中的骚思路
可能下一回,咱们就会经过 psutil 实现一个服务器资源监控和比对的工具,好比这样的:
有可能很完善,可是也有可能不须要那么多功能。
学习更多 Python、爬虫以及深度学习相关的知识,能够关注微信公众号【进击的Coder】,和大佬一块儿 Coding 共同进步。
请在评论区为 面筋哥-程书林打 call