最近,我一直在使用一个集群监控工具(ganglia),它可以聚合/proc/*
每台机器上的系统指标。
- 数据是如何
/proc/*
收集的?
谁在那里写入数据?数据多久更新一次? - 我可以调整它的收集方式以使其更准确吗?
答案1
http://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html
/proc 非常特别,因为它也是一个虚拟文件系统。它有时被称为进程信息伪文件系统。它不包含“真实”文件,而是包含运行时系统信息(例如系统内存、安装的设备、硬件配置等)。因此,它可以被视为内核的控制和信息中心。事实上,相当多的系统实用程序只是调用该目录中的文件。例如,“lsmod”与“cat /proc/modules”相同,而“lspci”是“cat /proc/pci”的同义词。通过更改此目录中的文件,您甚至可以在系统运行时读取/更改内核参数 (sysctl)。
换句话说,这是直接来自内核/等的实时信息,而不是定期更新的文件。
答案2
里面的数据/proc
根本没有更新。它是按需生成的。
当您读取/proc
(或实际上读取任何文件)时,您正在调用内核。如果您正在读取“真实”文件,内核将(根据缓存、权限等)遍历文件系统并检索您请求的数据。如果您正在读取/proc
“文件”,内核将即时生成相关数据。
这项技术已经变得相当流行,并且现在广泛应用于文件系统的不同领域。例如,/sys
虚拟文件系统从架构的角度来看,它非常相似/proc
,尽管内容完全不同。在现代系统上,您可能会发现这/dev
也是虚拟文件系统,因为否则要使文件/dev
与硬件实际情况保持同步是相当痛苦的。一些用户层服务通过以下方式提供自己的虚拟文件系统保险丝。
答案3
中的文件/proc
大多作为设备驱动程序实现。它们的实现方式基本上与串行设备 ( /dev/ttyS*
) 类似,只不过程序员不是从硬件返回数据,而是返回其程序生成的数据。
在某种程度上,它类似于网络服务器。只是,文件不是侦听 TCP 套接字并响应,而是/proc
侦听读取请求并响应的设备驱动程序。
Unix 内核驱动程序的设计中没有强制设备节点只能安装在,/dev
因此人们借此机会开发和标准化目录/proc
以包含返回一些运行时信息的虚拟设备。如今,Linux 内核包含专门的方法来处理/proc
驱动程序。
这是一篇有关设备驱动程序的文章,其中包含驱动程序示例/proc
:http://www.linuxdevcenter.com/pub/a/linux/2007/07/05/devhelloworld-a-simple-introduction-to-device-drivers-under-linux.html