perf 命令是一款Linux系統性能分析工具,能夠進行函數級熱點查找
常用的有 perf top 、perf record 、 perf report
1、perf top 命令使用
常用參數
-e:指定性能事件
-a:顯示在所有CPU上的性能統計信息
-C:顯示在指定CPU上的性能統計信息
-p:指定進程PID
-t:指定線程TID
-K:隱藏內核統計信息
-U:隱藏用戶空間的統計信息
-s:指定待解析的符號信息
‐g or ‐‐call‐graph <output_type,min_percent,call_order>
graph: 使用調用樹,將每條調用路徑進一步折疊。這種顯示方式更加直觀。
每條調用路徑的采樣率為絕對值。也就是該條路徑占整個采樣域的比率。
fractal
默認選項。類似與 graph,但是每條路徑前的采樣率為相對值。
flat
不折疊各條調用
選項 call_order 用以設定調用圖譜的顯示順序,該選項有 2個取值,分別是
callee 與caller。
將該選項設為callee 時,perf按照被調用的順序顯示調用圖譜,上層函數被下層函數所調用。
該選項被設為caller 時,按照調用順序顯示調用圖譜,即上層函數調用了下層函數路徑,也不顯示每條調用路徑的采樣率
1.1 示例、 內容會實時刷新,但這樣查看當前結果並不會進行保存
perf top -a -g -p `pidof mysqld`
+ 75.80% 0.02% mysqld [.] handle_connection
- 75.63% 0.24% mysqld [.] do_command
- 28.39% do_command
+ 26.39% dispatch_command
- 2.27% Protocol_classic::get_command
- 2.17% Protocol_classic::read_packet
- 2.17% my_net_read
+ 2.23% net_read_packet
+ 68.98% 0.59% mysqld [.] dispatch_command
+ 64.29% 0.06% mysqld [.] mysqld_stmt_execute
+ 63.52% 0.20% mysqld [.] Prepared_statement::execute_loop
+ 61.90% 0.11% mysqld [.] Prepared_statement::execute
+ 60.04% 0.29% mysqld [.] mysql_execute_command
+ 38.38% 0.11% mysqld [.] execute_sqlcom_select
+ 33.61% 0.05% mysqld [.] handle_query
+ 32.14% 0.00% libpthread-2.17.so [.] start_thread
+ 27.92% 0.00% mysqld [.] pfs_spawn_thread
+ 25.31% 0.12% [kernel] [k] do_syscall_64
+ 15.84% 0.07% mysqld [.] st_select_lex::optimize
+ 15.53% 0.23% mysqld [.] JOIN::optimize
+ 15.36% 0.49% mysqld [.] btr_cur_search_to_nth_level
+ 15.03% 0.06% mysqld [.] JOIN::exec
+ 12.84% 0.11% mysqld [.] JOIN::make_join_plan
+ 12.80% 0.78% mysqld [.] buf_page_get_gen
+ 11.94% 0.06% mysqld [.] sub_select
+ 9.44% 0.06% mysqld [.] buf_read_page_low
+ 9.32% 0.00% [kernel] [k] entry_SYSCALL_64_after_hwframe
+ 8.82% 0.72% mysqld [.] row_search_mvcc
+ 8.79% 0.08% mysqld [.] fil_io
+ 8.19% 0.03% mysqld [.] buf_read_page
+ 8.18% 0.00% mysqld [.] Sql_cmd_update::execute
+ 8.01% 0.01% mysqld [.] handler::ha_write_row
+ 7.75% 0.11% mysqld [.] ha_innobase::index_read
+ 7.69% 0.01% mysqld [.] Sql_cmd_update::try_single_table_update
+ 7.24% 0.02% mysqld [.] open_tables_for_query
+ 7.17% 0.12% libpthread-2.17.so [.] __libc_send
+ 7.13% 0.13% mysqld [.] open_tables
+ 7.04% 0.11% mysqld [.] evaluate_join_record
#### 1.2 示例、perf record/perf report perf record 可以將分析信息保存到文件 perf report 可以查看文件中的性能信息
例:將性能分析結果輸出到 data.perf 文件中
perf record -a -g -p `pidof mysqld` -o data.perf
例:讀取 data.perf 文件
perf report -g -i data.perf
2、利用 data.perf 性能文件,生成火焰圖
git hub:https://github.com/brendangregg/FlameGraph.git
perf script -i perf.data > perf.unfold
cd FlameGraph
./stackcollapse-perf.pl /root/perf.unfold &> perf.folded
./flamegraph.pl perf.folded > perf.svg
#生成文件使用瀏覽器打開即可正常查看