使用 perf probe測量Linux用戶空間代碼的執行時間

来源:https://www.cnblogs.com/testing-/p/18383538
-Advertisement-
Play Games

實踐環境 CentOS-7-x86_64-DVD-2009 簡介 Firewalld是一種簡單的、有狀態的、基於區域(zone-based)的防火牆。策略和區域用於組織防火牆規則。網路在邏輯上被劃分為多個區域,它們之間的流量可以通過策略進行管理。 查看防火牆狀態 # service firewall ...


1 Linux perf 簡介

perf 是 Linux 內核自帶的一個強大的性能分析工具,它能夠深入到內核和用戶空間,提供豐富的性能計數器和事件跟蹤功能,幫助開發者和系統管理員精確地定位系統性能瓶頸。

image

1.1 perf 的主要功能:

  • 性能事件採樣: 可以採樣各種硬體性能事件,如 CPU 周期、緩存命中率、指令退休率等,從而分析程式在 CPU 上的執行情況。
  • 軟體事件跟蹤: 可以跟蹤內核和用戶空間的函數調用、系統調用等軟體事件,分析程式的執行流程和函數調用關係。
  • 性能計數器: 提供了大量的硬體性能計數器,可以用來分析 CPU、記憶體、緩存等硬體資源的使用情況。
  • 火焰圖生成: 可以生成火焰圖,直觀地展示程式的調用棧,快速定位性能熱點。
  • 實時監控: 可以實時監控系統的性能指標,幫助快速發現性能問題。

1.2 perf 的工作原理:

perf 主要通過以下方式來收集性能數據:

  • 硬體性能計數器: 利用 CPU 內置的性能計數器,直接獲取硬體的性能數據。
  • 軟體事件跟蹤: 在內核和用戶空間插入探針,跟蹤軟體事件的發生。
  • 內核協作: perf 與內核緊密協作,通過內核介面獲取性能數據。

1.3 perf 的常用命令:

  • perf list: 列出所有可用的性能事件。
  • perf stat: 統計性能事件的計數。
  • perf record: 記錄性能數據。
  • perf report: 分析記錄的數據,生成報告。
  • perf top: 實時顯示占用 CPU 時間最多的函數。
  • perf trace: 追蹤系統調用和軟中斷。

1.4 perf 的應用場景:

  • 定位性能瓶頸: 通過分析性能數據,找出程式中消耗時間最長的部分。
  • 優化代碼: 根據性能分析結果,有針對性地優化代碼。
  • 分析系統問題: 分析系統性能問題,如 CPU 負載過高、記憶體泄漏等。
  • 調優內核參數: 調整內核參數,提高系統性能。

1.5 perf 的優勢:

  • 功能強大: 提供了豐富的性能分析功能。
  • 靈活易用: 命令行界面簡單易學。
  • 開源免費: 作為 Linux 內核的一部分,完全免費。
  • 社區活躍: 有一個龐大的社區,提供豐富的文檔和支持。

2 使用 perf probe測量Linux用戶空間代碼的執行時間

2.1 測量的示常式序evenodd.c

#include <stdio.h>
#include <unistd.h>

void even(void)
{
     printf("it is even\n");
}

void odd(void)
{
     printf("it is odd\n");
}
int main()
{
     int i;
     for (i = 0; ;i++) {
          usleep(500);
          if (i % 2)
               odd();
          else
               even();
     }
}

參考資料

2.2 使用調試符號編譯 even odd:

