linux_observability_tools

介绍

在Linux 下进行进程的排错,有很多方法。比如,修改源代码,print出一些关键的信息,如果代码是Python 的话,可以使用traceback 来打印堆栈,以及使用sentry 等等。但是这些方法都不够直接。如果你想要直接看到一个卡住(hanging processes)的进程正在干什么,什么操作卡住了。这个时候,你就应该使用ps、strace、lsof 这三样工具。简单来说,ps 可以查看当前Linux 正在运行的进程的状态,找出进程对应的PID 号,进程的CPU 和内存占用,运行时间等。stace 可以追踪进程的系统调用。lsof 可以给出进程所有打开的文件,而Linux 下一切皆文件,比如硬件设备、网络连接等。

ps - report a snapshot of the current processes.
strace - trace system calls and signals
Lsof - lists on its standard output file information about files opened by processes

ps

  • ps 命令常用的指令
ps auxf
  • ps 显示的信息的含义
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root       816  0.0  0.2 460500  2260 ?        Ssl  May14   3:01 ./aegis_update -f agx_update.cfg
root       842  0.0  0.0   4404   736 ?        S    May14   0:00 /bin/sh /alidata/server/mysql/bin/mysqld_safe --da
mysql     1118  0.0  3.9 404884 39988 ?        Sl   May14   7:35  \_ /alidata/server/mysql/bin/mysqld --basedir=/al
root      1140  0.0  0.0  30944   980 ?        Ss   May14   0:00 nginx: master process /alidata/server/nginx/sbin/n
www       1143  0.0  2.7  58080 28312 ?        S    May14   0:00  \_ nginx: worker process
root      1153  0.0  0.0  14508   972 tty1     Ss+  May14   0:00 /sbin/getty -8 38400 tty1
ntp       1179  0.0  0.2  33756  2076 ?        Ss   May14   0:56 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 104:108
root      7220  0.0  0.2 635176  2304 ?        Ssl  16:48   0:00 /usr/local/aegis/aegis_client/aegis_00_19/aegis_cl
USER  该进程输入哪个user
PID   进程的pid 号
%CPU  占用CPU 资源比例
%MEM  占用物理内存比例
VSZ   占用虚拟内存量(单位Kbytes)
RSS   实际占用内存量(单位Kbytes)
TTY   该进程在哪个终端上运行,如果与终端无关,则显示? 如果连入的终端,显示tty,网络连入显示pts/0
STAT  进程状态
START 进程启动的时间
TIME  进程占用CPU 的时间
COMMAND  进程的运行指令
R   运行
S   睡眠,等待某个条件的形成或者信号
I   Idle空闲
Z   僵死,(a defunct process)但进程描述符存在, 直到父进程调用wait4()系统调用后释放。
D   不可中断,收到信号不唤醒和不可运行, 进程必须等待直到有中断发生。
T   终止,进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行。
P   等待交换页
W   无驻留页
X   死掉的进程
<   高优先级进程,高优先序的进程
N   低优先级进程,低优先序的进程
L   内存锁页,有记忆体分页分配并缩在记忆体内
s   进程的领导者(在它之下有子进程)
l   多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads)
+   位于后台的进程组

strace

常见的Linux 系统调用有转自:strace 线程跟踪详解

fork        创建一个新进程
clone       按指定条件创建子进程
execve      运行可执行文件
exit        中止进程
nanosleep   使进程睡眠指定的时间
pause       挂起进程,等待信号
wait        等待子进程终止
waitpid     等待指定子进程终止
socket      建立socket
bind        绑定socket到端口
connect     连接远程主机
accept      响应socket连接请求
send        通过socket发送信息
recv        通过socket接收信息
mmap        映射虚拟内存页
munmap      去除内存页映射
mremap      重新映射虚拟内存地址
msync       将映射内存中的数据写回磁盘
listen      监听socket端口
select      对多路同步I/O进行轮询
shutdown    关闭socket上的连接
readv       从文件读入数据到缓冲数组中
writev      将缓冲数组里的数据写入文件
pread       对文件随机读
pwrite      对文件随机写
lseek       移动文件指针
dup         复制已打开的文件描述字
flock       文件加/解锁
poll        I/O多路转换
truncate    截断文件 

相应地,可以让strace 来跟踪指定调用,而非全部。

