利用proc工具解决系统(solaris)问题

作者:Peter Baer Galvin


概述

许多系统管理员并未意识到到Solaris自己携带工具之多之强,他们碰到问题的
时候往往束手无策。本文将介绍proc工具以及如何利用它们帮你度过难关。

--------------------------------------------------------------------------

在过去几年里,贝尔实验室计算科学研究中心的专家们在一种称做Plan 9的实验
性质的操作系统上工作。Plan 9上几乎所有对象都做为文件对待,比如内核状态可以
通过观察、操作特定目录下的文件确定。这些文件是到内核的一个接口。由于所有对
象都做为文件对待,内核和应用程序都得到简化。比如,Plan 9上不再需要特殊的系
统调用去获取内核状态(kvm_*()),应用程序可以使用标准文件I/O系统调用访问内核
数据。

一名来自贝尔实验室的工程师加入到Sun的开发队伍中,创建了/proc文件系统以
及/usr/proc/bin下的工具集。在提供这种接口之前,所有需要访问内核状态数据的
程序(比如ps和top)必须针对不同操作系统发布版本重新编译,它们直接从内核中读
取数据(/dev/kmem),而那些关键数据所在的内核空间位置随不同操作系统发布版本
而不同。随着/proc的出现,应用程序(包括系统程序)有了统一的访问内核的静态接
口。本来proc工具集最初用于测试/proc文件系统接口,由于太多Sun公司内部员工喜
欢使用它们,最后导致Solaris正式提供proc工具集。

$ df -k
Filesystem kbytes used avail capacity Mounted on
/proc 0 0 0 0% /proc

/etc/rcS.d/S40standardmounts.sh启动脚本会mount /proc,之后系统和应用程序可
以使用/proc接口。一旦建立,/proc将包括系统中所有进程的状态信息。

$ ls -l /proc
total 168
dr-x--x--x 5 root root 736 Jan 15 17:00 0
dr-x--x--x 5 root root 736 Jan 15 17:00 1
dr-x--x--x 5 root root 736 Feb 25 11:13 10258
dr-x--x--x 5 root root 736 Jan 15 17:00 11
dr-x--x--x 5 jds staff 736 Mar 17 08:03 11892
dr-x--x--x 5 akane staff 736 Mar 17 08:32 12032
dr-x--x--x 5 cbertold staff 736 Mar 17 08:44 12098
dr-x--x--x 5 jkelly staff 736 Mar 17 08:56 12186
dr-x--x--x 5 root root 736 Mar 9 09:08 12522
dr-x--x--x 5 jds staff 736 Mar 9 09:08 12524
dr-x--x--x 5 root root 736 Mar 9 09:10 12540
dr-x--x--x 5 jds staff 736 Mar 9 09:10 12542
dr-x--x--x 5 spd staff 736 Mar 17 10:01 12547
dr-x--x--x 5 cbertold staff 736 Mar 17 10:03 12555
dr-x--x--x 5 root root 736 Mar 17 10:09 12597
dr-x--x--x 5 pbg staff 736 Mar 17 10:09 12599
dr-x--x--x 5 jds staff 736 Mar 17 10:19 12660
dr-x--x--x 5 pbg staff 736 Mar 17 10:25 12670
dr-x--x--x 5 root root 736 Jan 15 17:00 2
dr-x--x--x 5 root root 736 Jan 15 17:01 239
dr-x--x--x 5 root root 736 Jan 15 17:01 241
dr-x--x--x 5 root root 736 Feb 9 13:50 24515
dr-x--x--x 5 root root 736 Jan 15 17:00 3
dr-x--x--x 5 root root 736 Jan 15 17:01 307

/proc下每个数字子目录对应一个进程,子目录的属主是进程拥有者的UID,属组对应
进程拥有者的GID。于是,只有进程拥有者和root可以访问进程信息。

