proc 文件系统是 Linux 的优秀特性之一,本文向您详细讲述了它的一些最实用的基础知识。使用 /proc,您再也不用关闭并重新引导机器来管理操作系统的许多细
节问题,这对那些要求系统的可用性尽可能高的管理员来说非常有用。
任何管理过具有商业重要性的系统的人都知道计算机正常运行时间的价值 — 或者反过来讲,知道用户因故障时间会给您带来诸多头痛问题。公司采用 UNIX 服务器
的主要原因之一是由于它的可靠性和稳定性。如果仔细管理,通常可以很长时间不
需重启这些服务器。为了做到尽善尽美,您可以实时执行一些管理任务,甚至是内
核这一级别的任务,从而保持服务器的可用性。虽然因升级硬件或因某人踢掉电源
线而仍需要重启系统,但了解到许多管理任务可以在不干扰服务的情况下执行,总
是有益的。
本文提供了不需要重新引导就能够执行关于各种管理任务和更改系统的提示和技巧。Linux 提供了各种方法,用以在保持系统正常运行的情况下,更改底层操作系统
的值和设置。这些方法有两种基本形式,一种形式对于所有 Linux 系统都是通用的
,并在 Linux 内核中提供这一形式,还有一种形式是各分发版所独有的,并且由供应商提供。不说了,先介绍一关于proc的入门级别的东西,然后再介绍高级应用。
一般来说对于需要大量cpu计算的进程,当前端压力越大时,CPU利用率越高。但对于I/O网络密集型的进程,即使请求很多,服务器的CPU也不一定很到,这时的服务瓶颈一般是在磁盘的I/O上。比较长见的就是,大文件频繁读写的cpu开销远小于小文件频繁读写的开销。因为在I/O吞吐量一定时,小文件的读写更加频繁,需要更多的cpu来处理I/O的中断。
在Linux/Unix下,CPU利用率分为用户态,系统态和空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间。平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间 / CPU总的执行时间。
在Linux的内核中,有一个全局变量:Jiffies。 Jiffies代表时间。它的单位随硬件平台的不同而不同。系统里定义了一个常数HZ,代表每秒种最小时间间隔的数目。这样jiffies的单位就是1/HZ。Intel平台jiffies的单位是1/100秒,这就是系统所能分辨的最小时间间隔了。每个CPU时间片,Jiffies都要加1。 CPU的利用率就是用执行用户态+系统态的Jiffies除以总的Jifffies来表示。内核一般通过jiffies值来获取当前时间。尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期(uptime),所以也是可行的。驱动程序利用jiffies的当前值来计算不同事件间的时间间隔。 硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍)。Linux内核从2.5版内核开始把频率从100调高到1000(当然带来了很多优点,也有一些缺点).jiffies是内核中的一个全局变量,用来记录自系统启动一来产生的节拍数。譬如,如果计算系统运行了多长时间,可以用 jiffies/tick rate 来计算。
在Linux系统中,可以用/proc/stat文件来计算cpu的利用率(详细的解释可参考:
http://www.linuxhowtos.org/System/procstat.htm
)。这个文件包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前时刻。
重点介绍以下几种:
1> /proc/loadavg:包含系统负载平均值;
2>/proc/meminfo:包含存储管理统计量;
3> /proc/net/dev:包含网卡度量;
4> /proc/stat:包含内核统计量;
5> /proc/uptime:包含总的系统正常工作时间及空闲时间。
每个文件提供的值的数量是不同的。这些文件的完整有效值列表如下。
1 /proc/loadavg提供以下数据:
1分钟平均负载;
5分钟平均负载;
15分钟平均负载;
分子是内核正在运行的进程数,分母是存在系统中的进程总数;最后是最近运行的进程ID实例:
[root@jiangtao proc]# cat loadavg
0.02 0.43 0.33 2/221 2643
2 /proc/meminfo提供的存储器信息包括:
总存储器;
总的自由存储器
缓冲存储器;
高速缓冲存储器;
交换高速缓冲存储器;
活动存储器;
不活动存储器;
总的自由存储器;
总的高位存储器;
自由高位存储器;
总的低位存储器;
自由低位存储器;
共享存储器;
交换存储器;
交换自由存储器;
总存储器;等等
[root@jiangtao proc]# cat meminfo
MemTotal: 515064 kB
MemFree: 32836 kB
Buffers: 10540 kB
Cached: 283808 kB
SwapCached: 0 kB
Active: 354964 kB
Inactive: 95456 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 515064 kB
LowFree: 32836 kB
SwapTotal: 1085644 kB
SwapFree: 1085644 kB
Dirty: 16 kB
Writeback: 0 kB
AnonPages: 156080 kB
Mapped: 58440 kB
Slab: 20528 kB
SReclaimable: 6464 kB
SUnreclaim: 14064 kB
PageTables: 4660 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
CommitLimit: 1343176 kB
Committed_AS: 687232 kB
VmallocTotal: 503800 kB
VmallocUsed: 3028 kB
VmallocChunk: 500560 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
3/proc/net/dev中包括每个网卡的如下数据:
接收到的字节;
接收到的压缩字节;
收到的误码数;
收到的漏失误码;
收到的FIFO误码;
收到的帧误码;
收到的多播误码;
收到的总包数;
已传输的字节;
已传输的压缩字节;
传输误码总数;
传输载波误码;
传输冲突误码;
传输漏失误码;
传输FIFO误码;
传输的总包数。
[root@jiangtao proc]# cat net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast |bytes packets errs drop fifo colls carrier compressed
lo: 72960 1456 0 0 0 0 0 0 72960 1456 0 0 0 0 0 0
eth0: 127853 880 0 0 0 0 0 0 68647 629 0 0 0 0 0 0
4 /proc/stat提供:
[root@jiangtao proc]# cat stat
cpu 5212 0 5256 136811 11216 18 226 0 0
cpu0 5212 0 5256 136811 11216 18 226 0 0
intr 24845 275 53 0 1 1 0 4 0 1 0 0 0 784 0 0 3272 0 18091 1491 872 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
ctxt 165330
btime 1227138761
processes 2710
procs_running 2
procs_blocked 2
user (5212) 从系统启动开始累计到当前时刻,用户态的CPU时间(单位:jiffies) ,不包含 nice值为负进程。1jiffies=0.01秒
nice (0) 从系统启动开始累计到当前时刻,nice值为负的进程所占用的CPU时间(单位:jiffies)
system (5256) 从系统启动开始累计到当前时刻,核心时间(单位:jiffies)
idle (136811) 从系统启动开始累计到当前时刻,除硬盘IO等待时间以外其它等待时间(单位:jiffies)
iowait (11216) 从系统启动开始累计到当前时刻,硬盘IO等待时间(单位:jiffies) ,
irq (18) 从系统启动开始累计到当前时刻,硬中断时间(单位:jiffies)
softirq (5346) 从系统启动开始累计到当前时刻,软中断时间(单位:jiffies)
“intr”这行给出中断的信息,第一个为自系统启动以来,发生的所有的中断的次数;然后每个数对应一个特定的中断自系统启动以来所发生的次数。
“ctxt”给出了自系统启动以来CPU发生的上下文交换的次数。
“btime”给出了从系统启动到现在为止的时间,单位为秒。
“processes (total_forks) 自系统启动以来所创建的任务的个数目。
“procs_running”:当前运行队列的任务的数目。
“procs_blocked”:当前被阻塞的任务的数目。
4 /proc/uptime中包括:
系统总工作时间;
系统总空闲时间。
实例:
[root@jiangtao proc]# cat uptime
3066.50 2798.32
值得注意的是,每次某个/proc被读时,一个句柄函数都被内核或特有模块调用,来产生数据。数据在运行中产生,不管是读一个字符还是一个大的字块,整个文件都将被重建。这对效率是至关重要的一点,因为使用/proc的任何系统监控器将吞下整个文件,而不是一点一点地处理它
cat /proc/cpuinfo (显示CPU资讯)
cat /proc/interrupts (中断)
cat /proc/ioports (设备IO Ports)
cat /proc/partitions (显示所有partitions)
cat /proc/pci (pci设备资料)
cat /proc/swaps (显示Swap资讯)
cat /proc/version (显示Linux版本)
cat /proc/net/sockstat(显示网络套接字)
cat /proc/sys/fs/file-max(显示系统所有运行程序能同时打开文件的最大数)
显示进程信息,为进程标识符,用可以用“ps -e”命令查看
Linux下可以在/proc/cpuinfo中看到每个cpu的详细信息。
但是对于双核的cpu,在cpuinfo中会看到两个cpu。常常会让人误以为是两个单核的cpu。
其实应该通过Physical Processor ID来区分单核和双核。而Physical Processor ID可以从cpuinfo或者dmesg中找到
例如
[root@jiangtao]dmesg | grep CPU | grep ID
CPU0: Initial APIC ID: 0, Physical Processor ID: 0
CPU1: Initial APIC ID: 1, Physical Processor ID: 0
CPU2: Initial APIC ID: 6, Physical Processor ID: 3
CPU3: Initial APIC ID: 7, Physical Processor ID: 3
可以看到,这台机器有两个双核的CPU,ID分别是0和3.这只是简单的应用。随着介绍就复杂点。当然,至于把proc介绍完美,不是本文所能及的。
现在以及入门了,我们介绍一些高级应用。
一 更改运行中的内核的参数
ls -l /proc/
dr-xr-xr-x 138 root root 0 11-20 07:52 proc
注意大小为0!!!!!!/proc虚拟文件系统(也叫procfs)是Unix操作系统所使用的虚拟文件系统的Linux实现。在/proc开始时,它以一个标准文件系统出现,并包含与正在运行的进程IDs同样名字的文件。然而,在/proc中的文件不占用磁盘空间,它们存在于工作存储器(内存)中。/proc最初的目的是便于进程信息的存取,
Linux 向管理员提供了非常好的方法,使他们可以在系统运行时更改内核,而不需要重新引导内核/系统。这是通过 /proc 虚拟文件系统实现的。proc 文件系统主要可以让您查看运行中的内核,这一点对于监控性能、查找系统信息、了解系统是如何配置的以及更改该配置很有用。该文件系统被称为虚拟文件系统,因为它实际上根本不是一个文件系统。它只是内核提供的一个映射,被附加在通常的文件系统结构之上,从而使
您能够访问它。我们可以采用某种方法在系统正常运行的同时更改运行中的内核的参数,这一事实赋予了系统管理员在更改内核设置方面强大的能力和高的灵活性。这种实现是出自部分 Linux 内核开发人员富有灵感的想法。但能力太大会是一件坏事吗?有时确实如此。如果准备更改 /proc 文件系统中的任何内容,您必须确保自己知道在更改什以及这会对系统产生什么影响。这些技术确实有用,但错误的举动会带来完全不希望得到的结果。如果您不熟悉这方面的内容,或者不确定您所做的某项更改会带来什么影响,那么请在一台对您或您公司不重要的机器上进行实践。本人就曾崩溃过。
《一》如何更改呢?
首先,考虑怎样做不会对内核进行更改。有两条充分的理由说明了为什么不能直接切换至 /proc 文件系统,用文本编辑器打开一个文件,做一系列更改,然后保存该文件,再退出。这两条理由是:
1>数据完整性:所有这些文件描述了运行中的系统,由于内核可以随时更改这些文的任何一个,因此如果打开一个编辑器,然后更改某些数据,而同时,系统也正
在底层更改这些数据,那么无论您保存下来的任何内容都不可能是内核所期望的内
容。
2>虚拟文件:所有这些文件实际上都不存在。如何使保存的数据同步,等等?
所以,解决办法是,不使用编辑器来更改任何这些文件。每当更改 /proc 文件系统
中的任何内容时,应该使用 echo 命令,然后从命令行将输出重定向至 /proc 下所
选定的文件中。例如:
echo 1> /proc/sys/net/ipv4/icmp_echo_ignore_all.
《二》更改什么
要很好地使用 /proc 不需要您是一位内核方面的高手,只需基本了解这个文件系统的结构就可以极大地帮助您。直到有一天用户向您询问某些特定的功能,使您很高
兴曾下功夫了解过在哪里进行更改,您才可能会觉得有必要知道关于 /proc 中的任
何事情。在这方面,/proc 文件系统通过其结构和文件许可权帮助系统管理员。
/proc 中的每个文件都有一组分配给它的非常特殊的文件许可权,并且每个文件属
于特定的用户标识。这一点实现得非常仔细,从而提供给管理员和用户正确的功能
。下面这个列表汇总了各个文件上有哪些特定的许可权:
只读:任何用户都不能更改该文件;它用于表示系统信息
root 写:如果 /proc 中的某个文件是可写的,则通常只能由 root 用户来写
root 读:有些文件对一般系统用户是不可见的,而只对 root 用户是可见的
其它:出于各种原因,您可能会看到不同于上面常见的三种许可权的组合
关于 /proc,您会发现最通常的情况是,它的大多数文件是只读的,除了 /proc/sys 目录。该目录下存放着大多数的内核参数(而不是信息),并且设计成可以在系统运行的同时进行更改。因此这个目录是本文的主旨所在。
就更改 /proc 中什么内容而言,要了解的最后一点是,应该向这些文件实际写些什
么。当查看 /proc 中各种文件时,会发现其中一些文件对我们来说是可读的,一些
文件是数据文件。通过用特定的实用程序(譬如 top、lspci 和 free),这些数据
文件仍然也可读。您还会注意到,对我们来说可读文件有两种不同格式:一些是二
进制开关,另一些包含其它信息。二进制开关文件只包含代表特定内核功能的 0(
关)或 1(开)。
《三》进行更改
详细介绍有关 /proc 中每个文件的用法和确切信息超出了本文所涉及的范围。要获
得任何关于本文没有涉及到的 /proc 文件的其它信息,一个最佳来源就是 Linux
内核源代码本身,它包含了一些非常优秀的文档。对于系统管理员,/proc 中的以
下文件较有用。这不意味着它是一份详尽的说明,而只是日常使用中便于查阅的参
考。
/proc/scsi
/proc/scsi/scsi
作为系统管理员,需要了解的最有用内容是,在有热交换驱动器情况下,如何不重
启系统就可以添加更多磁盘空间。假使不使用 /proc,您可以插入驱动器,但为了
使系统识别新磁盘,必须随即重新引导系统。这里,可以用以下命令来使系统识别
新的驱动器:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
一旦将磁盘添加到系统中之后,可以挂装任何先前已格式化的文件系统,也可以开始对它进行格式化等。例如,如果不确定磁盘是什么设备,或者想检查任何先前已
有的分区,则可以用如 fdisk -l 这样的命令来向您报告这方面的信息。
相反的,在不重新引导系统的情况下将设备从系统中除去的命令是:
echo "scsi remove-single-device x y z u" > /proc/scsi/scsi
在输入这条命令并将热交换 SCSI 磁盘从系统中除去之前,请确保首先卸下已从该
磁盘安装的任何文件系统。
x是硬盘所在SCSI控制器号(一般机器就一个SCSI控制器,所以就是0);
y是硬盘所在SCSI通道的编号(一般单通道的就是0,多通道的要看是哪个通道了);
z是硬盘的SCSI ID号(可以通过具体插入的硬盘插槽来判断);
u是硬盘的lun号(默认情况都是0)
/proc/sys/fs/
/proc/sys/fs/file-max
该文件指定了可以分配的文件句柄的最大数目。如果用户得到的错误消息声明由于
打开文件数已经达到了最大值,从而他们不能打开更多文件,则可能需要增加该值
。可将这个值设置成有任意多个文件,并且能通过将一个新数字值写入该文件来更
改该值。
缺省设置:50554
/proc/sys/fs/file-nr
该文件与 file-max 相关,它有三个值:
已分配文件句柄的数目;
已使用文件句柄的数目;
文件句柄的最大数目;
实例:
[root@jiangtao proc]# cat sys/fs/file-nr
4544 0 50544
该文件是只读的,仅用于显示信息。
/proc/sys/fs/inode-*
任何以名称"inode"开头的文件所执行的操作与上面那些以名称"file"开头的文件所
执行的操作一样,但所执行的操作与索引节点有关,而与文件句柄无关。
/proc/sys/fs/overflowuid 和 /proc/sys/fs/overflowgid
这两个文件分别保存那些支持 16 位用户标识和组标识的任何文件系统的用户标识
(UID)和组标识(GID)。可以更改这些值,但如果您确实觉得需要这样做,那么
您可能会发现更改组和密码文件项更容易些。
缺省设置:65534
/proc/sys/fs/super-max
文件指定超级块处理程序的最大数目。挂装的任何文件系统需要使用超级块,所
以如果挂装了大量文件系统,则可能会用尽超级块处理程序。
缺省设置:256
/proc/sys/fs/super-nr
该文件显示当前已分配超级块的数目。该文件是只读的,仅用于显示信息。
/proc/sys/kernel
/proc/sys/kernel/acct
该文件有三个可配置值,根据包含日志的文件系统上可用空间的数量(以百分比表
示),这些值控制何时开始进行进程记帐:
如果可用空间低于这个百分比值,则停止进程记帐
如果可用空间高于这个百分比值,则开始进程记帐
检查上面两个值的频率(以秒为单位)
要更改这个文件的某个值,应该回送用空格分隔开的一串数字。
缺省设置:2 4 30
如果包含日志的文件系统上只有少于 2% 的可用空间,则这些值会使记帐停止,如
果有 4% 或更多可用空间,则再次启动记帐。每 30 秒做一次检查。
/proc/sys/kernel/ctrl-alt-del
该文件有一个二进制值,该值控制系统在接收到 ctrl+alt+delete 按键组合时如何
反应。这两个值表示:
零(0)值表示捕获 ctrl+alt+delete,并将其送至 init 程序。这将允许系统可以
完美地关闭和重启,就好象您输入 shutdown 命令一样。
壹(1)值表示不捕获 ctrl+alt+delete,将执行非干净的关闭,就好象直接关闭电
源一样。
缺省设置:0
/proc/sys/kernel/domainname
该文件允许您配置网络域名。它没有缺省值,也许已经设置了域名,也许没有设置
。
/proc/sys/kernel/hostname
该文件允许您配置网络主机名。它没有缺省值,也许已经设置了主机名,也许没有
设置。
/proc/sys/kernel/msgmax
该文件指定了从一个进程发送到另一个进程的消息的最大长度。进程间的消息传递
是在内核的内存中进行,不会交换到磁盘上,所以如果增加该值,则将增加操作系
统所使用的内存数量。
缺省设置:8192
/proc/sys/kernel/msgmnb
该文件指定在一个消息队列中最大的字节数。
缺省设置:16384
/proc/sys/kernel/msgmni
该文件指定消息队列标识的最大数目。
缺省设置:16
/proc/sys/kernel/panic
该文件表示如果发生"内核严重错误(kernel panic)",则内核在重新引导之前等
待的时间(以秒为单位)。零(0)秒设置在发生内核严重错误时将禁止重新引导。
/proc/sys/kernel/panic
该文件表示如果发生“内核严重错误(kernel panic)”,则内核在重新引导之前等待的时间(以秒为单位)。
零(0)秒,表示在发生内核严重错误时将禁止自动重新引导。
缺省设置:0