用于获取 Linux 机器的 CPU 使用率的 SNMP 调用最终是否只读取 /proc/stat 文件?
答案1
叹息1.幸运的是,你不需要/proc/stat
/proc/loadavg
该文件中的前三个字段是平均负载数字,分别给出 1、5 和 15 分钟内平均运行队列中的作业数(状态 R)或等待磁盘 I/O 数(状态 D)。 它们与 uptime(1) 和其他程序给出的平均负载数字相同。 第四个字段由两个数字组成,中间用斜线 (/) 隔开。第一个数字是当前可运行的内核调度实体(进程、线程)的数量。斜线后面的值是系统中当前存在的内核调度实体的数量。第五个字段是系统中最近创建的进程的 PID。
但你可能需要咨询来源http://www.net-snmp.org/确定他们实际使用的内容:
net-snmp-5.7.3/agent/mibgroup/ucd-snmp/loadave.c:
#elif defined(linux)
{
FILE *in = fopen("/proc/loadavg", "r");
if (!in) {
NETSNMP_LOGONCE((LOG_ERR, "snmpd: cannot open /proc/loadavg\n"));
return (-1);
}
脚注 1. 有时候你真的无法选择与谁一起工作。
再次回复您的评论,叹。由于只有内核知道自己在做什么,因此任何监控都需要以某种方式与内核交互才能检索此类信息。与内核交互的通用接口是/proc/
虽然也可以设计其他方法(auditd
并且kerneltap
想到了)。但这些方法根本就不是“更轻量”的……
总会有一定数量的观察者效应以及监测造成的影响。
唯一零影响的方法是根本不进行任何监控。然后负责传呼的人可以声称,由于没有观察到警报,系统也没有崩溃。
我认为这是胜利!
答案2
HBrujin 对您的直接问题给出了答案,但这里要解决的实际问题值得进一步讨论。
您可能已经从目前的评论中看出,大多数人都对您同事的态度感到困惑。这是因为轮询系统信息相当普遍。除了直接调用库来轮询内核(使用编译语言)外,获取内核状态的唯一方法是从或/proc
轮询它。/proc
/sys
大多数系统自动化都是通过高级语言编写脚本来实现的。其中一些将提供库包装器,从而避免从中读取信息/proc
,但 shell 脚本根本无法做到这一点。这直接违背了您的同事在上面的评论中强调的立场,“反对意见通常是从 /proc 读取”。
你的同事被误导了,需要放下这个顾虑。如果其他人被迫按照这些标准行事,他们无法完成工作。整个互联网上的实践经验都对他们不利。唯一会相信这些胡言乱语的人是那些不懂行的经理。