如何在CentOS和Ubuntu上安装perf工具

时间:2020-03-05 15:24:25  来源:igfitidea点击:

Perf是Linux的性能计数器。
有了它,我们可以了解正在运行的linux系统的许多秘密。
例如,为什么发生L2高速缓存未命中。
为什么磁盘显示活动,哪些代码路径使内核停滞不前,以及许多其他原因。
在本文中,我们将介绍perf的基础知识以及如何使用它来获取有关系统性能的一些数据。

如何安装perf

通过Terminal(以及awk)安装perf userpace工具非常简单。

在Ubuntu类型上

sudo apt install linux-tools-common gawk

在CentOS和Fedora上

sudo yum install perf gawk

使用perf工具

使用以下命令记录磁盘I/O。

sudo perf record -e block:block_rq_issue -ag

它将记录数据,我们可以在几秒钟后按ctrl-c停止它。
然后发出以下命令

sudo perf report

然后我们将获得如下内容:

加号表示报表是可扩展的,我们可以查看负责的代码路径。
我在第二张图片中展开了一行,在那里我们看到了更多信息。

让我们接下来检查缓存未命中。
此命令将记录CPU 1级数据缓存未命中

sudo perf record -e L1-dcache-load-misses -c 10000 -ag -- sleep 5

因此,当我们使用sudo perf report -f检查报告时,我们将看到导致遗漏的代码

我们看到,Skype函数负责L1数据缓存中0.83%的缓存未命中。

到目前为止,我们记录并分析了记录,但是如果我们希望实时记录并立即查看输出怎么办?
请继续阅读,在下一节中我们将介绍这一点。

实时脚本

Perf是非常强大的工具,但由于对基础框架的频繁更改,因此同时不是最好的文档工具。
因此,为了更轻松地实时计算性能,我们将使用github中的一组脚本。

让我们克隆它们

cd
git clone --depth 1 https://github.com/brendangregg/perf-tools
cd perf-tools

你们都准备好了。
现在我们运行一些脚本:

sudo ./iolatency

该脚本将为我们提供磁盘延迟的直方图。
我已经运行了一秒钟,我们可以让它运行更长的时间。
我不想要,因为我有5400 rpm的HDD,结果却不能令人满意,所以为什么要运行它。

让我们再尝试一些脚本。

sudo ./fs/cachestat

该脚本使用perf每秒获取一次高速缓存未命中并将其打印到一行。
请注意,在开始的3秒内没有遗漏,后来的他们开始了。
那是因为那时我才开始在Android Studio中重建项目。
我可以说英特尔在Haswell做出了相当不错的分支预测指标。
使用6 mb的L3缓存,我的i7上的缓存命中率很少会下降到95%以下。

sudo ./kernel/funccount -t 5 -d 5 'ext4*'
Tracing "ext4*" for 5 seconds. Top 5 only...
FUNC COUNT
ext4_mark_iloc_dirty 109
ext4_reserve_inode_write 109
ext4_get_group_desc 112
ext4_inode_table 112
ext4_journal_check_start 155

该脚本跟踪我们键入的内核函数(在此示例中为ext4),跟踪输入的时间(此处为-d 5秒),并输出包含我们设置的多个点的顶部列表(此处为-t 5)。

一些非实时脚本

该脚本使用perf_events来计数系统调用:

sudo ./syscount -c
Tracing... Ctrl-C to end.
^Csleep: Interrupt
SYSCALL COUNT
exit 1
lseek 1
newuname 1
dup 2
sched_getaffinity 2
tgkill 2
timerfd_settime 2
unlink 2
access 3
prctl 3
set_robust_list 4
fdatasync 5
getsockopt 5
epoll_ctl 6
newlstat 6
ftruncate 7
munmap 8
shutdown 8
inotify_add_watch 9
bind 10
mmap 14

它不像上面的时间那样实时,我们必须按ctrl-C停止计数,然后才能输出。

如果要跟踪特定进程的调用,则首先需要使用以下命令获取其PID

sudo ./syscount -v

然后需要像这样使用pid号

./syscount -cp 5656

查看哪个系统调用pid 5656的进程调用最多。