平台人生
作者平台人生2018-01-03 10:56
软件开发工程师, 平台人生

体验aix系统truss工具魅力

字数 6452阅读 6687评论 2赞 9

作者:蔡冰


前言

truss是aix系统下一个非常好用的命令。它可以用来跟踪系统调用、动态装入的用户级函数调用、接收的信号和造成的机器故障等。每行跟踪输出报告fault或者signal名称或者syscall名称和参数及返回值。

01第一个例子

aix系统中有个功能非常强大的sar命令,可以用来监控系统资源使用情况。遗憾的是对于普通非管理员或者管理员同组的用户该命令是无法使用的。普通用户执行sar -d 1 1命令会得到如下输出:

test1:/>sar: The file access permissions do not allow the specified action

但是查看sar命令文件权限默认权限如下:

home/test1>ls -l /usr/sbin/sar
-r-xr-xr-x    1 bin      bin          126642 May 04 2013  /usr/sbin/sar

对所有用户权限是一致的。所以sar命令文件本身权限不是导致命令不可用的原因。
下面我们就用truss命令来查看普通用户不能使用该命令的原因以及解决方法。
切换至普通用户执行truss sar -d 1 1命令可看到如下输出,截取其中一部分。

__loadx(0x01480080, 0x2FF20F70, 0x00000A50, 0x2FF21AD0, 0x00000000) = 0xD0546128
access("/usr/lib/nls/msg/en_US/sar.cat", 0)     = 0
_getpid()                                       = 2359968
corral_getcid()                                 = 0
access("/usr/lib/sa/sadc", 01)                  Err#13 EACCES
access("/usr/lib/nls/msg/en_US/libc.cat", 0)    = 0
_getpid()                                       = 2359968
kopen("/usr/lib/nls/msg/en_US/libc.cat", O_RDONLY) = 3
kioctl(3, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kfcntl(3, F_SETFD, 0x00000001)                  = 0
kioctl(3, 22528, 0x00000000, 0x00000000)        Err#25 ENOTTY
kread(3, "\\0\\001 007\\007 I S O 8".., 4096)    = 4096
lseek(3, 0, 1)                                  = 4096
lseek(3, 0, 1)                                  = 4096
lseek(3, 0, 1)                                  = 4096
_getpid()                                       = 2359968
lseek(3, 0, 1)                                  = 4096
close(3)                                        = 0
sarkwrite(2, " s a r", 3)                               = 3
: kwrite(2, " :  ", 2)                          = 2
The file access permissions do not allow the specified action.kwrite(2, " T h e   f i l e   a c c".., 62)       = 62
 
kwrite(2, "\\n", 1)                              = 1
__loadx(0x04400000, 0x2FF219A0, 0x00000800, 0x0000D032, 0x00000000) = 0x00000000
kfcntl(1, F_GETFL, 0x108D02A3)                  = 67110914
kfcntl(2, F_GETFL, 0x108D02A3)                  = 67110914
_exit(1)

从输出中我们可以看到上面输出中出现如下字段
access("/usr/lib/sa/sadc", 01) Err#13 EACCES
访问/usr/lib/sa/sadc文件时出现Err#13 EACCES报错。该报错代码解释我们可以查看系统/usr/include/errno.h中的定义,定义如下:

#define ECHILD  10      /* No child processes                   */
#define EAGAIN  11      /* Resource temporarily unavailable     */
#define ENOMEM  12      /* Not enough space                     */
#define EACCES  13      /* Permission denied                    */
#define EFAULT  14      /* Bad address                          */
#define ENOTBLK 15      /* Block device required                */

可见当前普通用户访问该权限被拒绝。我们再查看一下该文件的权限:

test1:/home/test1>ls -l /usr/lib/sa/sadc
-r-sr-x---    1 root     adm           23446 May 04 2013  /usr/lib/sa/sadc

显示其他用户对该文件目录没有rx权限。接下来我们尝试修改该文件权限给test1用户赋予一个rx权限。

test1@xxhjibm0401:/home/test1>chmod  o+rx /usr/lib/sa/sadc

再次确认新权限,

:/home/test1>ls -l /usr/lib/sa/sadc
-r-sr-xr-x    1 root     adm           23446 May 04 2013  /usr/lib/sa/sadc

接下来普通用户再次执行sar命令:

Test1:/>sar -d 1 1
AIX xxhjibm0401 1 7 00CF16214C00    12/20/17
System configuration: lcpu=16 drives=8  mode=Capped
15:57:45     device    %busy    avque    r+w/s    Kbs/s   avwait   avserv
15:57:46     hdisk6      0      0.0        0        0      0.0      0.0
             hdisk2      0      0.0        0        0      0.0      0.0
             hdisk5      0      0.0        0        0      0.0      0.0
             hdisk4      0      0.0        0        0      0.0      0.0
             hdisk3      0      0.0        0        0      0.0      0.0
             hdisk1      0      0.0        0        0      0.0      0.0
             hdisk0      0      0.0        0        0      0.0      0.0
                cd0      0      0.0        0        0      0.0      0.0

ok执行成功。
备注: 系统出入安全考虑默认可执行权限只放给了特权用户。本文仅用于举例展示.不建议更改权限.想了解更多相关权限信息的,参考IBM “Security”相关红皮书。

02第二个例子

曾经管理的一套系统,当时有反馈应用异常。登录主机执行topas查看系统各项资源均正常,查看系统各项指标,也没有任何性能瓶颈。出于习惯,按照cpu,内存,io等顺序采集并查看详细信息.
首先采集了一个30秒的系统进程cpu消耗情况:
Tprox –x sleep 30截取部分内容如下:

Process                   PID      TID  Total Kernel   User Shared  Other
=======                   ===      ===  ===== ======   ==== ======  =====
wait                    28686    28687   8.64   8.64   0.00   0.00   0.00
wait                    24588    24589   7.97   7.97   0.00   0.00   0.00
wait                    12294    12295   7.16   7.16   0.00   0.00   0.00
wait                    20490    20491   6.93   6.93   0.00   0.00   0.00
wait                     8196     8197   6.79   6.79   0.00   0.00   0.00
wait                    16392    16393   6.55   6.55   0.00   0.00   0.00
/usr/bin/amqcrsta     3788942  155748   1.39   1.37   0.01   0.01   0.00
MQConvAppTux       6635612 47738901   0.63   0.07   0.02   0.54   0.00
MQFrntAppTux       5529794  4886717   0.61   0.09   0.01   0.51   0.00
MQFrntAppTux       7127044 12812523   0.52   0.07   0.02   0.44   0.00
MQFrntAppTux       4509822 11493569   0.49   0.07   0.02   0.41   0.00
MQFrntAppTux       7807098 55529551   0.48   0.04   0.01   0.43   0.00

从中明显看出/usr/bin/amqcrsta的应用进程占用系统cpu异常,几乎全部为kernel占用。接下来用truss跟踪一下进程看进程的工作情况:
Truss –p 3788942输入如下

kill(1683670, 0)                                = 0
kill(5709840, 0)                                = 0
thread_tsleep(1000, 0xF125C34C, 0x00000000)     = 1
yield()                                         =
thread_waitact(400)                             = 1
kread(3, " T S H  \\0\\007 ?186 0\\0".., 32766)   = 1460
kread(3, " < n a m e > ??????.., 31306)   Err#11 EAGAIN
_select(4, 0x2FF1CC50, 0x00000000, 0x00000000, 0x2FF1CC40) = 1
yield()                                         =
thread_waitact(400)                             = 1
kread(3, " < / U N I T _ P O S T C".., 31306)   = 554
sigprocmask(0, 0x00000000, 0x2000ABF4)          = 0
__semop(131226, 0x2FF20960, 1)                  = 0
__semop(131226, 0x2FF20974, 1)                  = 0
kwrite(3, " T S H  \\0\\002 40196 0\\0".., 564)    = 564
kread(3, " T S H  \\0\\001 ?185 0\\0".., 32766)   = 492
sigprocmask(0, 0x00000000, 0x2000ABF4)          = 0
__semop(131226, 0x2FF20AD0, 1)                  = 0
__semop(131226, 0x2FF20AE4, 1)                  = 1
yield()                                         =
thread_waitact(400)                             = 0

该进程报了一个err#11 EAGAIN (Resource temporarily unavailable)的错误。然后程序每隔400毫秒等待激活,陷入死循环情况。
ps –ef|grep 3788942进程如下

mqm 3788942  155748   0 10:48:05      -  0:01 amqcrsta -m QM_GW_IN

是应用MQ的一个进程异常.联系应用人员应急处理并重启MQ后恢复正常。

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

9

添加新评论2 条评论

wuwenpinwuwenpin软件开发工程师, 南京
2018-01-12 19:43
不错,学习了
365004875365004875软件开发工程师, chinacache
2018-01-10 09:24
不错,学习了
Ctrl+Enter 发表

本文隶属于专栏

作者其他文章

相关文章

相关问题

相关资料

X社区推广