免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5921 | 回复: 1
打印 上一主题 下一主题

proc的威力----利用proc工具解决系统问题(转自绿盟) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-15 09:04 |只看该作者 |倒序浏览
概述

    许多系统管理员并未意识到到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工具集
非常轻松地解决了这个问题。

论坛徽章:
0
2 [报告]
发表于 2007-03-16 12:01 |只看该作者
不错确实 是个好贴  虽然是转的 也
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP