观测工具下载地址:https://github.com/iovisor/bcc
bcc观测工具的安装方式:https://github.com/iovisor/bcc/blob/master/INSTALL.md
工具简介:
BCC makes BPF programs easier to write, with kernel instrumentation in C (and includes a C wrapper around LLVM), and front-ends in Python and lua. It is suited for many tasks, including performance analysis and network traffic control.
BCC 是用于创建高效内核跟踪和操作程序的工具包,包括一些有用的工具和示例。它利用了扩展的BPF(Berkeley Packet Filters),正式名称为 eBPF。
使用要求:
1)Linux 内核版本最低 4.1
2)kernel-devel 版本必须和内核版本一致
[root@yang-01 ~]# rpm -qa|grep -i kernel | grep -i devel
kernel-devel-3.10.0-1127.18.2.el7.x86_64
[root@yang-01 ~]# uname -r
3.10.0-1127.el7.x86_64
3)kernel 配置文件相关参数必须按照下面的要求
[root@yang-01 ~]# grep -i BPF /boot/config-`uname -r`
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_BPF_JIT_ALWAYS_ON=y
CONFIG_NETFILTER_XT_MATCH_BPF=m
CONFIG_NET_CLS_BPF=m
CONFIG_BPF_JIT=y
CONFIG_HAVE_EBPF_JIT=y
CONFIG_BPF_EVENTS=y
CONFIG_BPF_KPROBE_OVERRIDE=y
4)对于 CentOS 建议升级到 3.6 及以上版本
5)使用默认的 Python 2.7 即可,不需要升级 Python 3
[root
@yang
-
01
~]# cat /etc/redhat-release
CentOS Linux release
7.8
.
2003
(Core)
[root
@yang
-
01
~]# uname -r
3.10
.
0
-
1127
.el7.x86_64
[root
@yang
-
01
~]# yum update kernel
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.cn99.com
* epel: mirrors.yun-idc.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package kernel.x86_64
0
:
3.10
.
0
-
1127.18
.
2
.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================
Installing:
kernel x86_64
3.10
.
0
-
1127.18
.
2
.el7 updates
50
M
Transaction Summary
===========================================================================================================================================================================
Install
1
Package
Total download size:
50
M
Installed size:
64
M
Is
this
ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
kernel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64.rpm |
50
MB
00
:
00
:
08
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : kernel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64
1
/
1
Verifying : kernel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64
1
/
1
Installed:
kernel.x86_64
0
:
3.10
.
0
-
1127.18
.
2
.el7
Complete!
[root
@yang
-
01
~]# yum install bcc -y
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.cn99.com
* epel: mirrors.yun-idc.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package bcc.x86_64
0
:
0.10
.
0
-
1
.el7 will be installed
--> Processing Dependency: bcc-tools =
0.10
.
0
-
1
.el7
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: llvm-
private
>=
6.0
.
1
-
0.3
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libLLVM-
7
-rhel.so(LLVM_7)(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangSerialization.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangSema.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangRewrite.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangParse.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangLex.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangFrontend.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangEdit.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangDriver.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangCodeGen.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangBasic.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangAnalysis.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libclangAST.so.
7
()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: libLLVM-
7
-rhel.so()(64bit)
for
package
: bcc-
0.10
.
0
-
1
.el7.x86_64
--> Running transaction check
---> Package bcc-tools.x86_64
0
:
0.10
.
0
-
1
.el7 will be installed
--> Processing Dependency: python-bcc =
0.10
.
0
-
1
.el7
for
package
: bcc-tools-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: python-netaddr
for
package
: bcc-tools-
0.10
.
0
-
1
.el7.x86_64
--> Processing Dependency: kernel-devel
for
package
: bcc-tools-
0.10
.
0
-
1
.el7.x86_64
---> Package llvm-
private
.x86_64
0
:
7.0
.
1
-
1
.el7 will be installed
--> Running transaction check
---> Package kernel-devel.x86_64
0
:
3.10
.
0
-
1127.18
.
2
.el7 will be installed
---> Package python-bcc.x86_64
0
:
0.10
.
0
-
1
.el7 will be installed
---> Package python-netaddr.noarch
0
:
0.7
.
5
-
9
.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================
Installing:
bcc x86_64
0.10
.
0
-
1
.el7 base
567
k
Installing
for
dependencies:
bcc-tools x86_64
0.10
.
0
-
1
.el7 base
394
k
kernel-devel x86_64
3.10
.
0
-
1127.18
.
2
.el7 updates
18
M
llvm-
private
x86_64
7.0
.
1
-
1
.el7 base
23
M
python-bcc x86_64
0.10
.
0
-
1
.el7 base
74
k
python-netaddr noarch
0.7
.
5
-
9
.el7 base
983
k
Transaction Summary
===========================================================================================================================================================================
Install
1
Package (+
5
Dependent packages)
Total download size:
42
M
Installed size:
126
M
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
(
1
/
6
): bcc-tools-
0.10
.
0
-
1
.el7.x86_64.rpm |
394
kB
00
:
00
:
05
(
2
/
6
): bcc-
0.10
.
0
-
1
.el7.x86_64.rpm |
567
kB
00
:
00
:
05
(
3
/
6
): python-bcc-
0.10
.
0
-
1
.el7.x86_64.rpm |
74
kB
00
:
00
:
00
(
4
/
6
): python-netaddr-
0.7
.
5
-
9
.el7.noarch.rpm |
983
kB
00
:
00
:
00
(
5
/
6
): kernel-devel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64.rpm |
18
MB
00
:
00
:
06
(
6
/
6
): llvm-
private
-
7.0
.
1
-
1
.el7.x86_64.rpm |
23
MB
00
:
00
:
30
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total
1.4
MB/s |
42
MB
00
:
00
:
30
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : llvm-
private
-
7.0
.
1
-
1
.el7.x86_64
1
/
6
Installing : kernel-devel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64
2
/
6
Installing : python-netaddr-
0.7
.
5
-
9
.el7.noarch
3
/
6
Installing : python-bcc-
0.10
.
0
-
1
.el7.x86_64
4
/
6
Installing : bcc-tools-
0.10
.
0
-
1
.el7.x86_64
5
/
6
Installing : bcc-
0.10
.
0
-
1
.el7.x86_64
6
/
6
Verifying : python-netaddr-
0.7
.
5
-
9
.el7.noarch
1
/
6
Verifying : python-bcc-
0.10
.
0
-
1
.el7.x86_64
2
/
6
Verifying : bcc-
0.10
.
0
-
1
.el7.x86_64
3
/
6
Verifying : kernel-devel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64
4
/
6
Verifying : bcc-tools-
0.10
.
0
-
1
.el7.x86_64
5
/
6
Verifying : llvm-
private
-
7.0
.
1
-
1
.el7.x86_64
6
/
6
Installed:
bcc.x86_64
0
:
0.10
.
0
-
1
.el7
Dependency Installed:
bcc-tools.x86_64
0
:
0.10
.
0
-
1
.el7 kernel-devel.x86_64
0
:
3.10
.
0
-
1127.18
.
2
.el7 llvm-
private
.x86_64
0
:
7.0
.
1
-
1
.el7 python-bcc.x86_64
0
:
0.10
.
0
-
1
.el7
python-netaddr.noarch
0
:
0.7
.
5
-
9
.el7
Complete!
[root
@yang
-
01
tools]# pwd
/usr/share/bcc/tools
[root
@yang
-
01
tools]# ls
argdist cachestat dcstat fileslower javagc mountsnoop opensnoop pythoncalls rubystat sslsniff tcpaccept tplist
bashreadline cachetop deadlock filetop javaobjnew mysqld_qslower perlcalls pythonflow runqlat stackcount tcpconnect trace
biolatency capable deadlock.c funccount javastat nfsdist perlflow pythongc runqlen statsnoop tcpconnlat ttysnoop
biosnoop cobjnew doc funclatency javathreads nfsslower perlstat pythonstat runqslower syncsnoop tcpdrop vfscount
biotop cpudist drsnoop funcslower killsnoop nodegc phpcalls reset-trace shmsnoop syscount tcplife vfsstat
bitesize cpuunclaimed execsnoop gethostlatency lib nodestat phpflow rubycalls slabratetop tclcalls tcpretrans wakeuptime
bpflist dbslower ext4dist hardirqs llcstat offcputime phpstat rubyflow sofdsnoop tclflow tcpsubnet xfsdist
btrfsdist dbstat ext4slower javacalls mdflush offwaketime pidpersec rubygc softirqs tclobjnew tcptop xfsslower
btrfsslower dcsnoop filelife javaflow memleak oomkill profile rubyobjnew solisten tclstat tcptracer
|
# 报错举例
[root
@yang
-
01
~]# cachestat
1
3
modprobe: FATAL: Module kheaders not found.
chdir(/lib/modules/
3.10
.
0
-
1127
.el7.x86_64/build): No such file or directory
Traceback (most recent call last):
File
"/usr/share/bcc/tools/cachestat"
, line
96
, in <module>
b = BPF(text=bpf_text)
File
"/usr/lib/python2.7/site-packages/bcc/__init__.py"
, line
325
, in __init__
raise Exception(
"Failed to compile BPF text"
)
Exception: Failed to compile BPF text
# 发现报错,这时需要进行内核版本的查看,确保 kernel-devel 与系统上当前安装的内核版本匹配
[root
@yang
-
01
tools]# rpm -qa|grep -i kernel | grep -i devel
kernel-devel-
3.10
.
0
-
1127.18
.
2
.el7.x86_64
[root
@yang
-
01
tools]# uname -r
3.10
.
0
-
1127
.el7.x86_64
[root
@yang
-
01
tools]# yum install
"kernel-devel-uname-r == $(uname -r)"
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.cn99.com
* epel: mirrors.yun-idc.com
* extras: mirrors.aliyun.com
* updates: mirrors.aliyun.com
Resolving Dependencies
--> Running transaction check
---> Package kernel-devel.x86_64
0
:
3.10
.
0
-
1127
.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
===========================================================================================================================================================================
Package Arch Version Repository Size
===========================================================================================================================================================================
Installing:
kernel-devel x86_64
3.10
.
0
-
1127
.el7 base
18
M
Transaction Summary
===========================================================================================================================================================================
Install
1
Package
Total download size:
18
M
Installed size:
38
M
Is
this
ok [y/d/N]: y
Downloading packages:
Delta RPMs disabled because /usr/bin/applydeltarpm not installed.
kernel-devel-
3.10
.
0
-
1127
.el7.x86_64.rpm |
18
MB
00
:
00
:
06
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : kernel-devel-
3.10
.
0
-
1127
.el7.x86_64
1
/
1
Verifying : kernel-devel-
3.10
.
0
-
1127
.el7.x86_64
1
/
1
Installed:
kernel-devel.x86_64
0
:
3.10
.
0
-
1127
.el7
Complete!
|
报错: 在安装kernel-devel显示 No
package
No
package
kernel-devel-uname-r ==
5.6
.
2
-
1
.el7.elrepo.x86_64 available.
解决办法: 启用[elrepo-kerne]存储库,
# vim /etc/yum.repos.d/elrepo.repo
[elrepo-kernel]
name=ELRepo.org Community Enterprise Linux Kernel Repository - el7
baseurl=http:
//elrepo.org/linux/kernel/el7/$basearch/
http:
//mirrors.coreix.net/elrepo/kernel/el7/$basearch/
http:
//mirror.rackspace.com/elrepo/kernel/el7/$basearch/
http:
//repos.lax-noc.com/elrepo/kernel/el7/$basearch/
http:
//mirror.ventraip.net.au/elrepo/kernel/el7/$basearch/
mirrorlist=http:
//mirrors.elrepo.org/mirrors-elrepo-kernel.el7
# 修改这一行将
0
改为
1
enabled=
1
然后重新执行:
# sudo yum install
"kernel-devel-uname-r == $(uname -r)"
|
[root
@yang
-
01
tools]# cachestat
1
5
HITS MISSES DIRTIES HITRATIO BUFFERS_MB CACHED_MB
1409
0
77
100.00
%
1
2440
1438
0
101
100.00
%
1
2440
1413
0
68
100.00
%
1
2440
1412
0
117
100.00
%
1
2440
1411
0
72
100.00
%
1
2440
第一个参数为间隔秒,第二个参数为输出次数
TOTAL ,表示总的 I/O 次数
MISSES ,表示缓存未命中的次数
HITS ,表示缓存命中的次数
DIRTIES, 表示新增到缓存中的脏页数
BUFFERS_MB 表示 Buffers 的大小,以 MB 为单位
CACHED_MB 表示 Cache 的大小,以 MB 为单位
[root
@yang
-
01
tools]# cachetop
16
:
24
:
15
Buffers MB:
1
/ Cached MB:
2443
/ Sort: HITS / Order: ascending
PID UID CMD HITS MISSES DIRTIES READ_HIT% WRITE_HIT%
1653
actionte ustats
1
0
0
100.0
%
0.0
%
1778
actionte umon-mgr
1
0
0
100.0
%
0.0
%
903
mysql jsvc
1
0
0
100.0
%
0.0
%
10909
actionte mysqld
2
0
0
100.0
%
0.0
%
22506
actionte uproxy
2
0
1
50.0
%
0.0
%
869
mysql jsvc
2
2
2
0.0
%
0.0
%
10788
actionte mysqld
3
0
0
100.0
%
0.0
%
1724
actionte urman-agent
4
2
2
33.3
%
0.0
%
21780
actionte uguard-agent
4
2
2
33.3
%
0.0
%
12798
actionte ustats
6
0
0
100.0
%
0.0
%
12799
actionte ustats
6
0
0
100.0
%
0.0
%
12800
actionte ustats
6
0
0
100.0
%
0.0
%
这个命令的输出和top类似,默认按照缓存的命中次数(HITS)排序,展示了每个进程的缓存命中情况。
这里的 HITS、MISSES 和 DIRTIES ,跟 cachestat 里的含义一样,分别代表间隔时间内的缓存命中次数、未命中次数以及新增到缓存中的脏页数。
而 READ_HIT 和 WRITE_HIT ,分别表示读和写的缓存命中率。
|
# 查看新的进程。那些会消耗系统资源,但很短暂的进程,它们甚至不会出现在 top(
1
) 命令或其它工具中的显示之中。这些新进程可以使用 execsnoop 进行检测(或使用行业术语说,可以被追踪traced)。
[root
@yang
-
01
tools]# execsnoop -h
usage: execsnoop [-h] [-t] [-x] [-q] [-n NAME] [-l LINE] [--max-args MAX_ARGS]
Trace exec() syscalls
optional arguments:
-h, --help show
this
help message and exit
-t, --timestamp include timestamp on output
-x, --fails include failed exec()s
-q, --quote Add quotemarks (") around arguments.
-n NAME, --name NAME only print commands matching
this
name (regex), any
arg
-l LINE, --line LINE only print commands where arg contains
this
line
(regex)
--max-args MAX_ARGS maximum number of arguments parsed and displayed,
defaults to
20
examples:
./execsnoop # trace all exec() syscalls
./execsnoop -x # include failed exec()s
./execsnoop -t # include timestamps
./execsnoop -q # add
"quotemarks"
around arguments
./execsnoop -n main # only print command lines containing
"main"
./execsnoop -l tpkg # only print command where arguments contains
"tpkg"
[root
@yang
-
01
tools]# execsnoop
PCOMM PID PPID RET ARGS
bash
17436
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_5690.service
bash
17437
1642
0
systemctl
17437
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_3307.service /usr/bin/systemctl is-active mysqld_3307.service
systemctl
17436
1642
0
/usr/bin/systemctl is-active mysqld_5690.service
bash
17439
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_3307.service
systemctl
17439
1642
0
/usr/bin/systemctl is-active mysqld_3307.service
bash
17440
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_5690.service
systemctl
17440
1642
0
/usr/bin/systemctl is-active mysqld_5690.service
bash
17442
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_3307.service
systemctl
17442
1642
0
/usr/bin/systemctl is-active mysqld_3307.service
bash
17443
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_5690.service
systemctl
17443
1642
0
/usr/bin/systemctl is-active mysqld_5690.service
bash
17445
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_3307.service
bash
17446
1642
0
/usr/bin/bash --noprofile --norc -c systemctl is-active mysqld_5690.service
##################################################################################################################################################################
# opensnoop 通过跟踪 open() 系统调用来工作。opensnoop 的一些优点在于它能在系统范围内工作,并且跟踪所有进程的 open() 系统调用。
[root
@yang
-
01
tools]# opensnoop -h
usage: opensnoop [-h] [-T] [-U] [-x] [-p PID] [-t TID] [-u UID] [-d DURATION]
[-n NAME] [-e] [-f FLAG_FILTER]
Trace open() syscalls
optional arguments:
-h, --help show
this
help message and exit
-T, --timestamp include timestamp on output
-U, --print-uid print UID column
-x, --failed only show failed opens
-p PID, --pid PID trace
this
PID only
-t TID, --tid TID trace
this
TID only
-u UID, --uid UID trace
this
UID only
-d DURATION, --duration DURATION
total duration of trace in seconds
-n NAME, --name NAME only print process names containing
this
name
-e, --extended_fields
show extended fields
-f FLAG_FILTER, --flag_filter FLAG_FILTER
filter on flags argument (e.g., O_WRONLY)
examples:
./opensnoop # trace all open() syscalls
./opensnoop -T # include timestamps
./opensnoop -U # include UID
./opensnoop -x # only show failed opens
./opensnoop -p
181
# only trace PID
181
./opensnoop -t
123
# only trace TID
123
./opensnoop -u
1000
# only trace UID
1000
./opensnoop -d
10
# trace
for
10
seconds only
./opensnoop -n main # only print process names containing
"main"
./opensnoop -e # show extended fields
./opensnoop -f O_WRONLY -f O_RDWR # only print calls
for
writing
[root
@yang
-
01
tools]# opensnoop
PID COMM FD ERR PATH
1642
ustats
14
0
./logs
18699
opensnoop -
1
2
/usr/lib64/python2.
7
/encodings/ascii.so
18699
opensnoop -
1
2
/usr/lib64/python2.
7
/encodings/asciimodule.so
18699
opensnoop
16
0
/usr/lib64/python2.
7
/encodings/ascii.py
18699
opensnoop
17
0
/usr/lib64/python2.
7
/encodings/ascii.pyc
1309
uagent
16
0
/action-dmp/ustats/ustats.pid
1309
uagent
16
0
/proc/
1642
/cmdline
1309
uagent
16
0
/action-dmp/umon-mgr/umon-mgr.pid
1309
uagent
16
0
/proc/
1684
/cmdline
1309
uagent
16
0
/action-dmp/urman-agent/urman-agent.pid
1309
uagent
16
0
/proc/
1672
/cmdline
1309
uagent
16
0
/action-dmp/ucore/ucore.pid
1309
uagent
16
0
/proc/
1538
/cmdline
1309
uagent
16
0
/action-dmp/uguard-agent/uguard-agent.pid
1309
uagent
16
0
/proc/
1664
/cmdline
1309
uagent
16
0
/action-dmp/uguard-mgr/uguard-mgr.pid
1309
uagent
16
0
/proc/
1636
/cmdline
1309
uagent
16
0
/action-dmp/umon/umon.pid
1309
uagent
16
0
/proc/
1734
/cmdline
1309
uagent
16
0
/action-dmp/udeploy/udeploy.pid
1309
uagent
16
0
/proc/
1644
/cmdline
1309
uagent
16
0
/action-dmp/umc/umc.pid
1309
uagent
16
0
/proc/
1638
/cmdline
1309
uagent
16
0
/action-dmp/uproxy/uproxy.pid
1309
uagent
16
0
/proc/
22496
/cmdline
1309
uagent
16
0
/action-dmp/urman-mgr/urman-mgr.pid
1309
uagent
16
0
/proc/
1640
/cmdline
1664
uguard-agent
18
0
./logs
1642
ustats
14
0
/dev/
null
1642
ustats
40
0
/dev/
null
18703
bash
3
0
/etc/ld.so.cache
18703
bash
3
0
/lib64/libtinfo.so.
5
18703
bash
3
0
/lib64/libdl.so.
2
18703
bash
3
0
/lib64/libc.so.
6
18703
bash -
1
6
/dev/tty
18703
bash
3
0
/usr/lib/locale/locale-archive
18703
bash
3
0
/proc/meminfo
18703
bash
3
0
/usr/lib64/gconv/gconv-modules.cache
18703
bash
3
0
/etc/nsswitch.conf
18703
bash
3
0
/etc/ld.so.cache
18703
bash
3
0
/lib64/libnss_files.so.
2
18703
bash
3
0
/etc/passwd
5448
mysqld -
1
2
./universe/u_delay.frm
18703
systemctl
3
0
/etc/ld.so.cache
18703
systemctl
3
0
/lib64/librt.so.
1
18703
systemctl
3
0
/lib64/libselinux.so.
1
18703
systemctl
3
0
/lib64/liblzma.so.
5
18703
systemctl
3
0
/lib64/liblz4.so.
1
18703
systemctl
3
0
/lib64/libgcrypt.so.
11
18703
systemctl
3
0
/lib64/libcap.so.
2
18703
systemctl
3
0
/lib64/libgcc_s.so.
1
18703
systemctl
3
0
/lib64/libpthread.so.
0
18703
systemctl
3
0
/lib64/libc.so.
6
18703
systemctl
3
0
/lib64/libpcre.so.
1
18703
systemctl
3
0
/lib64/libdl.so.
2
18703
systemctl
3
0
/lib64/libgpg-error.so.
0
18703
systemctl
3
0
/lib64/libattr.so.
1
18704
bash
3
0
/etc/ld.so.cache
18704
bash
3
0
/lib64/libtinfo.so.
5
##################################################################################################################################################################
# xfsslower 工具可以跟踪大于
1
毫秒(参数)延迟的常见 XFS 文件系统操作。
# 在 xfsslower 工具运行的时候,通过在 XFS 中动态地检测内核函数实现的,并当它结束的时候解除该检测。
# 这个 bcc 工具也有其它文件系统的版本:ext4slower、btrfsslower、zfsslower 和 nfsslower。
[root
@yang
-
01
tools]# xfsslower -h
usage: xfsslower [-h] [-j] [-p PID] [min_ms]
Trace common XFS file operations slower than a threshold
positional arguments:
min_ms minimum I/O duration to trace, in ms (
default
10
)
optional arguments:
-h, --help show
this
help message and exit
-j, --csv just print fields: comma-separated values
-p PID, --pid PID trace
this
PID only
examples:
./xfsslower # trace operations slower than
10
ms (
default
)
./xfsslower
1
# trace operations slower than
1
ms
./xfsslower -j
1
# ...
1
ms, parsable output (csv)
./xfsslower
0
# trace all operations (warning: verbose)
./xfsslower -p
185
# trace PID
185
only
[root
@yang
-
01
tools]# xfsslower
1
Tracing XFS operations slower than
1
ms
TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
17
:
02
:
44
umon-mgr
1684
S
0
0
5.93
detail.log
17
:
02
:
44
umc
1638
S
0
0
1.05
detail.log
17
:
02
:
45
mysqld
10763
W
81920
0
8.12
temp_16.ibt
17
:
02
:
45
mysqld
10763
W
16384
80
2.16
temp_16.ibt
17
:
02
:
45
ustats
1642
S
0
0
3.12
brief.log
17
:
02
:
46
mysqld
10763
W
835584
1024
7.81
ibdata1
17
:
02
:
46
mysqld
10763
S
0
0
31.14
ib_logfile0
17
:
02
:
46
ucore
1538
S
0
0
5.89
raft.db
17
:
02
:
46
ustats
1642
S
0
0
4.04
detail.log
17
:
02
:
46
mysqld
10763
S
0
0
3.58
ib_logfile0
17
:
02
:
46
ustats
1642
S
0
0
1.49
brief.log
17
:
02
:
46
umc
1638
S
0
0
13.70
brief.log
17
:
02
:
46
uguard-mgr
1636
S
0
0
9.62
detail.log
17
:
02
:
46
ucore
1538
S
0
0
8.87
detail.log
17
:
02
:
48
ustats
1642
S
0
0
2.16
brief.log
17
:
02
:
49
ustats
1642
S
0
0
1.41
brief.log
17
:
02
:
49
uguard-agent
1664
S
0
0
26.30
brief.log
17
:
02
:
49
uguard-agent
1664
S
0
0
6.56
detail.log
17
:
02
:
49
mysqld
10763
S
0
0
1.89
ib_logfile0
17
:
02
:
50
ustats
1642
S
0
0
1.01
brief.log
17
:
02
:
50
mysqld
10763
S
0
0
1.18
ib_logfile0
##################################################################################################################################################################
# 可以用来实现高效的内核摘要统计。从内核层到用户层的数据传输仅仅是“计数”列。 用户级程序生成其余的。
[root
@yang
-
01
tools]# biolatency -h
usage: biolatency [-h] [-T] [-Q] [-m] [-D] [-F] [interval] [count]
Summarize block device I/O latency as a histogram
positional arguments:
interval output interval, in seconds
count number of outputs
optional arguments:
-h, --help show
this
help message and exit
-T, --timestamp include timestamp on output
-Q, --queued include OS queued time in I/O time
-m, --milliseconds millisecond histogram
-D, --disks print a histogram per disk device
-F, --flags print a histogram per set of I/O flags
examples:
./biolatency # summarize block I/O latency as a histogram
./biolatency
1
10
# print
1
second summaries,
10
times
./biolatency -mT
1
# 1s summaries, milliseconds, and timestamps
./biolatency -Q # include OS queued time in I/O time
./biolatency -D # show each disk device separately
./biolatency -F # show I/O flags separately
[root
@yang
-
01
tools]# biolatency
Tracing block device I/O... Hit Ctrl-C to end.
^C
usecs : count distribution
0
->
1
:
0
| |
2
->
3
:
0
| |
4
->
7
:
0
| |
8
->
15
:
0
| |
16
->
31
:
13
|* |
32
->
63
:
306
|********************************* |
64
->
127
:
367
|****************************************|
128
->
255
:
254
|*************************** |
256
->
511
:
12
|* |
512
->
1023
:
1
| |
1024
->
2047
:
1
| |
2048
->
4095
:
9
| |
4096
->
8191
:
10
|* |
8192
->
16383
:
9
| |
16384
->
32767
:
3
| |
32768
->
65535
:
2
| |
##################################################################################################################################################################
# tcplife显示 TCP 会话的生命周期和吞吐量统计
[root
@yang
-
01
tools]# tcplife -h
usage: tcplife [-h] [-T] [-t] [-w] [-s] [-p PID] [-L LOCALPORT]
[-D REMOTEPORT]
Trace the lifespan of TCP sessions and summarize
optional arguments:
-h, --help show
this
help message and exit
-T, --time include time column on output (HH:MM:SS)
-t, --timestamp include timestamp on output (seconds)
-w, --wide wide column output (fits IPv6 addresses)
-s, --csv comma separated values output
-p PID, --pid PID trace
this
PID only
-L LOCALPORT, --localport LOCALPORT
comma-separated list of local ports to trace.
-D REMOTEPORT, --remoteport REMOTEPORT
comma-separated list of remote ports to trace.
examples:
./tcplife # trace all TCP connect()s
./tcplife -t # include time column (HH:MM:SS)
./tcplife -w # wider colums (fit IPv6)
./tcplife -stT # csv output, with times & timestamps
./tcplife -p
181
# only trace PID
181
./tcplife -L
80
# only trace local port
80
./tcplife -L
80
,
81
# only trace local ports
80
and
81
./tcplife -D
80
# only trace remote port
80
[root
@yang
-
01
tools]# tcplife
PID COMM LADDR LPORT RADDR RPORT TX_KB RX_KB MS
854
jsvc ::ffff:
127.0
.
0.1
33222
::ffff:
127.0
.
0.1
3307
0
0
1.91
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33222
0
0
1.91
854
jsvc ::ffff:
127.0
.
0.1
33224
::ffff:
127.0
.
0.1
3307
0
0
2.02
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33224
0
0
2.03
1638
umc
10.186
.
60.24
48697
10.186
.
60.24
5704
0
0
3.01
1636
uguard-mgr ::ffff:
10.186
.
60.24
5704
::ffff:
10.186
.
60.24
48697
0
0
3.03
854
jsvc ::ffff:
127.0
.
0.1
33228
::ffff:
127.0
.
0.1
3307
0
0
1.76
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33228
0
0
1.77
1684
umon-mgr ::
1
37504
::
1
8200
0
0
0.03
1684
umon-mgr
127.0
.
0.1
48056
127.0
.
0.1
8200
0
0
0.02
854
jsvc ::ffff:
127.0
.
0.1
33234
::ffff:
127.0
.
0.1
3307
0
0
2.02
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33234
0
0
2.04
1642
ustats
127.0
.
0.1
33236
127.0
.
0.1
3307
0
0
3.13
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33236
0
0
3.15
1642
ustats
127.0
.
0.1
45738
127.0
.
0.1
5690
0
0
3.33
5448
mysqld ::ffff:
127.0
.
0.1
5690
::ffff:
127.0
.
0.1
45738
0
0
3.35
854
jsvc ::ffff:
127.0
.
0.1
33240
::ffff:
127.0
.
0.1
3307
0
0
1.65
10763
mysqld ::ffff:
127.0
.
0.1
3307
::ffff:
127.0
.
0.1
33240
0
0
1.66
####################################################################################################################################################################
# 检测用于名称解析的 gethostbyname(
3
) 和相关的库调用
[root
@yang
-
01
tools]# gethostlatency -h
usage: gethostlatency [-h] [-p PID]
Show latency
for
getaddrinfo/gethostbyname[
2
] calls
optional arguments:
-h, --help show
this
help message and exit
-p PID, --pid PID trace
this
PID only
examples:
./gethostlatency # trace all TCP accept()s
./gethostlatency -p
181
# only trace PID
181
[root
@yang
-
01
tools]# gethostlatency
TIME PID COMM LATms HOST
17
:
37
:
55
903
jsvc
0.28
localhost
17
:
38
:
03
22079
umon
0.28
localhost
17
:
38
:
08
14308
umon-mgr
0.23
localhost
17
:
38
:
16
919
jsvc
0.17
yang-
01
17
:
38
:
25
903
jsvc
0.28
localhost
17
:
38
:
37
24347
umon
0.25
localhost
17
:
38
:
38
1780
umon-mgr
0.34
localhost
17
:
38
:
38
22085
umon
0.22
localhost
17
:
38
:
43
1780
umon-mgr
0.22
localhost
17
:
38
:
45
893
jsvc
0.08
yang-
01
#####################################################################################################################################################################
# trace 工具由 Sasha Goldshtein 提供,并提供了一些基本的 printf(
1
) 功能和自定义探针。
[root
@yang
-
01
tools]# trace -h
usage: trace [-h] [-b BUFFER_PAGES] [-p PID] [-L TID] [-v] [-Z STRING_SIZE]
[-S] [-M MAX_EVENTS] [-t] [-T] [-C] [-B] [-s SYM_FILE_LIST] [-K]
[-U] [-a] [-I header]
probe [probe ...]
Attach to functions and print trace messages.
positional arguments:
probe probe specifier (see examples)
optional arguments:
-h, --help show
this
help message and exit
-b BUFFER_PAGES, --buffer-pages BUFFER_PAGES
number of pages to use
for
perf_events ring buffer
(
default
:
64
)
-p PID, --pid PID id of the process to trace (optional)
-L TID, --tid TID id of the thread to trace (optional)
-v, --verbose print resulting BPF program code before executing
-Z STRING_SIZE, --string-size STRING_SIZE
maximum size to read from strings
-S, --include-self
do
not filter trace's own pid from the trace
-M MAX_EVENTS, --max-events MAX_EVENTS
number of events to print before quitting
-t, --timestamp print timestamp column (offset from trace start)
-T, --time print time column
-C, --print_cpu print CPU id
-B, --bin_cmp allow to use STRCMP with binary values
-s SYM_FILE_LIST, --sym_file_list SYM_FILE_LIST
coma separated list of symbol files to use
for
symbol
resolution
-K, --kernel-stack output kernel stack trace
-U, --user-stack output user stack trace
-a, --address print virtual address in stacks
-I header, --include header
additional header files to include in the BPF program
as either full path, or relative to current working
directory, or relative to
default
kernel header search
path
EXAMPLES:
trace do_sys_open
Trace the open syscall and print a
default
trace message when entered
trace
'do_sys_open "%s", arg2'
Trace the open syscall and print the filename being opened
trace
'sys_read (arg3 > 20000) "read %d bytes", arg3'
Trace the read syscall and print a message
for
reads >
20000
bytes
trace
'r::do_sys_open "%llx", retval'
Trace the
return
from the open syscall and print the
return
value
trace
'c:open (arg2 == 42) "%s %d", arg1, arg2'
Trace the open() call from libc only
if
the flags (arg2) argument is
42
trace
'c:malloc "size = %d", arg1'
Trace malloc calls and print the size being allocated
trace
'p:c:write (arg1 == 1) "writing %d bytes to STDOUT", arg3'
Trace the write() call from libc to monitor writes to STDOUT
trace
'r::__kmalloc (retval == 0) "kmalloc failed!"'
Trace returns from __kmalloc which returned a
null
pointer
trace
'r:c:malloc (retval) "allocated = %x", retval'
Trace returns from malloc and print non-NULL allocated buffers
trace
't:block:block_rq_complete "sectors=%d", args->nr_sector'
Trace the block_rq_complete kernel tracepoint and print # of tx sectors
trace
'u:pthread:pthread_create (arg4 != 0)'
Trace the USDT probe pthread_create when its 4th argument is non-zero
trace
'p::SyS_nanosleep(struct timespec *ts) "sleep for %lld ns", ts->tv_nsec'
Trace the nanosleep syscall and print the sleep duration in ns
trace -I
'linux/fs.h'
\
'p::uprobe_register(struct inode *inode) "a_ops = %llx", inode->i_mapping->a_ops'
Trace the uprobe_register inode mapping ops, and the symbol can be found
in /proc/kallsyms
trace -I
'kernel/sched/sched.h'
\
'p::__account_cfs_rq_runtime(struct cfs_rq *cfs_rq) "%d", cfs_rq->runtime_remaining'
Trace the cfs scheduling runqueue remaining runtime. The struct cfs_rq is defined
in kernel/sched/sched.h which is in kernel source tree and not in kernel-devel
package
. So
this
command needs to run at the kernel source tree root directory
so that the added header file can be found by the compiler.
trace -I
'net/sock.h'
\
'udpv6_sendmsg(struct sock *sk) (sk->sk_dport == 13568)'
Trace udpv6 sendmsg calls only
if
socket's destination port is equal
to
53
(DNS;
13568
in big endian order)
trace -I
'linux/fs_struct.h'
'mntns_install "users = %d", $task->fs->users'
Trace the number of users accessing the file system of the current task
|
# bcc 基于 eBPF 开发(需要 Linux
3.15
及更高版本)。bcc 使用的大部分内容都需要 Linux
4.1
及更高版本。
[root
@yang
-
01
tools]# dbstat mysql -p
10763
-u
Traceback (most recent call last):
File
"/usr/share/bcc/tools/dbstat"
, line
88
, in <module>
usdt.enable_probe(
"query__start"
,
"probe_start"
)
File
"/usr/lib/python2.7/site-packages/bcc/usdt.py"
, line
154
, in enable_probe
probe
bcc.usdt.USDTException: failed to enable probe
'query__start'
; a possible cause can be that the probe requires a pid to enable
[root
@yang
-
01
tools]# dbslower mysql -p
10763
-m
30
Traceback (most recent call last):
File
"/usr/share/bcc/tools/dbslower"
, line
193
, in <module>
usdt.enable_probe(
"query__start"
,
"query_start"
)
File
"/usr/lib/python2.7/site-packages/bcc/usdt.py"
, line
154
, in enable_probe
probe
bcc.usdt.USDTException: failed to enable probe
'query__start'
; a possible cause can be that the probe requires a pid to enable
# OS内核版本, >=
4.4
存在统计Bug, 部分功能需要>=
4.13
# "bcc.usdt.USDTException: failed to enable probe
'query__start'
; a possible cause can be that the probe requires a pid to enable” 需要有Dtrace tracepoint的MySQL, 需要重新编译. https:
//dev.mysql.com/doc/refman/5.7/en/dba-dtrace-server.html
# 使用bcc需要root权限
|
[root@yang-01 tools]
# biolatency -D 2
Tracing block device I
/O
... Hit Ctrl-C to end.
disk =
'vda'
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 63 |*********************************** |
64 -> 127 : 71 |****************************************|
128 -> 255 : 46 |************************* |
256 -> 511 : 4 |** |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 3 |* |
4096 -> 8191 : 3 |* |
disk =
''
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 0 | |
256 -> 511 : 0 | |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 1 |****************************************|
disk =
'vda'
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 10 |*** |
32 -> 63 : 84 |******************************** |
64 -> 127 : 103 |****************************************|
128 -> 255 : 43 |**************** |
256 -> 511 : 4 |* |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 7 |** |
4096 -> 8191 : 17 |****** |
8192 -> 16383 : 1 | |
16384 -> 32767 : 1 | |
32768 -> 65535 : 1 | |
65536 -> 131071 : 1 | |
131072 -> 262143 : 44 |***************** |
disk =
''
usecs : count distribution
0 -> 1 : 0 | |
2 -> 3 : 0 | |
4 -> 7 : 0 | |
8 -> 15 : 0 | |
16 -> 31 : 0 | |
32 -> 63 : 0 | |
64 -> 127 : 0 | |
128 -> 255 : 0 | |
256 -> 511 : 0 | |
512 -> 1023 : 0 | |
1024 -> 2047 : 0 | |
2048 -> 4095 : 1 |****************************************|
[root@yang-01 tools]
# ps aux | grep mysql | grep opt
actiont+ 10763 3.3 18.0 4570952 1070628 ? Sl Jul16 1887:06
/opt/mysql/base/8
.0.19
/bin/mysqld
--defaults-
file
=
/opt/mysql/etc/3307/my
.cnf --daemonize --pid-
file
=
/opt/mysql/data/3307/mysqld
.pid --user=actiontech-mysql --socket=
/opt/mysql/data/3307/mysqld
.sock --port=3307
[root@yang-01 tools]
# filetop -p 10763 -C 5
Tracing... Output every 5 secs. Hit Ctrl-C to end
18:01:40 loadavg: 0.14 0.15 0.20 2
/1119
31195
TID COMM READS WRITES R_Kb W_Kb T FILE
10788 mysqld 0 1 0 832 R ibdata1
10909 mysqld 19 0 117 0 R mysql-relay.000044
10794 mysqld 0 99 0 67 R ib_logfile0
10977 mysqld 0 60 0 4 R mysql-relay.000044
10910 mysqld 0 10 0 4 R mysql-bin.000015
10789 mysqld 0 1 0 0 R ib_logfile0
18:01:45 loadavg: 0.21 0.16 0.21 2
/1119
31212
TID COMM READS WRITES R_Kb W_Kb T FILE
10909 mysqld 19 0 116 0 R mysql-relay.000044
10794 mysqld 0 98 0 64 R ib_logfile0
10977 mysqld 0 60 0 4 R mysql-relay.000044
10910 mysqld 0 10 0 4 R mysql-bin.000015
18:01:50 loadavg: 0.19 0.16 0.20 2
/1119
31226
TID COMM READS WRITES R_Kb W_Kb T FILE
10909 mysqld 15 0 88 0 R mysql-relay.000044
10794 mysqld 0 106 0 70 R ib_logfile0
19780 mysqld 2 2 8 7 R ibzMa2hy
10977 mysqld 0 60 0 4 R mysql-relay.000044
10910 mysqld 0 10 0 4 R mysql-bin.000015
19780 mysqld 1 0 0 0 R mysql-bin.000009
19780 mysqld 1 0 0 0 R mysql-bin.000012
19780 mysqld 1 0 0 0 R mysql-bin.000014
19780 mysqld 1 0 0 0 R mysql-bin.000010
19780 mysqld 1 0 0 0 R mysql-bin.000013
19780 mysqld 1 0 0 0 R mysql-bin.000011
[root@yang-01 tools]
# filelife
TIME PID COMM AGE(s) FILE
18:03:26 1823 ustats 0.00 disk-
read
-write-
test
.log
18:03:26 1830 ustats 0.00 disk-
read
-write-
test
.log
18:03:29 1736 umon-mgr 0.01 grafana.db-journal
18:03:41 1823 ustats 0.00 disk-
read
-write-
test
.log
18:03:41 1784 ustats 0.01 disk-
read
-write-
test
.log
|