平台人生
作者平台人生·2016-11-24 17:32
软件开发工程师·平台人生

AIX系统中如何统计进程打开的文件数目

字数 3844阅读 12736评论 0赞 1

**作者:李烨楠 中国建设银行
来自微信公众号:平台人生**

环境: AIX 6.1 AIX7.1

前言:
用户有时需要统计一个进程打开的文件数目,比如,在当前打开文件句柄使用量是否超过用户资源限制(/etc/security/limits)中 nofiles的取值时。那么,AIX系统中该如何实现这一需求呢?如何判断我们设置的nofiles值对当前应用是否够用呢?下面我们提供三种方法进行统计。

  1. 使用 procfiles 命令
    procfiles 命令可以显示进程打开的所有文件描述符(FD,file descriptor,即代表打开的文件)信息,加上 -n 参数还可以显示相关文件名称。

sfmon@localhost>procfiles 51184046
51184046 : -ksh
Current rlimit: 8192 file descriptors
0: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY 

1: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY 

2: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY 

10: S_IFREG mode:0444 dev:10,5 ino:40370 uid:901 gid:900 rdev:0,0

  O_RDONLY size:0

63: S_IFREG mode:0600 dev:110,1 ino:5 uid:901 gid:900 rdev:0,0

  O_RDWR | O_APPEND size:0

sfmon@localhost>procfiles -n 51184046
51184046 : -ksh
Current rlimit: 8192 file descriptors
0: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY  name://dev/pts/0 

1: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY  name://dev/pts/0 

2: S_IFCHR mode:00 dev:10,4 ino:13150 uid:901 gid:900 rdev:30,0

  O_RDWR | O_NOCTTY  name://dev/pts/0 

10: S_IFREG mode:0444 dev:10,5 ino:40370 uid:901 gid:900 rdev:0,0

  O_RDONLY size:0name:/usr/lib/nls/msg/en_US/ksh.cat 

63: S_IFREG mode:0600 dev:110,1 ino:5 uid:901 gid:900 rdev:0,0

  O_RDWR | O_APPEND size:0name:/home/ap/sfmon/.sh_history

注意,stdin/stdout/stderr都各占一个文件描述符,而且socket也是要占用文件描述符的。

相关知识介绍:proctools系列命令

/proc 文件系统提供了一种控制进程的机制。它还提供了对有关当前进程和线程状态信息的访问,不过该信息是二进制格式。/proc 文件系统中每个条目的名称都是与进程 ID 对应的十进制数字。这些条目是子目录,每个条目的所有者由进程的用户 ID 确定。对进程状态的访问是由每个子目录中包含的附加文件提供的。

proctools系列命令(/proc 命令)基于某些可用信息提供 ASCII 报告。其中大多数命令接受进程 ID 列表或 /proc/ProcessID 字符串作为输入。因此可以使用 Shell 扩展 /proc/* 指定系统中的所有进程。

proctools系列命令从 /proc 中收集指定进程的信息并向用户显示该信息。这些命令从 /proc 中收集的信息是当前进程状态的快照,因此除了已终止的进程外,此信息在任何时刻都会有所不同。
proctools 命令包括:

  • procfiles 报告有关由进程打开的所有文件描述符的信息。
  • proctree 打印包含特定进程 ID 或用户的进程树。
  • procsig 列出进程定义的信号操作。
  • procstack 打印进程中所有线程的十六进制地址和符号名称。
  • procrun 启动在发生 PR_REQUESTED 事件时停止的进程。
  • procmap 打印进程的地址空间映射。
  • procflags 打印指定进程中每个线程的 /proc 跟踪标志、挂起和保持信号以及其他 /proc 状态信息。
  • proccred 打印进程的凭据(有效、实际、已保存的用户 ID 和组 ID)。
  • procldd 列出进程加载的对象,包括使用 dlopen() 来显式附加的共享对象。
  • procwait 等待所有指定的进程终止。
  • procwdx 打印进程的当前工作目录。
  • procstop 在发生 PR_REQUESTED 事件时终止进程。

在生产环境中检查进程时应该特别小心,特别不建议编入脚本循环执行进行系统监控,因为这些工具在进行检查时可能会挂起进程。

2.使用pstat命令统计:# pstat -a | grep<process name>,
获得进程的slot ID。 # pstat -u <slot number> | grep "fd " | wc -l
每个 fd 代表一个打开的文件描述符。
使用方法:
进入kdb,转换进程号pid至16进制,然后退出kdb。
root>kdb
(0)>dcal 1442240
Value decimal: 1442240 Value hexa: 001601C0
(0)>q

查看同名进程,根据进程号16进制,找到对应的slotID:
root>pstat -a | grepksh
1046a 1601c0 2b01a8 1601c0 0 0 1 ksh
1054 a 1e0142 1d00d4 1e0142 0 0 1 ksh
1056 a 200152 1b0312 1b0312 8 8 1 ksh
3099 a 1b0312 1d00d4 1b0312 0 0 1 ksh

查看打开的文件描述符:
root>pstat -u 1046 | grep "fd "
fd 0: fp = 0xf1000f1e9009c900 flags = 0x0480 count = 0x0000
fd 1: fp = 0xf1000f1e9009c900 flags = 0x0480 count = 0x0000
fd 2: fp = 0xf1000f1e9009c900 flags = 0x0480 count = 0x0000
fd 10: fp = 0xf1000f1e90062900 flags = 0x0481 count = 0x0000
fd 63: fp = 0xf1000f1e90084600 flags = 0x0481 count = 0x0000

统计使用文件描述符数目:
root@xxhjibm0502:/>pstat -u 1046 | grep "fd " | wc -l

   5

3.使用lsof命令
如果系统部署安装了lsof工具,统计一个进程打开的文件数目的工作则更加简单直接。

root@xxhjibm0502:/>lsof -p 1442240
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ksh 1442240 root cwd VDIR 10,4 4096 2 / (/dev/hd4)
ksh 1442240 root 0u VCHR 37,0 0t574139 25377 /dev/pts/0
ksh 1442240 root 1u VCHR 37,0 0t574139 25377 /dev/pts/0
ksh 1442240 root 2u VCHR 37,0 0t574139 25377 /dev/pts/0
ksh 1442240 root 10r VREG 10,5 5875 62228 /usr (/dev/hd2)
ksh 1442240 root 63u VREG 10,4 20768 31 / (/dev/hd4)

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关问题

X社区推广