From 88e6b909b6585eaf98c5bb2e213793f34b949da6 Mon Sep 17 00:00:00 2001 From: linlongchen Date: Fri, 27 Mar 2020 21:56:05 +0800 Subject: [PATCH] blog add linux --- .../linux/linux工具系列/01/linux_tools_cmd.md | 240 ++++++++++++++++++ _posts/linux/linux工具系列/01/proc目录.png | Bin 0 -> 20188 bytes 2 files changed, 240 insertions(+) create mode 100644 _posts/linux/linux工具系列/01/linux_tools_cmd.md create mode 100644 _posts/linux/linux工具系列/01/proc目录.png diff --git a/_posts/linux/linux工具系列/01/linux_tools_cmd.md b/_posts/linux/linux工具系列/01/linux_tools_cmd.md new file mode 100644 index 0000000..24b1781 --- /dev/null +++ b/_posts/linux/linux工具系列/01/linux_tools_cmd.md @@ -0,0 +1,240 @@ +工作5年,我总结了这些分析Linux进程的方法,全都告诉你。 + +进程是学计算机的人都要接触的基本概念,抛开那些纯理论的操作系统底层实现,在Linux下做软件开发这么多年,每次程序运行出现问题,都要一步一步分析进程各种状态,去排查问题出在哪里,这次lemon带你在Linux环境下实操,探究Linux进程的那些秘密。 + +## 何为进程 + +首先我们说下程序的概念,程序是一些保存在磁盘上的指令的有序集合,是静态的。进程是程序执行的过程,包括了动态创建、调度和消亡的整个过程,它是程序资源管理的最小单位。 + + 线程是操作操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位「引用维基百科」。一个进程内可以包含多个线程。 + + + + + +认识进程第一步,找到进程PID ( Process IDentity )。 + +## ps + +`report a snapshot of the current processes.` 列出当前系统进程的一个快照报告。 + +最基本的当然是ps这个命令啦,这个大家应该都知道,小白别以为是Photoshop哈,不知道我下面给大家简单介绍一下,一般用法是`ps -ef`列出系统内经常信息,通常都会带管道`grep`出自己感兴趣的进程,像这样`ps -ef|grep intresting`第一列PID代表进程号,PPID(parent process ID)代表父进程号。 + +``` +$ps -ef +UID PID PPID C STIME TTY TIME CMD +root 1 0 0 2018 ? 00:04:22 /sbin/init +root 2 0 0 2018 ? 00:00:00 [kthreadd] +root 3 2 0 2018 ? 00:00:29 [ksoftirqd/0] +root 5 2 0 2018 ? 00:00:00 [kworker/0:0H] +root 7 2 0 2018 ? 00:02:05 [migration/0] +root 8 2 0 2018 ? 00:00:00 [rcu_bh] +root 9 2 0 2018 ? 00:00:00 [rcuob/0] +root 10 2 0 2018 ? 00:00:00 [rcuob/1] +``` + + + +认识进程第二步,让我看看你都交了哪些朋友(系统调用)。 + +## strace + +`strace - trace system calls and signals` 跟踪进程内部的系统调用和信号 + +`strace`后面跟着启动一个进程,你就可以跟踪启动后进程的系统调用和信号,有了这个命令可以看到进程执行时候都调用了哪些系统调用,通过指定不同的选项可以输出系统调用发生的时间,精度可以精确到微秒,甚至还可以统计分析系统调用的耗时,这在排查进程假死问题的时候很有用,能帮你发现进程卡在哪个系统调用上。已经在运行的进程也可以指定`-p`参数加`pid`像`gdb attach`那样附着上去跟踪。 + +> 什么是系统调用?**系统调用**(英语:system call),指运行在「用户态」的程序向操作系统「内核态」请求需要更高权限运行的服务。系统调用提供用户程序与操作系统之间的接口。 + +```shell +$strace ./time_test +access("/usr/local/sa/agent/log/execOn", F_OK) = 0 +readlink("/proc/3768/exe", "/usr/bin/strace", 2047) = 15 +getuid() = 560 +getppid() = 3767 +open("/proc/3767/cmdline", O_RDONLY) = 3 +fstat(3, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0 +mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f78d088b000 +read(3, "strace\0./time_test\0", 9216) = 19 +read(3, "", 9216) = 0 +close(3) = 0 +munmap(0x7f78d088b000, 4096) = 0 +getcwd("/data/linlongchen/test", 511) = 23 +ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0 +readlink("/proc/self/fd/0", "/dev/pts/92", 4095) = 11 +socket(PF_FILE, SOCK_DGRAM, 0) = 3 +fcntl(3, F_GETFL) = 0x2 (flags O_RDWR) +fcntl(3, F_SETFL, O_RDWR|O_NONBLOCK) = 0 +fcntl(3, F_GETFD) = 0 +fcntl(3, F_SETFD, FD_CLOEXEC) = 0 +sendto(3, "\0\0\0\4\0\0\0\266\0\v./time_test\0\16./time_te"..., 182, 0, {sa_family=AF_FILE, path="/usr/local/sa/agent/log/agent_cmd.sock"}, 40) = 182 +close(3) = 0 +execve("./time_test", ["./time_test"], [/* 30 vars */]) = 0 +brk(0) = 0xe31000 +mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5a3ac9a000 +access("/etc/ld.so.preload", R_OK) = 0 +open("/etc/ld.so.preload", O_RDONLY) = 3 +fstat(3, {st_mode=S_IFREG|0644, st_size=18, ...}) = 0 +mmap(NULL, 18, PROT_READ|PROT_WRITE, MAP_PRIVATE, 3, 0) = 0x7f5a3ac99000 +``` + +``` +$strace -c ./time_test +time: 2020-03-26 20:20:17 +% time seconds usecs/call calls errors syscall +------ ----------- ----------- --------- --------- ---------------- + -nan 0.000000 0 10 read + -nan 0.000000 0 1 write + -nan 0.000000 0 42 32 open + -nan 0.000000 0 11 close + -nan 0.000000 0 12 12 stat + -nan 0.000000 0 12 fstat + -nan 0.000000 0 1 lseek + -nan 0.000000 0 26 mmap + -nan 0.000000 0 11 mprotect + -nan 0.000000 0 4 munmap + -nan 0.000000 0 3 brk + -nan 0.000000 0 1 ioctl + -nan 0.000000 0 2 access + -nan 0.000000 0 1 socket + -nan 0.000000 0 1 sendto + -nan 0.000000 0 1 execve + -nan 0.000000 0 4 fcntl + -nan 0.000000 0 1 getcwd +------ ----------- ----------- --------- --------- ---------------- + +``` + + + +认识进程第三步,让我看看你带的小弟们(线程)。 + +## pstack + +`print a stack trace of a running process` 打印出运行中程序的堆栈信息。 + +执行命令`pstack pid` 你能看到当前线程运行中的堆栈信息,其中的pid可用之前的`ps`命令获得,`pstack`可以看到进程内启动的线程号,每个进程内线程的堆栈内容也能看到。 + +```shell +$ pstack 11822 +Thread 4 (Thread 0x7f1eab4ec700 (LWP 11838)): +#0 0x00007f1eb69a0bb3 in select () from /lib64/libc.so.6 +Thread 3 (Thread 0x7f1eaaceb700 (LWP 11839)): +#0 0x00007f1eb69a0bb3 in select () from /lib64/libc.so.6 +Thread 2 (Thread 0x7f1eaa4ea700 (LWP 11840)): +#0 0x00007f1eb69a9d23 in epoll_wait () from /lib64/libc.so.6 +Thread 1 (Thread 0x7f1eb825c400 (LWP 11822)): +#0 0x00007f1eb69a9d23 in epoll_wait () from /lib64/libc.so.6 +#1 0x000000000043ab14 in PollerWraper::WaitPollEvents (this=0x1ca4790, timeout=-1) at ../comm/pollwraper.cpp:11 +``` + + + +看到上面打印出的LWP了吗,这里是个知识点, LPW是指`Light-weight process` 轻量级线程。引申知识: + +> 1. Linux中没有真正的线程 +> 2. Linux中没有的线程`Thread`是由进程来模拟实现的所以称作:轻量级进程 +> 3. 进程是分配资源(资源管理)的最小单元,线程是调度资源(程序执行)的最小单元(这里不考虑协程) + + + +认识进程第四步,让小弟们(线程)出来排个队。 + +## pstree + +`pstree - display a tree of processes` pstree按树形结构打印运行中进程结构信息 + +可以直观的查看进程和它启动的线程的关系,并能显示进程标识。 + +``` +pstree -p 11822 +query_test(11822)-+-{query_test}(11838) + |-{query_test}(11839) + `-{query_test}(11840) +``` + + + +认识线程第五步,是死(进程崩溃)是活(进程运行中)我都要知道你的秘密。 + +## gdb + +gdb是GNU开发的gcc套件中Linux下程序调试工具,你可以查看程序的堆栈、设置断点、打印程序运行时信息,甚至还能调试多线程程序,功能十分强大。 + +在这里把gdb当成一个命令来讲有点大材小用了,要详细说gdb的话,完全可以撑起一篇文章的篇幅,这里长话短说,有机会再开一篇文章详细介绍下它。 + +### 使用 + +要用gdb调试C/C++程序首先编译的时候要加`-g`选项,`g++ -g test.cpp -o test`这样生成的程序就可以用gdb来调试啦。 + +1. 可以直接用gdb启动程序调试,命令:`gdb prog` +2. 用gdb附着到一个已经启动的进程上调试也可以。命令:`gdb prog pid` +3. 程序崩溃之后参数corefile也可以用gdb调试,看看程序死掉之前留了什么遗言(堆栈信息)给你。命令:`gdb prog corefile`,这里有一点需要注意,有些Linux系统默认程序崩溃不生成`corefile`,这时你需要`ulimit -c unlimited`这样就能生成`corefile`了。 + +```shell +(gdb) attach 22861 + +(gdb) info threads // 查看线程信息, *代表当前调试的线程 + 5 Thread 0x881fbb70 (LWP 22876) 0x007da424 in __kernel_vsyscall () + 4 Thread 0x86ef8b70 (LWP 22877) 0x007da424 in __kernel_vsyscall () + 3 Thread 0x864f7b70 (LWP 22878) 0x007da424 in __kernel_vsyscall () + 2 Thread 0x85af6b70 (LWP 22879) 0x007da424 in __kernel_vsyscall () +* 1 Thread 0x93a9c6d0 (LWP 22861) 0x007da424 in __kernel_vsyscall () + +(gdb) bt //显示调用堆栈bt -- Print backtrace of all stack frames +#0 0x007da424 in __kernel_vsyscall () +#1 0x05a1b996 in nanosleep () from /usr/local/lib/libc.so.6 +#2 0x05a55aec in usleep () from /usr/local/lib/libc.so.6 +#3 0x93ad4ad6 in WaitForExit () at test.cpp:242 +#4 0x0807c5da in main (argc=1, argv=0xbffa92f4) at /test/main.cpp:58 + +(gdb) thread apply 1 bt //切换到线程1 +Thread 1 (Thread 0x93a9c6d0 (LWP 22861)): +#0 0x007da424 in __kernel_vsyscall () +#1 0x05a1b996 in nanosleep () from /usr/local/lib/libc.so.6 +#2 0x05a55aec in usleep () from /usr/local/lib/libc.so.6 +#3 0x93ad4ad6 in WaitForExit () at Vos.cpp:242 +#4 0x0807c5da in main (argc=1, argv=0xbffa92f4) at /test/main.cpp:58 +``` + + + +认识进程第六步,关于你的所有,我都想知道。 + +## 更近一步 + +通过/proc/pid文件了解进程的运行时信息和统计信息。/proc系统是一个伪文件系统,它只存在内存当中,而不占用外存空间,以文件系统的方式为内核与进程提供通信的接口。进入系统/proc目录: + +![proc目录](F:\github\lemonchann.github.io\_posts\linux\linux工具系列\proc目录.png) + +/proc目录下有很多以数字命名的目录,每个数字代表进程号PID它们是进程目录。系统中当前运行的每一个进程在/proc下都对应一个以进程号为目录名的目录/proc/pid,它们是读取进程信息的接口,我们可以进到这个文件里面,了解进程的运行时信息和统计信息。 + +### 高频使用统计 + +`/proc/pid`目录下的有一些重要文件,挑几个使用频率高的讲一讲。 +`/proc/pid/environ` 包含了进程的可用环境变量的列表 。程序出问题了如果不确定环境变量是否设置生效,可以`cat`这个文件出来查看确认一下。 + +`/proc/pid/fd/` 这个目录包含了进程打开的每一个文件的链接。从这里可以查看进程打开的文件描述符信息,包括标准输入、输出、错误流,进程打开的`socket`连接文件描述符也能看到,`lsof`命令也有类似的作用。 + +`/proc/pid/stat`包含了进程的所有状态信息,进程号、父进程号、 线程组号、 该任务在用户态运行的时间 、 该任务在用内核态运行的时间、 虚拟地址空间的代码段、 阻塞信号的位图等等信息应有尽有。 + +### 其他统计 + +/proc/pid/cmdline 包含了用于开始进程的命令 +/proc/pid/cwd包含了当前进程工作目录的一个链接 +/proc/pid/exe 包含了正在进程中运行的程序链接 +/proc/pid/mem 包含了进程在内存中的内容 +/proc/pid/statm 包含了进程的内存使用信息 + + + + +## reference + + https://man.linuxde.net/gdb + + https://blog.csdn.net/dan15188387481/article/details/49450491 + + https://blog.csdn.net/m0_37925202/article/details/78759408 + +https://blog.csdn.net/enweitech/article/details/53391567 + diff --git a/_posts/linux/linux工具系列/01/proc目录.png b/_posts/linux/linux工具系列/01/proc目录.png new file mode 100644 index 0000000000000000000000000000000000000000..cd9b0189e587f6e32a5c6ab65c48c870f7e0f6b2 GIT binary patch literal 20188 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