我是python的新手。所以请忍受我:)
我想编写一个脚本,该脚本将检查系统的CPU使用率,并且在超过阈值的情况下,应该将线程转储以及其他详细信息一起使用。 我已经在python中编写了一个脚本,如下所示,并使用“ vmstat”命令查看了用户周期和系统周期。 如果这两个值合计超过阈值,我将进行线程转储。
while True:
output = subprocess.check_output("vmstat|tail -1", shell=True).decode('utf-8');
m = re.search(r"(\d+)\s+(\d+)\s+(\d+)\s+\d+\s+\d+$", output)
print('US', int(m.group(1)))
print('SY', int(m.group(2)))
# us: Time spent running non-kernel code. (user time, including nice time)
# sy: Time spent running kernel code. (system time)
usage=int(m.group(1))+int(m.group(2))
if usage>CPU:
...
else
print "cpu usage is below threshold"
但是问题是我得到了相同的值
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
US 1
SY 0
cpu usage is below threshold
如果同时在另一个控制台中运行“ vmstat”命令,则可以看到“ US”和“ SY”参数的不同值-
我认为subprocess.check_output(..)仅运行一次“ vmstat”进程。 我们可以以某种方式使它每次运行吗?
答案 0 :(得分:3)
您的Python没问题,除了else
之后缺少分号。
要查看发生了什么问题,请先确保系统忙。在其他终端窗口中启动占用大量CPU的命令,例如:
yes | wc -c
如果您没有备用的终端窗口,请在后台像这样启动它:
yes | wc -c &
该命令正在运行时,执行vmstat 1 5
并看到它表明系统正在使用CPU。
现在运行您的程序告诉Python执行的命令:
vmstat|tail -1
重复几次。这将告诉您为什么您的程序总是显示相同的数字。这是因为没有参数的vmstat
总是显示相同的数字。
嗯,从技术上讲,这并不完全正确,它并不总是显示相同的值。这些值可以随时间缓慢变化。真正发生的是(从vmstat
手册页复制):
vmstat
报告有关进程,内存,页面调度,块IO,陷阱,磁盘和cpu活动的信息。产生的第一个报告给出了自上次重启以来的平均值。
如果您的系统已经运行了一段时间,那么将需要大量的活动来更改第一行显示的平均值。
要修复,请更改您的Python程序以运行vmstat 1 2|tail -1
。 (您自己运行几次,以检查它是否显示了您想要显示的内容。)显然,累积和发出最新数据需要花一秒钟的时间,但是对于该程序而言,这可能是可以接受的。根据您希望监视的敏感程度,您甚至可能希望告诉vmstat
在更长的时间内进行采样。
别忘了杀死在后台或其他终端上运行的CPU浪费。