/proc 文件系统和 ProcMeter
/proc 文件系统是 Linux 的一部分,大多数人没有深入研究过它——甚至可能从未听说过。像内核本身一样,它是 Linux 系统的重要组成部分。然而,它的内容和功能对大多数用户来说仍然是一个谜。如果说内核是操作系统的“大脑”,那么 /proc 文件系统就是它的“个人组织者”。
在本文中,我将描述 /proc 文件系统——它是什么,以及如何使用它。本文还描述了 ProcMeter 程序,该程序使用 /proc 文件系统来显示有用的信息。
首先,/proc 文件系统不是真正的文件系统;它是一个虚拟文件系统,没有磁盘或磁带那样的物理存在。您最常用的文件系统是磁盘上的文件集合。磁盘存储数据,不考虑含义,而文件系统(例如,Linux ext2fs 系统)使数据有意义。文件系统将数据组织为用户可用的目录和文件。另一个常见的文件系统是网络文件系统 (NFS),它使远程计算机上的文件可访问。
所有文件系统都由 Linux 内核管理,内核将设备上的数据映射为可用形式。访问文件系统的用户级程序不需要知道数据实际存储的方式或位置。当程序从文件读取时,内核会操作相应的设备以获取数据。当程序访问 /proc 文件之一时,没有设备;相反,内核从其内部状态提供信息。这些文件仅在有程序实际查看它们时才存在。
/proc 文件系统是 Linux 从其 Unix 祖先之一继承的功能。流行的 Unix 主要有两种方言:System V 和 BSD。这两者的历史在这里并不重要,除了 System V 包含 /proc,而 BSD 不包含。
Linux 中正在发生的一切。每个正在运行的程序、内存的全部内容、内核的内部工作原理——系统上当前运行的所有进程都包含在 /proc 文件系统中。proc 是 process(进程)的缩写。
/proc 中最有趣的文件列举如下。此列表是从内核版本 1.2.13 编译的;其他版本会有所不同。 这不是一个完整的列表,但仅包含那些内容对普通浏览者显而易见的文件。有关文件的完整描述可以在 Linux 内核源代码中阅读——这不是一项轻松的任务。
/proc 的内容完全取决于处理器架构。(例如,文件 /proc/cpuinfo 仅适用于 ix86 处理器。)内核必须与之通信的不同类型的硬件也可能添加文件(例如,PCI 总线计算机上的 /proc/pci)。还有一些文件是否存在取决于编译了哪些内核选项。(我的 /proc/modules 是空的,因为我没有编译模块支持。)
cpuinfo 包含内核在启动时建立的关于处理器的信息,例如,处理器类型,包括变体和功能。
kcore 包含内核看到的整个 RAM 内容。
loadavg 包含过去 1、5 和 15 分钟的系统负载平均值,以及当前运行的进程数和进程总数。
meminfo 包含有关内存使用情况的信息,可用 RAM 和交换空间有多少在使用,以及内核如何使用它们。
stat 包含系统统计信息,内核对基本系统资源的使用量计数。
uptime 包含系统已运行的时间(以秒为单位),以及系统空闲的时间量。
version 包含内核版本信息,其中列出了版本号、编译时间和编译者。
net/ 是包含网络信息的目录。
net/dev 包含编译到内核中的网络设备列表。对于每个设备,都有关于已发送和接收的数据包数量的统计信息。
net/route 包含用于在网络上路由数据包的路由表。
net/snmp 包含关于网络协议更高层次的统计信息。
self/ 包含关于当前进程的信息。内容与下面描述的每个进程的信息相同。
pid/ 包含关于进程号 pid 的信息。内核为每个进程维护一个包含进程信息的目录。
pid/cmdline 包含用于启动进程的命令(使用空字符分隔参数)。
pid/cwd 包含指向进程当前工作目录的链接。
pid/environ 包含进程可用的环境变量列表。
pid/exe 包含指向进程中正在运行的程序的链接。
pid/fd/ 是一个目录,其中包含指向进程已打开的每个文件的链接。
pid/mem 包含进程的内存内容。
pid/stat 包含进程状态信息。
pid/statm 包含进程内存使用情况信息。
您可以自己查看这些文件的内容。只需输入
cat /proc/meminfo
您将看到类似这样的内容
total: used: free: shared: buffers: Mem: 11423744 8753152 2670592 2670592 2764800 Swap: 25800704 5328896 20471808此表显示了您有多少内存、您正在使用的内存量以及内存的使用方式。
大多数人在不知不觉中都在使用 /proc。程序 top、ps、free 及其同类都使用 /proc。它们提供的信息直接取自 /proc 并格式化以进行显示。
将 /proc/meminfo 文件的内容(上文)与命令 free 的输出进行比较,该命令的输出如下所示
total used free shared buffers Mem: 11156 8680 2476 2724 2800 Swap: 25196 5204 19992
如您所见,此表只是 /proc/meminfo 内容的格式化版本。
ps 程序的输出都可以在 /proc 中找到;所有信息都存储在每个进程的目录中。其中大部分只需要为用户合理地格式化即可。
ProcMeter 是一个监视存储在 /proc 中的信息的程序。信息以多个图形显示。每个图形都显示系统的一个方面。该程序仅在 Linux 上的 X Windows 下运行。
任何使用过 xload、xmeter 或 perfmeter 的人都将认出此描述。不同之处在于这些程序使用与系统无关的方法来获取数据,而 ProcMeter 从一开始就是为 Linux 设计的。当 ProcMeter 使用 /proc 时,它占用的内存最少,并且占用的 CPU 时间可以忽略不计。一旦使用了 /proc,其他获取数据的想法就会涌现出来。查看上面的 /proc 表,我们可以看到有很多有用的信息可用。
ProcMeter 中可用的统计信息可以自然地分为多个类别。
进程——关于系统的基本信息,系统的繁忙程度和负载程度。CPU 的处理能力在所有正在运行的进程和内核之间分配,其余时间处于空闲状态。
cpu | 是 CPU 使用的总百分比。 |
cpu-user | 是用户进程使用的 CPU 百分比。 |
cpu-nice | 是 nice(低优先级)进程使用的 CPU 百分比。 |
cpu-sys | 是内核使用的 CPU 百分比。 |
cpu-idle | 是 CPU 未使用的百分比(与 CPU 相反)。 |
load | 是系统负载,即过去一分钟内平均运行的进程数。 |
proc | 是系统上存在的进程数。 |
context | 是每秒进程之间的上下文切换次数。 |
内存(真实和虚拟)——内存是一种宝贵的资源(尤其是在家庭用户的小型 PC 上),因此跟踪内存非常重要。Unix 系统的优点是虚拟内存(交换空间)的使用是透明的。透明,也就是说,直到您的计算机发出像咖啡研磨机一样的声音,并且程序开始爬行——这是一个确定的迹象,表明您已用完真实内存,并且生活在虚拟内存中。
mem-free | 是可用 RAM 的数量。 |
mem-used | 是已用 RAM 的数量。 |
mem-buff | 是用于文件缓冲区的 RAM 量。 |
mem-cache | 是用作缓存内存的 RAM 量(内核版本 2.0)。 |
mem-swap | 是正在使用的磁盘上的交换空间量(RAM 的不足)。 |
swap | 是交换量(swap-in 和 swap-out 的总和)。 |
swap-in | 是每秒从磁盘换入的内存页数。 |
swap-out | 是每秒换出到磁盘的内存页数。 |
硬件——操作系统运行的硬件通常是性能瓶颈。硬件生成的每个中断都必须由内核处理。磁盘驱动器是另一种慢速设备,也必须受到控制。
page | 是分页量(page-in 和 page-out 的总和)。 |
page-in | 是每秒从磁盘读入的内存页数。 |
page-out | 是每秒写入磁盘的内存页数。 |
disk | 是每秒磁盘访问次数。 |
intr | 是每秒中断 (IRQ) 次数。 |
网络——在网络上运行时,处理流量可能会对系统性能产生相当大的影响。到达的每个数据包都必须及时处理,从而导致硬件中断和内核 CPU 使用率。
我有一个 ProcMeter 窗口永久打开,占据屏幕的右边缘。大多数时候它只是占用空间,但在某些时候它可能非常有用。
当通过 FTP 从 Internet 获取文件时,可以监视发送和接收的数据包数量。当数据包停止到达时,传输已完成或卡住。这是一个 ping FTP 站点以查看路由是否仍然打开的好时机。
您是否曾经觉得您刚刚编写的程序运行时间太长?这可能是 RAM 耗尽并使用交换空间的症状。尝试查看 mem-used、mem-free、mem-swap 和 swap 图形。陡峭上升的图形将指示内存泄漏。
Andrew Bishop 使用 Linux 已经 2 年了。ProcMeter 的原始版本是他使用 Linux 编写的第一个程序。他主要在 Unix 系统上用 C、Perl 和 Emacs Lisp 编程,经常在他前进的过程中发明自己的轮子。可以通过电子邮件 ambi@gedanken.demon.co.uk 与他联系。