Linux下proc文件系统详解/proc/

“proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某些参数。”

这里将介绍如何从/proc文件系统中获取与防火墙相关的一些性能参数,以及如何通过/proc文件系统修改内核的相关配置。

1、从/proc文件系统获取相关的性能参数

cpu使用率:/proc/stat

内存使用情况: /proc/meminfo

网络负载信息:/proc/net/dev

相应的计算方法:(摘自:什么是proc文件系统)

(1) 处理器使用率

(2) 内存使用率

(3) 流入流出数据包

(4) 整体网络负载

这些数据分别要从/proc/stat、/proc/net/dev、/proc/meminfo三个文件中提取。如里有问题或对要提取的数据不太清楚,可以使用man proc来查看proc文件系统的联机手册。

(1) 处理器使用率

这里要从/proc/stat中提取四个数据:用户模式(user)、低优先级的用户模式(nice)、内核模式(system)以及空闲的处理器时间(idle)。它们均位于/proc/stat文件的第一行。CPU的利用率使用如下公式来计算。

CPU利用率 = 100 *(user + nice + system)/(user + nice + system + idle)

(2) 内存使用率

这里需要从/proc/meminfo文件中提取两个数据,当前内存的使用量(cmem)以及内存总量(amem)。

内存使用百分比 = 100 * (cmem / umem)

(3)网络利用率

为了得到网络利用率的相关数据,需要从/proc/net/dev文件中获得两个数据:从本机输出的数据包数,流入本机的数据包数。它们都位于这个文件的第四行。

性能收集程序开始记录下这两个数据的初始值,以后每次获得这个值后均减去这个初始值即为从集群启动开始从本节点通过的数据包。

利用上述数据计算出网络的平均负载,方法如下:

平均网络负载 = (输出的数据包+流入的数据包) / 2

2. 通过/proc文件系统调整相关的内核配置

允许ip转发 /proc/sys/net/ipv4/ip_forward

禁止ping/proc/sys/net/ipv4/icmp_echo_ignore_all

可以在命令行下直接往上述两个“文件”里头写入”1″来实现相关配置,如果写入”0″将取消相关配置。不过在系统重启以后,这些配置将恢复默认设置,所以,如果想让这些修改生效,可以把下面的配置直接写入/etc/profile文件,或者其他随系统启动而执行的程序文件中。

1. echo 1 > /proc/sys/net/ipv4/ip_forward
2. echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

如果需要获取其他的性能参数,或者需要对内核进行更多的配置,可以参考proc文件系统介绍,也可以直接通过man proc查看相关的信息。

========================================================
Proc是一个虚拟文件系统,在Linux系统中它被挂载于/proc目录之上。Proc有多个功能 ,这其中包括用户可以通过它访问内核信息或用于排错,这其中一个非常有 用的功能,也是Linux变得更加特别的功能就是以文本流的形式来访问进程信息。很Linux命令(比如 ps、toPpstree等)都需要使用这个文件系统的信息。
本文就是向用户介绍一些访问这些信息的方法 。需要说明的是,本文所述的内容并不 一定适用所有内核版本,有部分操作只适用于2.6内核。
一、进程信息
在/proc文件系统中,每一个进程都有一个相应的文件 。下面是/proc目录下的一些重要文件 :
/proc/pid/cmdline 包含了用于开始进程的命令 ;
/proc/pid/cwd包含了当前进程工作目录的一个链接 ;
/proc/pid/environ 包含了可用进程环境变量的列表 ;
/proc/pid/exe 包含了正在进程中运行的程序链接;
/proc/pid/fd/ 这个目录包含了进程打开的每一个文件的链接;
/proc/pid/mem 包含了进程在内存中的内容;
/proc/pid/stat包含了进程的状态信息;
/proc/pid/statm 包含了进程的内存使用信息。
下面是一些获取进程信息的例子:
◆ 假设现在要查看是否所有的进程都会做存储器清除工作。在/proc/pid/stat文件中的每一 个进程标识 (第8个属性)提供了有关进程的很多 “个人”信 息。这个信 息可以对每一个 进程标识进行。
0x00000002 Process being created
0x00000004 Exiting
0x00000008 Dead
0x00000040 Process using
superuser privflage
0x00000200 P rocess dumping core
0x00000400 Prooess received some signal
0x00000800 Process allocating memory
0x00001000 Killed due to out-of–memory condition
笔者从/usr/src/linux/include/linux/sched.h 中提取了这些信息。
◆ /proc/pid/fd/ 目录提供 了有关打开文件的信息。要查看被进程使用的输入文件,使用以下命令 :
# ls –l /proc/pid/fd/0
◆ 查看被进程使用socket,使用以下命令 :
#ls –l /proc/pid/fd|sed –n `/socket/{s/.*\[//;s/\]//p}`
有关这些socket的信息可以使用以下命令获取 :
# netstat –ae
◆ 要将命令行参数传递给任意进程,使用以下命令 :
~~cat /proc/pid/cmdline
◆ 要 获取某一进程父进程的ID号,使用以下命令:
#grep PPid/proc/pid/status
二、普通的系统信息
Proc包含了很多系统信息,这其中包括CPU负载、文件系统和网络配置 。下面是一些通过Proc查看和更改系统的例子:
◆ 获取可用系统内存的空间 :
# grep Free /proc/meminfo
◆ 自从系统最后一次启动后的系统统计可以从/proc/stat文件中获取 :
#grep processes /proc/stat
◆ 获知第 1、5和15分钟系统负载的平均值 :
#awk `{print “1 min:\t” $1 “\n5 min:\t” $2 “\n15 min:\t” $3` /proc/loadavg
◆ /proc/partitions可用于获取系统的分区信息 。
◆ /proc/net和/proc/sys/net可用于查看和更改重要的网络信息。比如,禁用ping命令,可以以 root身份运行以下命令 :
#echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all
如果要启用IP转发/IP伪装,使用以下命令 :
#echo 1> /proc/sys/net/ipv4/ip_forward
◆ 已经挂载的文件系统信息可以从/proc/mounts中检索。
◆ 要改变正在使用的主机名 ,使用以下命令:
# echo www.abc.corn >/proc/sys/kernel/hostname
◆ 要获取CPU信息,使用以下命令 :
# cat /proc/cpuinfo
◆ 要获知swap空间的使用情况 ,使用以下命令:
# cat /proc/swaps
◆ 获取系统的正常运行时间:
#cat /proc/uptime
◆ 列出由NFS共享的文件系统:
# cat /proc/fs/nfsd/exports
三、相关内核的信息
这是一个非常宽泛的主题,这里只介绍其中一小部分内容:
◆ 从正在运行的内核中获知内核的版本:
#cat /proc/version
◆ /proc/kmsg文件被作为内核日志信息源,它可以被作为一个系统信息调用的接口使用。
◆ /proc/kcore文件提供了以内核文件格式形式访问系统物理内存,并且可以被gdb用于检查任意内核数据结构的当前状态。如果装了源码,那么可以通过查看/usr/src/linux/Documentation/filesystems/proc.txt文件来获取更多的信息 。
从中可以看出来,Proc是一个非常不错的获取系统信息渠道。如果利用得好,则它对Linux系统的维护和管理能提供非常大的帮助。

from http://os.51cto.com/art/201001/177045.htm

发表评论?

1 条评论。

  1. 朋友,请问如何计算 proc/pid/stat cpu的使用百分比

发表评论