使用 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 8、WPF、Prism.DryIoc、MVVM設計模式、Blazor以及MySQL資料庫構建的企業級工作流系統的WPF客戶端框架-AIStudio.Wpf.AClient 6.0。 項目介紹 框架採用了 Prism 框架來實現 MVVM 模式,不僅簡化了 MVVM 的典型 ...
  • 先看一下效果吧: 我們直接通過改造一下原版的TreeView來實現上面這個效果 我們先創建一個普通的TreeView 代碼很簡單: <TreeView> <TreeViewItem Header="人事部"/> <TreeViewItem Header="技術部"> <TreeViewItem He ...
  • 1. 生成式 AI 簡介 https://imp.i384100.net/LXYmq3 2. Python 語言 https://imp.i384100.net/5gmXXo 3. 統計和 R https://youtu.be/ANMuuq502rE?si=hw9GT6JVzMhRvBbF 4. 數 ...
  • 本文為大家介紹下.NET解壓/壓縮zip文件。雖然解壓縮不是啥核心技術,但壓縮性能以及進度處理還是需要關註下,針對使用較多的zip開源組件驗證,給大家提供個技術選型參考 之前在《.NET WebSocket高併發通信阻塞問題 - 唐宋元明清2188 - 博客園 (cnblogs.com)》講過,團隊 ...
  • 之前寫過兩篇關於Roslyn源生成器生成源代碼的用例,今天使用Roslyn的代碼修複器CodeFixProvider實現一個cs文件頭部註釋的功能, 代碼修複器會同時涉及到CodeFixProvider和DiagnosticAnalyzer, 實現FileHeaderAnalyzer 首先我們知道修 ...
  • 在軟體行業,經常會聽到一句話“文不如表,表不如圖”說明瞭圖形在軟體應用中的重要性。同樣在WPF開發中,為了程式美觀或者業務需要,經常會用到各種個樣的圖形。今天以一些簡單的小例子,簡述WPF開發中幾何圖形(Geometry)相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 在 C# 中使用 RabbitMQ 通過簡訊發送重置後的密碼到用戶的手機號上,你可以按照以下步驟進行 1.安裝 RabbitMQ 客戶端庫 首先,確保你已經安裝了 RabbitMQ 客戶端庫。你可以通過 NuGet 包管理器來安裝: dotnet add package RabbitMQ.Clien ...
  • 1.下載 Protocol Buffers 編譯器(protoc) 前往 Protocol Buffers GitHub Releases 頁面。在 "Assets" 下找到適合您系統的壓縮文件,通常為 protoc-{version}-win32.zip 或 protoc-{version}-wi ...
  • 簡介 在現代微服務架構中,服務發現(Service Discovery)是一項關鍵功能。它允許微服務動態地找到彼此,而無需依賴硬編碼的地址。以前如果你搜 .NET Service Discovery,大概率會搜到一大堆 Eureka,Consul 等的文章。現在微軟為我們帶來了一個官方的包:Micr ...
  • ZY樹洞 前言 ZY樹洞是一個基於.NET Core開發的簡單的評論系統,主要用於大家分享自己心中的感悟、經驗、心得、想法等。 好了,不賣關子了,這個項目其實是上班無聊的時候寫的,為什麼要寫這個項目呢?因為我單純的想吐槽一下工作中的不滿而已。 項目介紹 項目很簡單,主要功能就是提供一個簡單的評論系統 ...