$ ls -l /proc/12599
total 3543
-rw------- 1 pbg staff 1794048 Mar 18 20:48 as
-r-------- 1 pbg staff 152 Mar 18 20:48 auxv
-r-------- 1 pbg staff 32 Mar 18 20:48 cred
--w------- 1 pbg staff 0 Mar 18 20:48 ctl
lr-x------ 1 pbg staff 0 Mar 18 20:48 cwd -> 
dr-x------ 2 pbg staff 1056 Mar 18 20:48 fd
-r--r--r-- 1 pbg staff 120 Mar 18 20:48 lpsinfo
-r-------- 1 pbg staff 912 Mar 18 20:48 lstatus
-r--r--r-- 1 pbg staff 536 Mar 18 20:48 lusage
dr-xr-xr-x 3 pbg staff 48 Mar 18 20:48 lwp
-r-------- 1 pbg staff 1728 Mar 18 20:48 map
dr-x------ 2 pbg staff 544 Mar 18 20:48 object
-r-------- 1 pbg staff 2048 Mar 18 20:48 pagedata
-r--r--r-- 1 pbg staff 336 Mar 18 20:48 psinfo
-r-------- 1 pbg staff 1728 Mar 18 20:48 rmap
lr-x------ 1 pbg staff 0 Mar 18 20:48 root -> 
-r-------- 1 pbg staff 1440 Mar 18 20:48 sigact
-r-------- 1 pbg staff 1232 Mar 18 20:48 status
-r--r--r-- 1 pbg staff 256 Mar 18 20:48 usage
-r-------- 1 pbg staff 0 Mar 18 20:48 watch
-r-------- 1 pbg staff 2736 Mar 18 20:48 xmap

注意到进程各个描述结构不同的权限许可设置,这个由结构对应的功能决定。比如,
"as"对应进程地址空间(虚拟内存),可读写。另一方面,ctl允许操作进程状态,只
需要可写权限。参看proc(4)手册页了解更多细节。最关心的是as,它指明了进程相
对内存占用状况。因为as文件大小包含所有相关共享库占用的内存,所以只能是相对
度量。如果进程终止,并不会释放出这么多内存空间。

◆ 使用/proc工具集

幸运的是,我们不必理会复杂的/proc目录结构,已经存在一组现成的工具。每
次Solaris发布新版本,proc工具集都会得到扩充,Solaris 2.6上/usr/proc/bin下


pcred pflags pmap psig pstop ptree pwdx
pfiles pldd prun pstack ptime pwait

下面让我们来看看这些工具都做了些什么。

--------------------------------------------------------------------------

1. pcred

pcred显示指定的EUID、RUID、SUID、EGID、RGID、SGID

# /usr/proc/bin/pcred 171
171: e/r/suid=0 e/r/sgid=0

2. pfiles

pfiles显示指定进程打开的所有文件(Unix中文件句柄代表打开的文件),同时显示施
加到指定进程的最大打开文件句柄数限制(软限制)

$ /usr/proc/bin/pfiles 3225
3225: vi scz.c
Current rlimit: 64 file descriptors
0: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
1: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
2: S_IFCHR mode:0620 dev:151,0 ino:196787 uid:500 gid:7 rdev:24,3
O_RDWR
3: S_IFCHR mode:0666 dev:151,0 ino:196758 uid:0 gid:3 rdev:13,12
O_RDWR
4: S_IFCHR mode:0666 dev:151,0 ino:196758 uid:0 gid:3 rdev:13,12
O_RDONLY
5: S_IFREG mode:0600 dev:151,0 ino:107791 uid:500 gid:100 size:24576
O_RDWR

句柄0、1、2对应标准输入、标准输出、标准错误输出,那些inodes代表/dev/pty入
口。为了确定句柄5对应的文件,需要费点手脚。可能你想针对整个系统搜索inode号
等于107791的文件。不幸的是,inode号只在每个独立分区上唯一,所以首先需要确
定所在分区。从/devices中寻找匹配主设备号、次设备号(这里文件句柄4对应的主设
备号151,次设备号0)的入口:

$ ls -lR /devices/ | grep 151
brw------- 1 root sys 151, 0 12月 3 20:39 dad@0,0:a
crw------- 1 root sys 151, 0 3月 7 11:28 dad@0,0:a,raw
... ...

接下来根据物理设备名到/dev树中确定逻辑设备名:

$ ls -lR /dev/ | grep "dad@0,0:a"
lrwxrwxrwx 1 root root 46 12月 3 20:35 c0t0d0s0 -> ../../devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a
lrwxrwxrwx 1 root root 50 12月 3 20:35 c0t0d0s0 -> ../../devices/pci@1f,0/pci@1,1/ide@3/dad@0,0:a,raw
... ...

现在我们知道相应的逻辑设备是c0t0d0s0,因为主次设备号匹配。在多硬盘系统中,
这个过程更加复杂,设备名(dad@0,0)可能一样,但是设备路径有区别(pci@1f,4000)。
如何确定哪个文件被打开了呢?确定设备的mount点:

