短时进程–消耗CPU的元凶
一 问题现象
通常情况下,系统CPU资源使用率高的话,我们可以通过top查看到消耗CPU资源的进程,进而分析该进程。但是,在有些时候,我们通过top明明看到系统CPU使用率非常高,却看不到消耗CPU资源的进程。如下:
[root@localhost ~]# top top - 08:45:36 up 15:45, 4 users, load average: 4.17, 1.30, 1.67 Tasks: 219 total, 8 running, 211 sleeping, 0 stopped, 0 zombie %Cpu(s): 74.9 us, 20.3 sy, 0.0 ni, 2.5 id, 0.0 wa, 0.0 hi, 2.3 si, 0.0 st KiB Mem : 3881344 total, 733212 free, 905640 used, 2242492 buff/cache KiB Swap: 4063228 total, 4061940 free, 1288 used. 2068120 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 6011 101 20 0 34020 2964 756 R 3.9 0.1 0:51.10 nginx 2071 oracle 20 0 3460008 208668 78060 S 2.6 5.4 101:47.43 gnome-shell 12897 bin 20 0 336684 7644 1876 S 2.6 0.2 0:01.46 php-fpm 12904 bin 20 0 336684 7644 1872 S 2.6 0.2 0:01.45 php-fpm 12909 bin 20 0 336684 7644 1872 S 2.3 0.2 0:01.42 php-fpm 12915 bin 20 0 336684 7644 1868 S 2.3 0.2 0:01.45 php-fpm 12923 bin 20 0 336684 7644 1868 S 2.3 0.2 0:01.41 php-fpm 468 root 20 0 55804 19716 19128 S 2.0 0.5 0:52.49 systemd-journal 5965 root 20 0 275716 2972 1660 S 1.6 0.1 0:17.45 docker-containe 1724 oracle 0 -20 1497560 161316 70728 S 1.3 4.2 52:35.72 nxnode.bin 5725 root 20 0 809180 32824 14876 S 1.3 0.8 0:23.48 dockerd-current 9 root 20 0 0 0 0 S 0.3 0.0 0:41.19 rcu_sched 900 root 20 0 0 0 0 R 0.3 0.0 0:00.29 kworker/0:0 953 nx 20 0 1436212 78652 7484 S 0.3 2.0 2:46.69 nxserver.bin 2534 oracle 20 0 1166020 82632 42852 S 0.3 2.1 14:44.10 gnome-initial-s 5731 root 20 0 394008 11468 5604 S 0.3 0.3 0:03.93 docker-containe 21972 root 20 0 162136 2324 1512 R 0.3 0.1 0:00.08 top 25557 bin 20 0 8172 860 104 R 0.3 0.0 0:00.01 stress 25562 bin 20 0 8176 596 104 R 0.3 0.0 0:00.01 stress 1 root 20 0 193976 6912 4116 S 0.0 0.2 0:06.26 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.06 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:01.52 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H 7 root rt 0 0 0 0 S 0.0 0.0 0:00.41 migration/0
明明74.9 us和20.3 sy,加起来已经非常之高了。却看不到过分消耗CPU资源的进程?
二 故障现象重现
1 准备机器
机器1:172.16.11.148, 2 CPU,4G内存,用于模拟服务端机器,运行docker,跑php+nginx的服务,接收客户端机器发起的请求,待会儿会看到该机器的CPU非常高,却看不到哪些进程消耗了CPU的情况;
机器2:172.16.11.195,充当客户端机器,通过运行Apache的web性能测试工具ApacheBench,向机器1,172.16.11.148发起请求。
2 服务端启动docker进程
172.16.11.148机器:
[root@localhost ~]# docker run --name nginx -p 10000:80 -itd feisky/nginx:sp 337a986d71b09227072d3c7fa75e860d454703b9cd7ae10c9a3f7dfa6622f618 [root@localhost ~]# docker run --name phpfpm -itd --network container:nginx feisky/php-fpm:sp 4fe260d1df8a7ad7fedb392b70172957896ca7f906c552b99483be2a142613ec [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4fe260d1df8a feisky/php-fpm:sp "php-fpm -F --pid ..." 3 seconds ago Up 2 seconds phpfpm 337a986d71b0 feisky/nginx:sp "nginx -g 'daemon ..." 9 seconds ago Up 9 seconds 0.0.0.0:10000->80/tcp nginx [root@localhost ~]#
3 客户端发起web压力测试请求
172.16.11.195机器:
[root@localhost ~]# curl http://172.16.11.148:10000 It works![root@localhost ~]# [root@localhost ~]# ab -c 100 -n 1000 http://172.16.11.148:10000/ This is ApacheBench, Version 2.3 <$Revision: 1430300 $> Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Licensed to The Apache Software Foundation, http://www.apache.org/ Benchmarking 172.16.11.148 (be patient) Completed 100 requests Completed 200 requests Completed 300 requests Completed 400 requests Completed 500 requests Completed 600 requests Completed 700 requests Completed 800 requests Completed 900 requests Completed 1000 requests Finished 1000 requests Server Software: nginx/1.15.4 Server Hostname: 172.16.11.148 Server Port: 10000 Document Path: / Document Length: 9 bytes Concurrency Level: 100 Time taken for tests: 14.196 seconds Complete requests: 1000 Failed requests: 0 Write errors: 0 Total transferred: 172000 bytes HTML transferred: 9000 bytes Requests per second: 70.44 [#/sec] (mean) Time per request: 1419.645 [ms] (mean) Time per request: 14.196 [ms] (mean, across all concurrent requests) Transfer rate: 11.83 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 0 5 63.2 0 1001 Processing: 41 1346 277.9 1358 1750 Waiting: 41 1346 278.0 1358 1750 Total: 48 1351 286.0 1359 2524 Percentage of the requests served within a certain time (ms) 50% 1359 66% 1431 75% 1499 80% 1528 90% 1617 95% 1660 98% 1702 99% 1710 100% 2524 (longest request) [root@localhost ~]#
4 服务端监控性能
在客户端发起web压力测试请求的过程中,在服务器上执行top,pidstat监控系统资源情况:
[root@localhost ~]# top top - 11:12:46 up 18:12, 4 users, load average: 3.18, 0.98, 0.40 Tasks: 221 total, 5 running, 216 sleeping, 0 stopped, 0 zombie %Cpu(s): 75.0 us, 21.3 sy, 0.0 ni, 1.8 id, 0.0 wa, 0.0 hi, 1.8 si, 0.0 st KiB Mem : 3881344 total, 675232 free, 897368 used, 2308744 buff/cache KiB Swap: 4063228 total, 4061940 free, 1288 used. 2039008 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 16015 101 20 0 34016 2960 756 S 4.3 0.1 0:01.84 nginx 22852 bin 20 0 336684 7652 1880 S 2.6 0.2 0:00.71 php-fpm 22862 bin 20 0 336684 7648 1872 S 2.6 0.2 0:00.72 php-fpm 22881 bin 20 0 336684 7648 1868 S 2.3 0.2 0:00.69 php-fpm 468 root 20 0 63992 21316 20728 S 2.0 0.5 1:14.91 systemd-journal 22867 bin 20 0 336684 7644 1868 S 2.0 0.2 0:00.66 php-fpm 22872 bin 20 0 336684 7648 1868 S 2.0 0.2 0:00.66 php-fpm 2071 oracle 20 0 3460008 208668 78060 S 1.7 5.4 117:30.89 gnome-shell 5725 root 20 0 809180 30652 15068 S 1.7 0.8 0:55.57 dockerd-current 15973 root 20 0 339844 2968 1692 S 1.3 0.1 0:00.65 docker-containe 1724 oracle 0 -20 1497560 161316 70728 S 1.0 4.2 60:21.87 nxnode.bin 16042 root 20 0 336300 33092 27700 S 0.7 0.9 0:01.03 php-fpm 9 root 20 0 0 0 0 R 0.3 0.0 0:49.11 rcu_sched 622 root 20 0 21680 1284 964 S 0.3 0.0 0:05.67 irqbalance 653 root 20 0 555148 9312 7072 S 0.3 0.2 1:33.56 NetworkManager 953 nx 20 0 1436448 78664 7484 S 0.3 2.0 3:12.94 nxserver.bin 2534 oracle 20 0 1166020 82632 42852 S 0.3 2.1 17:00.89 gnome-initial-s 22849 root 20 0 0 0 0 S 0.3 0.0 0:00.02 kworker/0:1 28953 bin 20 0 8176 864 104 R 0.3 0.0 0:00.01 stress 28955 bin 20 0 8176 864 104 R 0.3 0.0 0:00.01 stress 1 root 20 0 193976 6924 4116 S 0.0 0.2 0:06.88 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.07 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:01.92 ksoftirqd/0
以及:pidstat和vmstat
[root@localhost ~]# vmstat 1 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 10 0 1288 665536 544 2315556 0 0 22 17 13 15 11 2 88 0 0 9 0 1288 665656 544 2315660 0 0 0 0 3901 4014 79 20 1 0 0 8 0 1288 663892 544 2315796 0 0 0 208 4242 3969 75 22 3 0 0 6 0 1288 664892 544 2315968 0 0 0 0 4319 4087 74 23 3 0 0 6 0 1288 664596 544 2315936 0 0 0 0 4253 3726 76 23 1 0 0 11 0 1288 665104 544 2316200 0 0 0 0 4130 3913 76 23 1 0 0 5 0 1288 663400 544 2316280 0 0 0 0 4048 4230 78 21 2 0 0 7 0 1288 663856 544 2316376 0 0 0 8 4588 4416 74 22 4 0 0 8 0 1288 663892 544 2316476 0 0 0 0 4171 3454 77 23 0 0 0 8 0 1288 664032 544 2316648 0 0 0 0 4247 3804 74 24 2 0 0 ^C [root@localhost ~]#
此时,只能看到系统CPU利用率非常高,却并没有看到消耗CPU非常高的进程。
但是,从top中看到有Tasks 5 running,以及vmstat 看到CPU的r队列一直维持在比较高的数值。同时 ,top里也看到有状态为R的进程是stress,且数量只有2个左右,这并没有达到5个左右。进程pid分别是28953,28955.
三 问题分析
1 跟进分析状态为R的进程
[root@localhost ~]# ps -ef|grep 28953 root 19064 6076 0 11:21 pts/4 00:00:00 grep --color=auto 28953 [root@localhost ~]# ps -ef|grep 28955 root 19645 6076 0 11:21 pts/4 00:00:00 grep --color=auto 28955 [root@localhost ~]#
此时,并没有看到状态为R的进程28953,28955的相信信息。也就是说,这两个进程可能很快就执行完了,一闪而过。或者这进程在不停重启。
于是,可以继续观察top的输出结果,果然,状态为R的进程stress,其进程号又不停的发生了变化。
2 进程pid不断变化可能的原因
- 第一个原因,进程在不停地崩溃重启,比如因为段错误、配置错误等等,这时,进程在退出后可能又被监控系统自动重启了。
- 第二个原因,这些进程都是短时进程,也就是在其他应用内部通过 exec 调用的外面命令。这些命令一般都只运行很短的时间就会结束,你很难用 top 这种间隔时间比较长的工具发现(上面的案例,我们碰巧发现了)。
3 利用pstree查看进程树关系
[root@localhost ~]# pstree|grep stress | | |-docker-containe-+-php-fpm-+-php-fpm---sh---stress---stress | | | | `-2*[php-fpm---sh---stress] [root@localhost ~]# pstree|grep stress | | |-docker-containe-+-php-fpm-+-php-fpm---sh---stress---stress [root@localhost ~]#
果然,看到stress进程跟我们服务端的web服务相关。
4 分析docker web程序的配置
[root@localhost ~]# docker cp phpfpm:/app . [root@localhost ~]# grep 'stress' -r app app/index.php:// fake I/O with stress (via write()/unlink()). app/index.php:$result = exec("/usr/local/bin/stress -t 1 -d 1 2>&1", $output, $status); [root@localhost ~]# cat app/index.php <?php // fake I/O with stress (via write()/unlink()). $result = exec("/usr/local/bin/stress -t 1 -d 1 2>&1", $output, $status); if (isset($_GET["verbose"]) && $_GET["verbose"]==1 && $status != 0) { echo "Server internal error: "; print_r($output); } else { echo "It works!"; } ?>[root@localhost ~]#
到这里,基本找到源头了。原来是我们用于模拟服务器端web服务中的php文件中的测试程序出的问题,
$result = exec(“/usr/local/bin/stress -t 1 -d 1 2>&1”, $output, $status);
在客户端新开一个会话,执行:
[root@localhost ~]# curl http://172.16.11.148:10000?verbose=1 Server internal error: Array ( [0] => stress: info: [1218] dispatching hogs: 0 cpu, 0 io, 0 vm, 1 hdd [1] => stress: FAIL: [1219] (563) mkstemp failed: Permission denied [2] => stress: FAIL: [1218] (394) <-- worker 1219 returned error 1 [3] => stress: WARN: [1218] (396) now reaping child worker processes [4] => stress: FAIL: [1218] (400) kill error: No such process [5] => stress: FAIL: [1218] (451) failed run completed in 0s ) [root@localhost ~]#
客户端每次发送一个请求时,就执行了index.php文件,该文件中执行了上述代码:
$result = exec(“/usr/local/bin/stress -t 1 -d 1 2>&1”, $output, $status);
由于失败了,马上报错,退出,再请求,再次执行stress命令,又报错失败了。这样就简单理解为恶性循环,就相当于是stress进程不停重启。进而导致CPU使用率非常之高,而我们又看不到消耗CPU资源的进程信息。
5 佐证分析
我们可以使用前面的perf -g record;perf report来分析系统性能问题。
[root@localhost ~]# perf report Samples: 114K of event 'cycles', Event count (approx.): 66848389319 Children Self Command Shared Object Symbol + 4.25% 0.39% stress [kernel.kallsyms] [k] page_fault ◆ + 3.86% 0.02% stress [kernel.kallsyms] [k] do_page_fault ▒ + 3.79% 0.09% stress [kernel.kallsyms] [k] __do_page_fault ▒ + 3.56% 0.21% stress [kernel.kallsyms] [k] handle_mm_fault ▒ + 3.51% 0.00% php-fpm libc-2.24.so [.] 0x00007fc4227e5c71 ▒ + 3.18% 0.00% php-fpm libc-2.24.so [.] 0x00007fc42283538b ▒ + 3.15% 0.09% stress [kernel.kallsyms] [k] handle_pte_fault ▒ + 3.10% 0.00% php-fpm [kernel.kallsyms] [k] stub_clone ▒ + 3.10% 0.00% php-fpm [kernel.kallsyms] [k] sys_clone ▒ + 3.10% 0.00% php-fpm [kernel.kallsyms] [k] do_fork ▒ + 3.05% 0.02% php-fpm [kernel.kallsyms] [k] copy_process ▒ 3.03% 3.03% stress libc-2.24.so [.] 0x0000000000036387 ▒ 2.99% 2.99% stress stress [.] 0x0000000000002f14 ▒ + 2.89% 0.26% php-fpm [kernel.kallsyms] [k] dup_mm ▒ + 2.87% 0.00% php-fpm libc-2.24.so [.] 0x00007fc422835647 ▒ + 2.87% 0.00% php-fpm [kernel.kallsyms] [k] stub_execve ▒ + 2.87% 0.00% php-fpm [kernel.kallsyms] [k] sys_execve ▒ + 2.86% 0.00% php-fpm [kernel.kallsyms] [k] do_execve_common.isra.24 ▒ + 2.64% 0.00% php-fpm [unknown] [.] 0x6cb6258d4c544155 ▒ + 2.64% 0.00% php-fpm libc-2.24.so [.] 0x00007fc42279d2e1 ▒ + 2.50% 0.00% php-fpm [kernel.kallsyms] [k] search_binary_handler ▒ + 2.49% 0.00% php-fpm [kernel.kallsyms] [k] load_elf_binary ▒ + 2.39% 0.00% php-fpm [kernel.kallsyms] [k] flush_old_exec ▒ + 2.38% 0.00% php-fpm [kernel.kallsyms] [k] mmput ▒ + 2.36% 0.01% php-fpm [kernel.kallsyms] [k] exit_mmap ▒ + 2.33% 0.01% stress [kernel.kallsyms] [k] tracesys ▒ + 1.90% 0.08% stress [kernel.kallsyms] [k] apic_timer_interrupt ▒ 1.80% 1.80% stress stress [.] 0x0000000000002eff ▒ + 1.78% 0.01% stress [kernel.kallsyms] [k] smp_apic_timer_interrupt ▒ + 1.74% 0.06% stress [kernel.kallsyms] [k] __alloc_pages_nodemask ▒ 1.73% 1.73% stress stress [.] 0x0000000000002ee5 ▒ 1.67% 1.67% stress libc-2.24.so [.] 0x0000000000036829
6 补充查看
由于在172.16.11.148这台机器上看到的perf report结果不是特别直观,见上述。可以,通过把perf采集的perf.data文件cp到当前机器上的docker容器phpfpm里,在这个docker容器里跑的是Debian系统,在它上面进行安装软件包,看的效果就很明显了。
当前机器172.16.11.148机器上perf -g record命令采集的数据perf.data [root@localhost ~]# pwd /root [root@localhost ~]# ll perf.data -rw------- 1 root root 20755944 9月 16 08:43 perf.data [root@localhost ~]# 当前机器172.16.11.148机器上运行的docker容器: [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 29a2ad2386f7 feisky/php-fpm:sp "php-fpm -F --pid ..." 2 days ago Up 2 days phpfpm 5fffa93ef2cd feisky/nginx:sp "nginx -g 'daemon ..." 2 days ago Up 2 days 0.0.0.0:10000->80/tcp nginx [root@localhost ~]# cp perf.data到容器里: [root@localhost ~]# docker cp perf.data phpfpm:/tmp [root@localhost ~]# 进入docker容器: [root@localhost ~]# docker exec -i -t phpfpm bash root@5fffa93ef2cd:/app# hostname 5fffa93ef2cd root@5fffa93ef2cd:/app# root@5fffa93ef2cd:/app# cat /etc/issue Debian GNU/Linux 9 \n \l root@5fffa93ef2cd:/app# cat /etc/hosts 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.2 5fffa93ef2cd root@5fffa93ef2cd:/app# cd /tmp 更新apt-get软件包,并安装性能分析工具包: root@5fffa93ef2cd:/tmp# apt-get update Get:1 http://security.debian.org stretch/updates InRelease [53.0 kB] Ign:2 http://httpredir.debian.org/debian stretch InRelease Get:3 http://httpredir.debian.org/debian stretch Release [118 kB] Get:4 http://httpredir.debian.org/debian stretch Release.gpg [3177 B] Get:5 http://security.debian.org stretch/updates/main amd64 Packages [909 kB] Get:6 http://httpredir.debian.org/debian stretch/main amd64 Packages [9610 kB] Fetched 10.7 MB in 4s (2577 kB/s) Reading package lists... Done root@5fffa93ef2cd:/tmp# apt-get install -y linux-perf linux-tools procps Reading package lists... Done Building dependency tree Reading state information... Done The following additional packages will be installed: ... ... Setting up linux-tools (4.9+80+deb9u14) ... Processing triggers for libc-bin (2.24-11+deb9u3) ... root@5fffa93ef2cd:/tmp# 执行分析: root@5fffa93ef2cd:/tmp# perf_4.9 report report Read perf.data (created by perf record) and display the profile sched Tool to trace/measure scheduler properties (latencies) script Read perf.data (created by perf record) and display trace output Samples: 130K of event 'cycles', Event count (approx.): 96230260054 Children Self Command Shared Object Symbol + 73.71% 0.02% stress stress [.] main + 30.12% 26.88% stress stress [.] hoghdd + 19.81% 19.57% stress libc-2.24.so [.] random_r + 17.45% 17.27% stress libc-2.24.so [.] random + 4.04% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb9716768 + 4.01% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb971a925 + 3.89% 3.83% stress libc-2.24.so [.] rand + 3.76% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb971a597 + 3.73% 0.01% php-fpm libc-2.24.so [.] _IO_proc_open + 3.36% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb91c747d + 3.21% 0.02% php-fpm libc-2.24.so [.] __libc_fork + 3.09% 0.00% php-fpm libc-2.24.so [.] execve + 3.09% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb971fd58 + 3.08% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb9223ba9 + 3.02% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb971fb94 + 3.02% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb9090a76 + 2.99% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb9090761 + 2.89% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb922380b + 2.88% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb908ffc2 + 2.88% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb922202f + 2.82% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb927e44c + 2.80% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb9222a90 + 2.80% 0.00% php-fpm [kernel.kallsyms] [k] 0xffffffffb908e0f7 + 2.48% 0.00% php-fpm libc-2.24.so [.] __libc_start_main + 2.48% 0.00% php-fpm [unknown] [k] 0x6cb6258d4c544155 + 2.19% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb971fa51 + 1.92% 0.00% stress [kernel.kallsyms] [k] 0xffffffffb919e157
看到有stress进程占用了大量CPU资源。
四 问题小结
该案例中,系统CPU资源使用率非常高,但是却找不到消耗CPU资源的进程的场景。着实比较恼人,但是我们也有对应的分析思路。
如果CPU使用率高,又找不到消耗CPU的进程。我们应该联想到,可能是短时应用带来的问题:
应用系统/程序里直接调用了其它二进制或者是可执行程序,这些被调用的程序运行时间非常短,且频繁的运行,这时通过top等工具无法捕捉到消耗CPU资源的进程;
这时,我们可以借助pstree或者execsnoop工具,找到进程的父进程,通过父进程进一步排查。
碰到常规情形下,明明CPU使用率很高却找不到是哪些进程占用了CPU资源时,通常是由于下面2种情形:
1 某些应用程序里直接调用了其它可执行的二进制程序,并且这些被调用程序执行时间非常短,转瞬即逝的就执行完了,通过top/ps等工具根本看不到或者很难看到这些进程在执行;本案例就是这种情况。
2 某些应用程序自己在不停的崩溃重启,进程启动过程里初始化资源时,可能会占用了很多的CPU资源。
五 补充
针对短时进程(short lived process),我们也可以使用Brendan Gregg开发的execsnoop工具来分析。
5.1 execsnoop作用
从名称上可以看出exec表示execution ,snoop窥探,窥视的意思。用于监控、窥探可执行程序的工具。
5.2 execsnoop官网
可以从Brendan Gregg的GitHub仓库:
https://github.com/brendangregg/perf-tools/blob/master/execsnoop
5.3 安装和使用
本地机器touch 1个名为execsnoop的文件,其内容为直接拷贝、粘贴上述仓库地址中该文件的代码。然后,修改文件的可执行权限即可。
使用的时候,直接./execsnoop就可以了。
使用帮助,./execsnoop -h
5.4 使用execsnoop来分析本案例
[root@guoxin7 ~]# ./execsnoop Tracing exec()s. Ctrl-C to end. Instrumenting sys_execve PID PPID ARGS 16367 16365 cat -v trace_pipe ... 16854 16852 /usr/local/bin/stress -t 1 -d 1 16853 16851 /usr/local/bin/stress -t 1 -d 1 16855 27487 sh-16855 [002] d... 18225460.690274: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16850 16849 /usr/local/bin/stress -t 1 -d 1 16859 16855 /usr/local/bin/stress -t 1 -d 1 16861 27515 sh-16861 [003] d... 18225460.693129: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16862 16861 /usr/local/bin/stress -t 1 -d 1 16865 27492 sh-16865 [002] d... 18225460.710012: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16864 27499 php-fpm-16864 [002] d... 18225460.710384: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16866 16865 /usr/local/bin/stress -t 1 -d 1 16868 27504 sh-16868 [002] d... 18225460.712300: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16870 16868 /usr/local/bin/stress -t 1 -d 1 16869 16864 /usr/local/bin/stress -t 1 -d 1 16873 27487 sh-16873 [001] d... 18225460.716239: execsnoop_sys_execve: (SyS_execve+0x0/0x30) 16874 16873 /usr/local/bin/stress -t 1 -d 1 ....
可以看到,系统中有非常多的short lived process。
六 参考链接
https://www.brendangregg.com/blog/2014-07-28/execsnoop-for-linux.html
案例源于倪朋飞老师的《Linux 性能优化实战》付费课程06 | 案例篇:系统的 CPU 使用率很高,但为啥却找不到高 CPU 的应用?