作为示例,我将使用第 2 种抓取数据的方法的完整命令、输出和生成火焰图的屏幕截图帖在如下。我们执行 INSERT INTO...SELECT
语句,我们可以分析执行过程。SHELL> time sudo perf record -a -F 99 -g \
-p $(pgrep -x mysqld) \
--mysql test -e "INSERT INTO joinit SELECT NULL, uuid(), time(now()), (FLOOR( 1 + RAND( ) *60 )) FROM joinit;"
Warning:
PID/TID switch overriding SYSTEM
[ perf record: Woken up 7 times to write data ]
[ perf record: Captured and wrote 1.909 MB perf.data (8214 samples) ]
real 1m24.366s
user 0m0.133s
sys 0m0.378s
SHELL> sudo perf script | \
~/src/FlameGraph/stackcollapse-perf.pl perf.script | \
~/src/FlameGraph/flamegraph.pl > mysql_select_into_flamegraph.svg
敏锐的读者会注意到,我们在这里更进一步,通过一个管道(|)合并了步骤 2 和步骤 3,避免向 perf.script 文件写入和读取数据。此外,还有时间输出,我们可以对工具生成的数据量进行估计(1 分 25 秒生成约 2Mb 数据);当然这取决于许多因素,所以要谨慎对待,并在自己的环境中进行测试。