-e trace=file      跟踪和文件访问相关的调用(参数中有文件名)
-e trace=process   和进程管理相关的调用,比如fork/exec/exit_group
-e trace=network   和网络通信相关的调用,比如socket/sendto/connect
-e trace=signal    信号发送和处理相关,比如kill/sigaction
-e trace=desc      和文件描述符相关,比如write/read/select/epoll等
-e trace=ipc       进程间通信相关,比如shmget等

  • strace 常用指令
strace -p <pid>   跟踪进程的系统调用
strace -f -p <pid>   跟踪进程及其子进程的系统调用
strace -ttt -p <pid>   跟踪的同时显示时间信息
strace -c -p <pid>  显示进程的profilling 信息

lsof

  • lsof 常用指令
lsof <filename>    显示打开某个文件的进程
lsof +D <DIR>      显示所有打开该目录的进程,注意,如果不想显示其子目录的进程,可以使用+d。
lsof -u <username>   显示某个用户启动进程所打开的文件
lsof -u^<username>   显示除了某个用户外的其他所以用户的启动进程打开的文件
lsof -i [4|6][@hostname|ip][:service|port]       显示打开某ip或者端口的进程 (可以和netstat 配合使用), 4和6 用来区分ip 协议
lsof -i    列出所有的网络连接(注意,网络连接也是文件)
lsof -i TCP:1-1024   列出所有使用TCP 协议,端口范围是1-1024 的网络连接
  • lsof 输出列代表的含义
FD – Represents the file descriptor. Some of the values of FDs are

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
NUMBER – Represent the actual file descriptor. The character after the number i.e ‘1u’, represents the mode in which the file is opened. r for read, w for write, u for read and write.

TYPE – of files and it’s identification.

DIR – Directory
REG – Regular file
CHR – Character special file.
FIFO – First In First Out

实例

下面给出两个工作中遇到的实际问题,其中隐私部分马赛克处理,但不影响阅读。

下载文件失败

  • ps auxf,看到有三个进程运行了8个多小时,有卡住的嫌疑。
 
ps_aufx
  • strace -p 19693 跟踪该进程。看到进程正在等待从某个文件指针等待读取数据,文件描述符为9。也就是说,该进程在这里等了8个多小时。。。
 
strace
  • ls of 19693 可以看到,程序和某http 服务器建立起连接,进程就卡到了这个地方,而且文件描述符也是9。
 
lsof
  • 接下来再进行进一步的排错。

github 代理失效

  • aliyun 上有时候使用github 比较慢,用一台香港aliyun 搭建了shadowsocks
    server,机器A 启动了shadowsocks client,为剩下几台同一局域网的机器做代理。github 代理这样配置。./ssh/config,IP 和端口 是shadowsockes client 的。用nc 来做github ssh 包的转发,通过shadowsocks 链路,从香港服务器中转到github。
Host github.com
    User git
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand nc -x 1.2.3.4:1234 %h %p
  • 前几天机器A 做了迁移,IP 变化了,一开始忘记了这件事情,再某台机器上操作git 的时候,报错。
 
gitpull
  • 然后新开另一个终端,或者再tmux 下的另一个pannel,用ps auxf 找到和git pull 相关的进程pid。
 
git_ps
  • lsof -p 17919,从最下面一行可以看出,发送了握手信息,并没有收到。
 
git_lsof
  • 进一步检查IP,发现已经换了。

参考

  • Using strace and lsof to Track Down Process Hangs
    首先跟踪了一个简单的Hello world 代码的C 函数,后面用实例说明Linux 中进程hang 的几个可能情况(进程进入死循环状态,跑满CPU;进程在等待某种还没有available 的资源,比如向某台机器发起TCP 请求,但是没有收到回应,或者通信已经建立,但是没有收到期望的数据。再或者进程想要加一个mutex 互斥锁,但是已经加锁,进程就在等待其free),并且给出一个实例,连接mysql 服务器失败,通过strace 与lsof 的追踪,发现机器发出SYN 的时候,没有收到应答,那么接下来应该进一步排查防火墙。
  • 5 simple ways to troubleshoot using Strace
  • Strace (and lsof)
  • strace 线程跟踪详解
  • linux lsof详解

作者:shawnwang_tech
链接:https://www.jianshu.com/p/b57a88e00765
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

