/proc 文件系统和 ProcMeter

作者:Andrew M. Bishop

/proc 文件系统是 Linux 的一部分,大多数人没有深入研究过它——甚至可能从未听说过。像内核本身一样,它是 Linux 系统的重要组成部分。然而,它的内容和功能对大多数用户来说仍然是一个谜。如果说内核是操作系统的“大脑”,那么 /proc 文件系统就是它的“个人组织者”。

在本文中,我将描述 /proc 文件系统——它是什么,以及如何使用它。本文还描述了 ProcMeter 程序,该程序使用 /proc 文件系统来显示有用的信息。

什么是 /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 是空的,因为我没有编译模块支持。)

/proc 中的一些常用文件
  • 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。程序 toppsfree 及其同类都使用 /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?

ProcMeter 是一个监视存储在 /proc 中的信息的程序。信息以多个图形显示。每个图形都显示系统的一个方面。该程序仅在 Linux 上的 X Windows 下运行。

任何使用过 xloadxmeterperfmeter 的人都将认出此描述。不同之处在于这些程序使用与系统无关的方法来获取数据,而 ProcMeter 从一开始就是为 Linux 设计的。当 ProcMeter 使用 /proc 时,它占用的内存最少,并且占用的 CPU 时间可以忽略不计。一旦使用了 /proc,其他获取数据的想法就会涌现出来。查看上面的 /proc 表,我们可以看到有很多有用的信息可用。

ProcMeter 可以告诉我什么?

ProcMeter 中可用的统计信息可以自然地分为多个类别。

  1. 进程——关于系统的基本信息,系统的繁忙程度和负载程度。CPU 的处理能力在所有正在运行的进程和内核之间分配,其余时间处于空闲状态。

cpu

是 CPU 使用的总百分比。

cpu-user

是用户进程使用的 CPU 百分比。

cpu-nice

是 nice(低优先级)进程使用的 CPU 百分比。

cpu-sys

是内核使用的 CPU 百分比。

cpu-idle

是 CPU 未使用的百分比(与 CPU 相反)。

load

是系统负载,即过去一分钟内平均运行的进程数。

proc

是系统上存在的进程数。

context

是每秒进程之间的上下文切换次数。

  1. 内存(真实和虚拟)——内存是一种宝贵的资源(尤其是在家庭用户的小型 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

是每秒换出到磁盘的内存页数。

  1. 硬件——操作系统运行的硬件通常是性能瓶颈。硬件生成的每个中断都必须由内核处理。磁盘驱动器是另一种慢速设备,也必须受到控制。

page

是分页量(page-in 和 page-out 的总和)。

page-in

是每秒从磁盘读入的内存页数。

page-out

是每秒写入磁盘的内存页数。

disk

是每秒磁盘访问次数。

intr

是每秒中断 (IRQ) 次数。

  1. 网络——在网络上运行时,处理流量可能会对系统性能产生相当大的影响。到达的每个数据包都必须及时处理,从而导致硬件中断和内核 CPU 使用率。

lpkt

是本地接口(同一台机器)上的数据包数。

fpkt

是快速网络设备上的数据包总数。

fpkt-rx

是快速网络设备上接收的数据包数。

fpkt-tx

是快速网络设备上发送的数据包数。

spkt

是慢速网络设备上的数据包总数。

spkt-rx

是慢速网络设备上接收的数据包数。

spkt-tx

是慢速网络设备上发送的数据包数。

ProcMeter 如何提供帮助?

我有一个 ProcMeter 窗口永久打开,占据屏幕的右边缘。大多数时候它只是占用空间,但在某些时候它可能非常有用。

当通过 FTP 从 Internet 获取文件时,可以监视发送和接收的数据包数量。当数据包停止到达时,传输已完成或卡住。这是一个 ping FTP 站点以查看路由是否仍然打开的好时机。

您是否曾经觉得您刚刚编写的程序运行时间太长?这可能是 RAM 耗尽并使用交换空间的症状。尝试查看 mem-used、mem-free、mem-swap 和 swap 图形。陡峭上升的图形将指示内存泄漏。

在哪里获取 ProcMeter

ProcMeter 的最新版本是 2.1 版,可通过 FTP 从 sunsite.unc.edu 获取源代码。该文件名为 procmeter-2.1.tgz,位于目录 /pub/Linux/X11/xutils/status 中。或者,如果您有 WWW 访问权限,则可以在我的主页 http://www.gedanken.demon.co.uk/ 上找到有关 ProcMeter 的最新信息,以及指向该程序其他来源的链接。

图 1

图 2

Andrew Bishop 使用 Linux 已经 2 年了。ProcMeter 的原始版本是他使用 Linux 编写的第一个程序。他主要在 Unix 系统上用 C、Perl 和 Emacs Lisp 编程,经常在他前进的过程中发明自己的轮子。可以通过电子邮件 ambi@gedanken.demon.co.uk 与他联系。

加载 Disqus 评论