# gcc -o -g evenodd evenodd.c
# perf probe --line even -x evenodd
<even@/root/code/evenodd.c:0>
      0  void even(void)
         {
      2       printf("it is even\n");
      3  }

         void odd(void)
         {

2.3 添加探針

在 even() 函數的開頭添加 perf 探針,請運行以下命令:

# objdump -t evenodd

evenodd:     file format elf64-littleaarch64

SYMBOL TABLE:
0000000000400238 l    d  .interp        0000000000000000              .interp
0000000000400254 l    d  .note.gnu.build-id     0000000000000000              .note.gnu.build-id
0000000000400278 l    d  .note.ABI-tag  0000000000000000              .note.ABI-tag
0000000000400298 l    d  .gnu.hash      0000000000000000              .gnu.hash
...
# perf probe -x evenodd 'even'

要獲取給定函數的執行時間,我們需要在函數的最後一行添加探針。如 perf probe -line 示例所示,是第 3 行。下麵的命令在 evenondd 二進位文件的函數 event() 的第 3 行添加了名為 even_end event 的探針。

# perf probe -x evenodd 'even_end=even:3'

開始運行evenodd應用程式後,運行以下命令記錄 even() 執行 10 秒的進入和退出探針:

# perf record -e probe_evenodd:even -e probe_evenodd:even_end -a sleep 10

記錄結束後,可以使用以下命令列印跟蹤結果:

# perf script
         evenodd 2342328 [034] 1232877.416865:     probe_evenodd:even: (4006c4)
         evenodd 2342328 [034] 1232877.416875: probe_evenodd:even_end: (4006d8)
         evenodd 2342328 [034] 1232877.417990:     probe_evenodd:even: (4006c4)
         evenodd 2342328 [034] 1232877.417996: probe_evenodd:even_end: (4006d8)
         evenodd 2342328 [034] 1232877.419109:     probe_evenodd:even: (4006c4)
...

2.4 python分析

還可以使用 perf python腳本自動計算執行時間。捕獲這兩個事件的跟蹤後,以下命令將生成名為 perf-script.py 的 python 腳本框架:

# perf script -g python

然後編輯探測處理程式,計算執行時間:

# perf script event handlers, generated by perf script -g python
# Licensed under the terms of the GNU GPL License version 2

# The common_* event handler fields are the most useful fields common to
# all events.  They don't necessarily correspond to the 'common_*' fields
# in the format files.  Those fields not available as handler params can
# be retrieved using Python functions of the form common_*(context).
# See the perf-script-python Documentation for the list of available functions.

from __future__ import print_function

import os
import sys

sys.path.append(os.environ['PERF_EXEC_PATH'] + \
        '/scripts/python/Perf-Trace-Util/lib/Perf/Trace')

from perf_trace_context import *
from Core import *


def trace_begin():
        print("in trace_begin")

def trace_end():
        print("in trace_end")

start=0
def probe_evenodd__even(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, __probe_ip, perf_sample_dict):
    global start
    start=(common_secs * 1000000000) + common_nsecs

def probe_evenodd__even_end(event_name, context, common_cpu, common_secs, common_nsecs, common_pid, common_comm, common_callchain, __probe_ip, perf_sample_dict):

    now=common_secs * 1000000000 + common_nsecs
    duration=now - start
    print("even runtime: " + str(duration) + " ns")

def trace_unhandled(event_name, context, event_fields_dict, perf_sample_dict):
                print(get_dict_as_string(event_fields_dict))
                print('Sample: {'+get_dict_as_string(perf_sample_dict['sample'], ', ')+'}')

def print_header(event_name, cpu, secs, nsecs, pid, comm):
        print("%-20s %5u %05u.%09u %8u %-20s " % \
        (event_name, cpu, secs, nsecs, pid, comm), end="")

def get_dict_as_string(a_dict, delimiter=' '):
        return delimiter.join(['%s=%s'%(k,str(v))for k,v in sorted(a_dict.items())])

然後,運行以下命令,就可以列印出函數 even 的執行時間:

# perf script -s perf-script.py  | tail
even runtime: 6540 ns
even runtime: 7080 ns
even runtime: 6770 ns
even runtime: 7220 ns
even runtime: 6850 ns
even runtime: 6390 ns
even runtime: 6910 ns
even runtime: 6760 ns
even runtime: 7460 ns
in trace_end

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 概述 Windows 遠程桌面(也稱為 RDP)允許你從一臺電腦遠程連接到另一臺運行 Windows 操作系統的電腦。 開啟遠程桌面 在“設置”中前往“系統>遠程桌面”,將“遠程桌面”設置為“開”。 確保Windows正確存儲微軟賬號的密碼 絕大多數情況下,我們將使用微軟賬號及其密碼來登錄“遠程 ...
  • liwen01 2024.09.01 前言 最近十幾年,通信技術發展迅猛,通信標準更新頻繁,有的設備還在使用 802.11/b/g/n 協議,有的已支持到 WiFi6、WiFi7。 而國內有關無線 WiFi 的書籍或資料卻很少,就算能找著的,大多也是比較老舊。本文試圖使用最新的數據來介紹 WiFi ...
  • 本章將和大家分享Docker中常用的命令。廢話不多說,下麵我們直接進入主題。 1、配置鏡像加速源 拉取鏡像慢,配置載入鏡像地址: 創建一個或修改 /etc/docker/daemon.json 文件(如果不存在則創建): vim /etc/docker/daemon.json 並添加或修改regis ...
  • Mac上HomeBrew安裝及換源教程 Mac的Mac OS系統來源於Unix系統,得益於此Mac系統的使用類似於Linux,因此Linux系統中的包管理概念也適用於Mac,而HomeBrew便是其中的一個優秀的包管理工具,而包管理工具是什麼呢?軟體包管理工具,擁有安裝、卸載、更新、查看、搜索等功能 ...
  • 在電腦電源管理中,S1, S2, S3, S4 代表不同的電源狀態或睡眠狀態。 瞭解這些狀態,對電腦設備理解功耗及工作狀態有很大幫助。最近公司開會,系統同事有講S3狀態功耗很低,我猜和電腦的睡眠、息屏有關。。。emmm,不懂就要學 查找資料,以下是這些狀態的詳細說明: S1 狀態(低電量等待狀態 ...
  • 32位配置寄存器:GPIOx_CRL,GPIOx_CRH 32位數據寄存器:GPIOx_IDR,GPIOx_ODR 32位置位/複位寄存器:GPIOx_BSRR 16位複位寄存器:GPIOx_BRR 32位鎖定寄存器:GPIOx_LCKR GPIO 寄存器詳解 CRL 32位埠配置低寄存器(GPI ...
  • 嵌入式STM32單片機開發環境配置教學Win/Mac · 本教程支持Windows和Mac · Windows可選的開發軟體為Keil、Clion、STM32CubeMX,可自由選擇開發方式 · Mac的開發環境為(Clion+OpenOCD+STM32CubeMX),僅支持HAL庫 · 本博客同步 ...
  • Multipass 虛擬機 ssh 登錄(密碼方式) [!NOTE] 以 Ubuntu 24,04 LTS 為例 準備工作 為了演示新建一個示例虛擬機。 multipass launch --name vm01 -c 4 -m 4G -d 100G --network bridged 操作步驟 進入 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...