$ df -k
Filesystem kbytes used avail capacity Mounted on
/proc 0 0 0 0% /proc
/dev/dsk/c0t0d0s0 8162157 1639360 6441176 21% /
fd 0 0 0 0% /dev/fd
swap 546392 296 546096 1% /tmp

用find命令查找指定inode号的文件:

$ find / -inum 107791 -mount -print
/var/tmp/Ex0000003225
$ ls -l /var/tmp/Ex0000003225
-rw------- 1 scz users 24576 3月 7 22:11 /var/tmp/Ex0000003225

"-mount"选项防止find搜索过程超出起始mount点(所以就不会搜索其他分区)。现在
知道了被vi打开的文件。vi编辑文件的时候,首先将它拷贝到/var/tmp,另起一个临
时名字,写保存时写入原来的文件并删除临时文件(这样如果在vi过程中系统崩溃,
可以部分恢复)。

3. pflags

pflags报告指定进程的状态

# /usr/proc/bin/pflags 171
171: /usr/sbin/inetd -s
/1: flags = PR_PCINVAL|PR_ORPHAN|PR_ASLEEP [ poll(0xefffd900,0x2b,0xffffffff) ]

参看/usr/include/sys/procfs.h头文件了解flags的意义。

4. pldd

pldd列举与指定进程相关的所有动态链接库

# /usr/proc/bin/pldd 171
171: /usr/sbin/inetd -s
/usr/lib/libsocket.so.1
/usr/lib/libnsl.so.1
/usr/lib/libdl.so.1
/usr/lib/libbsm.so.1
/usr/lib/libc.so.1
/usr/lib/libmp.so.2
/usr/platform/sun4u/lib/libc_psr.so.1
/usr/lib/nss_files.so.1
/usr/lib/straddr.so.2

5. pmap

pmap显示指定进程地址空间,包括内存段大小和访问权限设置

# /usr/proc/bin/pmap 171
171: /usr/sbin/inetd -s
00010000 32K read/exec /usr/sbin/inetd
00026000 8K read/write/exec /usr/sbin/inetd
00028000 440K read/write/exec [ heap ]
EF580000 592K read/exec /usr/lib/libc.so.1
EF622000 32K read/write/exec /usr/lib/libc.so.1
EF630000 8K read/exec /usr/lib/straddr.so.2
EF640000 8K read/write/exec /usr/lib/straddr.so.2
EF650000 8K read/write/exec [ anon ]
EF660000 16K read/exec /usr/lib/nss_files.so.1
EF672000 8K read/write/exec /usr/lib/nss_files.so.1
EF680000 448K read/exec /usr/lib/libnsl.so.1
EF6FE000 40K read/write/exec /usr/lib/libnsl.so.1
EF708000 24K read/write/exec [ anon ]
EF720000 16K read/exec /usr/platform/sun4u/lib/libc_psr.so.1
EF730000 16K read/exec /usr/lib/libmp.so.2
EF742000 8K read/write/exec /usr/lib/libmp.so.2
EF750000 56K read/exec /usr/lib/libbsm.so.1
EF76C000 16K read/write/exec /usr/lib/libbsm.so.1
EF790000 32K read/exec /usr/lib/libsocket.so.1
EF7A6000 8K read/write/exec /usr/lib/libsocket.so.1
EF7A8000 8K read/write/exec [ anon ]
EF7B0000 8K read/exec /usr/lib/libdl.so.1
EF7C0000 8K read/write/exec [ anon ]
EF7D0000 112K read/exec /usr/lib/ld.so.1
EF7FA000 8K read/write/exec /usr/lib/ld.so.1
EFFFC000 16K read/write/exec [ stack ]
total 1976K

译者: 对照memlook.c的报告

# memlook 171
PID IMAGE RSS HEAP STACK
171 2023424 1597440 442372 16384 

6. pstack

pstack显示指定进程中每个线程(轻量级进程LWP)的堆栈回溯。这些信息可以帮助确
定进程在何处挂起、为什么占用如此多的内存等等。

# /usr/proc/bin/pstack 171
171: /usr/sbin/inetd -s
ef5b7378 poll (efffd900, 2b, ffffffff)
ef5ccb9c select (efffda58, ef62531c, ef62531c, ef625324, ef625324, 2f) + 280
00012b40 main (284f4, 27b6c, 0, 0, ffffffff, 1) + 6d4
000123bc _start (0, 0, 0, 0, 0, 0) + dc

7. ptree

