ls等io操作卡死处理办法

strace常用来跟踪进程执行时的系统调用和所接收的信号。 在Linux世界,进程不能直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时,必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。

  • strace 命令跟踪,定位问题。首先使用命令跟踪, 查看执行到哪一步卡死:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ strace  ls /
    ....
    ...
    ..
    lgetxattr("/MegaSAS.log", "system.posix_acl_default", 0x0, 0) = -1 ENODATA (No data available)
    lstat("/net", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
    lgetxattr("/net", "security.selinux", 0x258f850, 255) = -1 EOPNOTSUPP (Operation not supported)
    lstat("/net", {st_mode=S_IFDIR|0755, st_size=0, ...}) = 0
    lgetxattr("/net", "system.posix_acl_access", 0x0, 0) = -1 EOPNOTSUPP (Operation not supported)
    lstat("/chaichuan_test", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lgetxattr("/chaichuan_test", "security.selinux", 0x258f850, 255) = -1 ENODATA (No data available)
    lstat("/chaichuan_test", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
    lgetxattr("/chaichuan_test", "system.posix_acl_access", 0x0, 0) = -1 ENODATA (No data available)
    lgetxattr("/chaichuan_test", "system.posix_acl_default", 0x0, 0) = -1 ENODATA (No data available)
    lstat("/mnt", {st_mode=S_IFDIR|0775, st_size=4096, ...}) = 0
    lgetxattr("/mnt",

    可以看到,命令执行到 /mnt这个目录时,停止不动了

  • 使用cat /proc/mountscat /etc/mtab 查看当前mount状态,发现确实有对mnt目录的记录

    1
    2
    3
    4
    5
    6
    $ cat /proc/mounts 
    ...
    192.168.10.150:/opt/ /mnt nfs4 ....
    $ cat /etc/mtab
    ...
    192.168.10.150:/opt/ /mnt nfs4 ....
  • 接下来将这个目录进行卸载

    1
    $ umount -l /mnt
  • 总结
    strace命令是一个集诊断、调试、统计与一体的工具,我们可以使用strace对应用的系统调用和信号传递的跟踪结果来对应用进行分析,以达到解决问题或者是了解应用工作过程的目的, 具体使用可以查看帮助.

setzero wechat