如何在CentOS和Ubuntu上安装perf工具
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的进程调用最多。