ptree显示指定进程相关的血统关系

# /usr/proc/bin/ptree 171
171 /usr/sbin/inetd -s
634 in.telnetd
636 login -p -d /dev/pts/3 -h scz.nsfocus.com
637 -bash
2815 in.telnetd
2817 login -p -d /dev/pts/6 -h scz.nsfocus.com
2818 -bash
3262 /usr/proc/bin/ptree 171

8. pwdx

pwdx显示指定进程当前工作目录

# ps -ef | grep vi
scz 3286 3284 0 22:54:56 pts/2 0:00 vi scz.c
# /usr/proc/bin/pwdx 3286
3286: /export/home/scz/src

9. ptime

ptime统计进程的执行时间,比time命令更精确

# /usr/proc/bin/ptime ls -ld
drwxr-xr-x 27 root root 1024 3月 6 21:12 .

real 0.017
user 0.004
sys 0.008

从Solaris 7开始,增加了一些新的proc工具,位于/usr/bin目录下,因为在启动脚
本和shutdown脚本中会用到它们。

10. plimit

plimit获取/设置针对每个进程的限制

/usr/bin/plimit 158
158: /usr/sbin/inetd -s
resource current maximum
time(seconds) unlimited unlimited
file(blocks) unlimited unlimited
data(kbytes) unlimited unlimited
stack(kbytes) 8192 unlimited
coredump(blocks) unlimited unlimited
nofiles(descriptors) 1024 1024
vmemory(kbytes) unlimited unlimited

11. pgrep

pgrep用于代替ps | grep这种操作,不再需要管道介入

# pgrep inetd
158

12. pkill

pkill发送一个用户可定义的信号到一个或多个进程(基于某种标准,比如进程名、进
程属主)。在启动、关机过程中使用pkill更加可靠高效。

$ /usr/bin/pkill bad-process

--------------------------------------------------------------------------

绝大多数proc工具都支持少量选项,更多是接受进程列表。参看手册页了解更多细节。
下面这些内容来自手册页:

下列proc工具在检查目标进程并报告结果的时候将暂停目标进程:pfiles、pldd、
pmap、pstack、pwdx。进程被暂停的时候什么都不能做。比如,在XWindow环境下运
行上述proc工具之一检查X Server,整个XWindow系统死锁,因为proc工具试图在窗
口中显示结果,但此时显示已经无法被刷新。此时应该从远程登录上来杀死导致死锁
的proc工具以便解除死锁。

下面是一个真实的例子。一个站点的daemon出了点问题,这个daemon的任务是接受来
自客户端的连接,允许它们处理保险单据。测试过程中,daemon运行一段时间后就崩
溃了。这种行为方式表明可能是资源限制所致,但究竟是什么资源呢?使用proc工具
集检查daemon的运行,注意到打开文件数持续攀升,当打开文件数超过60的时候发生
崩溃。哈,罪魁祸首正是文件句柄限制。删除这个限制,问题随之解决。proc工具集

非常轻松地解决了这个问题。


转于:http://lancelob.blog.sohu.com/84723155.html


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
操作系统实验中的proc文件系统是一种特殊的文件系统,主要用于提供操作系统内核信息的访问和管理。在实现proc文件系统时,需要完成以下几个主要步骤。 首先,需要定义一个proc文件结构体,用于描述proc文件的属性和操作。这个结构体通常包含文件名、文件大小、文件访问权限等信息,以便操作系统能够对其进行正确的处理。 接下来,需要实现创建proc文件的函数。这个函数负责在内核中创建一个proc文件,并将文件结构体与之关联。在创建过程中,需要为proc文件分配一个唯一的文件名,并指定相应的访问权限。 然后,需要实现读取proc文件内容的函数。这个函数会在用户空间打开proc文件时被调用,并将proc文件的内容返回给用户。根据不同的需求,可以通过读取内核变量或调用相关系统调用来获取文件内容。 此外,还需要实现写入proc文件内容的函数。这个函数会在用户空间对proc文件进行写入时被调用,并将用户输入的内容写入到相应的内核变量或系统调用中。 最后,还需要实现删除proc文件的函数。这个函数会在用户空间关闭proc文件或操作系统关闭时被调用,负责释放proc文件的相关资源。 总之,实现proc文件系统需要定义文件结构体、创建、读取、写入和删除文件的函数。通过这些功能,用户可以在用户空间访问和管理内核的信息,提供了一个方便的方式来查看和调试操作系统内部状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值