使用 ps、strace、lsof 进行 Linux 进程 trouble-shooting的更多相关文章

  1. ps -ef | grep Linux进程查看命令

    我们常常会想查看Linux的一些进程,很自然地用到了: ps -ef | grep xxx ps: process show 展示进程 参数:1. e 显示所有程序. 2. f  显示UID,PPIP ...

  2. 《linux 进程管理》- ps/top/kill/nice

    一:进程简述 二:ps 查看进程 语法 ps * -A 列出所有进程,和 -e 同等效果 * -a 列出不和本终端有关系的所有进程 * -w 显示加宽,可以显示较多信息 * -u 显示有效使用者相关的 ...

  3. Linux进程管理四大工具ps \dstat\ top\ htop

    Linux进程管理之“四大名捕” 一.四大名捕 四大名捕,最初出现于温瑞安创作的武侠小说,是朝廷中正义力量诸葛小花的四大徒弟,四人各怀绝技,分别是轻功暗器高手“无情”.内功卓越的高手“铁手”.腿功惊人 ...

  4. 利用lsof去查看Unix/Linux进程打开了哪些文件

    利用lsof去查看Unix/Linux进程打开了哪些文件 今天用了一下lsof,发现这个linux的小工具,功能非常强大而且好用. 我们可以方便的用它查看应用程序进程打开了哪些文件或者对于特定的一个文 ...

  5. linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定

    背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[root@test vhost]# ps auxUSER  ...

  6. Linux进程管理之ps

    Linux 是一种动态系统,能够适应不断变化的计算需求.下面介绍一些 Linux 所提供的工具来进行进程的查看与控制,掌握这些让我们能在某些进程出现异常的时候及时查看相关的指标,从而解决问题. 进程管 ...

  7. Linux进程管理之ps的使用

    主题Linux进程管理之ps工具的使用 一ps工具的介绍 ps: process state  进程状态ps - report a snapshot of the current processesL ...

  8. 【进程/作业管理】篇章一:Linux进程及其管理(进程管理类工具)----pstree、ps、top、htop、kill、(killall、pkill、pgrep、pidof)

    主要讲解进程管理类命令及工具的使用:pstree.ps.top.htop.kill.(killall.pkill.pgrep.pidof) pstree 以树状图的方式展现进程之间的派生关系,显示效果 ...

  9. 如何查看Linux进程详情?(ps命令)

    点击关注上方"开源Linux", 后台回复"读书",有我为您特别筛选书籍资料~ 1. ps是什么? 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是 ...

随机推荐

  1. C# MVC 用户登录状态判断

    来源:https://www.cnblogs.com/cherryzhou/p/4978342.html 在Filters文件夹下添加一个类AuthenticationAttribute ,代码如下: ...

  2. Matlab diag的用法

    X = diag(v,k) 以向量v的元素作为矩阵X的第k条对角线元素,当k=0时,v为X的主对角线:当k>0时,v为上方第k条对角线 几个例子: 当k> v=[1 2 3]; >& ...

  3. 【18】观察者模式(Observer Pattern)

    一.引言 在现实生活中,处处可见观察者模式.例如,微信中的订阅号,订阅博客和QQ微博中关注好友,这些都属于观察者模式的应用.在这一章将分享我对观察者模式的理解,废话不多说了,直接进入今天的主题. 二. ...

  4. netty 基础

    Netty是一个高性能.异步事件驱动的NIO框架,提供了对TCP.UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户 ...

  5. HDU3987(最小割最少割边)

    Harry Potter and the Forbidden Forest Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65536/ ...

  6. canvas-2lineCap.html

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. BZOJ4259: 残缺的字符串(FFT 字符串匹配)

    题意 题目链接 Sol 知道FFT能做字符串匹配的话这就是个裸题了吧.. 考虑把B翻转过来,如果\(\sum_{k = 0}^M (B_{i - k} - A_k)^2 * B_{i-k}*A_k = ...

  8. 动态切换 web 报表中的统计图类型

    统计图在浏览器端展现时,不同的使用人员对图形的展现形式会有不同的要求,有的需要柱形图.有的想看折线图等,报表支持用户在浏览器端动态的选择统计图类型,关注乾学院,查看具体实现方法动态切换 web 报表中 ...

  9. Flume Source 实例

    Flume Source 实例 Avro Source 监听avro端口,接收外部avro客户端数据流.跟前面的agent的Avro Sink可以组成多层拓扑结构. 1 2 3 4 5 6 7 8 9 ...

  10. BD是什么角色

    BD是什么角色? 在一般创业公司里面,有了产品接下来就是运营了,而运营中很重要的一点就是BD,也就是所谓商务拓展了,俗一点说就是生意的合作拓展 https://www.jianshu.com/p/7d ...