最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python使用cProfile分析和定位應用性能瓶頸點

 更新時間:2024年12月13日 08:53:04   作者:曾左  
cProfile?是?Python?標準庫中的一個模塊,用于對?Python?程序進行性能分析,它能輸出每個函數的調用次數、執(zhí)行耗時等詳細信息,下面我們來看看如何使用cProfile分析和定位應用性能瓶頸點吧

一、需求背景

性能壓測時,發(fā)現某接口存在性能瓶頸,期望借助工具定位該瓶頸,最好能定位至具體慢方法。

二、cProfile 簡介

cProfile 是 Python 標準庫中的一個模塊,用于對 Python 程序進行性能分析,它能輸出每個函數的調用次數、執(zhí)行耗時等詳細信息,可幫助開發(fā)者識別程序中運行緩慢的方法,以便進行性能優(yōu)化,適合作為上述需求的解決方案。

此外,Python 還內置了使用純 Python 實現的 profile 模塊,與 cProfile 功能一樣,只不過 cProfile 是用 C 語言編寫,性能更高、開銷更小,適合在性能敏感的環(huán)境(如線上生產環(huán)境)中使用。profile 是純 Python 實現的模塊,性能開銷相對較大,但因其用 Python 編寫,易于理解和修改,適合學習時使用。

三、使用方法

cProfile 支持三種使用方法,一是硬編碼于代碼中;二是在 Python 應用啟動時加載 cProfile 模塊;三是通過 IDE(PyCharm)運行。開發(fā)環(huán)境建議采用方法三,因其簡單易用且結果圖表豐富;生產環(huán)境建議采用方法二,此方法對代碼無侵入性。

1. 硬編碼于代碼中

示例代碼:

import cProfile

def my_function():
    # Some code to profile
    pass

profiler = cProfile.Profile()
profiler.enable()
my_function()
profiler.disable()
profiler.print_stats()

執(zhí)行結果:

2 function calls in 0.000 seconds

Ordered by: standard name

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    0.000    0.000    0.000    0.000 test.py:3(my_function)
    1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

結果字段說明:

ncalls:函數調用的次數。

tottime:在該函數中花費的總時間,不包括調用子函數的時間。

percall:tottime 除以 ncalls。

cumtime:該函數及其所有子函數中花費的總時間。

percall:cumtime 除以原始調用次數。

filename:lineno(function):函數所在的文件名、行號和函數名。

2. 在 Python 應用啟動時加載 cProfile 模塊

示例代碼:

python -m cProfile my_script.py # 方法一、將結果輸出至控制臺
python -m cProfile -o output.prof my_script.py # 方法二、將結果保存到指定的prof文件

可使用 snakeviz 插件(安裝方法為pip install snakeviz)分析 prof 文件。執(zhí)行snakeviz output.prof后,會將結果掛載到 web 容器中,支持通過 URL(如http://127.0.0.1:8080/snakeviz/xxxoutput.prof)訪問。

3. 通過 IDE(PyCharm)運行

使用方法:

通過菜單 [run] > [profile 'app'](其中 app 為應用名稱,下同)啟動應用。待應用執(zhí)行完畢且停止后,相關面板會輸出相應的調用統(tǒng)計與調用鏈。

調用統(tǒng)計:

表頭“Name”表示被調用的模塊或函數;“Call Count”表示被調用次數;“Time (ms)”表示耗時及百分比,時間單位為毫秒。

點擊表頭列名可對該列進行排序。

在調用統(tǒng)計中,選擇“name”列的單元格,右鍵選中“Navigate to Source”或“Show on Call Graph”,可打開其源碼或對應的調用鏈及位置。

調用鏈:

此外,通過菜單 [run] > [Concurrency Diagram 'app'] 啟動程序,可查看到線程和異步協程(Asyncio)的調用情況,如下圖所示:

四、相關配置項

1. cProfile

[root@test bin]# python3 -m cProfile -h
Usage: cProfile.py [-o output_file_path] [-s sort] [-m module | scriptfile] [arg] ...

Options:
  -h, --help            show this help message and exit
  -o OUTFILE, --outfile=OUTFILE
                        Save stats to <outfile> #  將分析結果輸出到指定的文件中。
  -s SORT, --sort=SORT  Sort order when printing to stdout, based on pstats.Stats class # 指定輸出結果的排序方式。可以根據不同的字段進行排序,如 time, cumulative, calls 等。
  -m                    Profile a library module # 分析一個模塊,而不是一個腳本文件 

2. snakeviz

[root@test bin]# snakeviz --help
usage: snakeviz [-h] [-v] [-H ADDR] [-p PORT] [-b BROWSER_PATH] [-s] filename

Start SnakeViz to view a Python profile.

positional arguments:
  filename              Python profile to view

options:
  -h, --help            show this help message and exit
  -v, --version         show program \`s version number and exit
  -H ADDR, --hostname ADDR hostname to bind to (default: 127.0.0.1) # 用于指定綁定的主機名,默認值為 127.0.0.1,即本地主機。
  -p PORT, --port PORT  port to bind to; if this port is already in use a free port will be selected automatically (default: 8080) # 用于指定綁定的端口。如果指定的端口已被占用,程序將自動選擇一個空閑端口。默認值為 8080。
  -b BROWSER_PATH, --browser BROWSER_PATH  name of webbrowser to launch as described in the documentation of Python\'s webbrowser module: https://docs.python.org/3/library/webbrowser.html # 按照 Python 的 webbrowser 模塊的文檔描述,指定要啟動的瀏覽器名稱。用戶可以通過指定瀏覽器的路徑來控制使用哪個瀏覽器打開應用。
  -s, --server          start SnakeViz in server-only mode--no attempt will be made to open a browser # 僅在服務器模式下啟動 SnakeViz,不會嘗試打開服務器中的瀏覽器。對于非圖形化或不帶瀏覽器的服務器非常有用。

五、生產環(huán)境使用示例

生產環(huán)境系統(tǒng)版本為 CentOS 7.9.2009 (Core),內核為 5.15.81,使用 4 核 4G 的容器運行DB-GPT controller 子系統(tǒng)。

1. 使用步驟

(1)執(zhí)行腳本:/usr/local/bin/python3.10 -m cProfile -o out.prof /usr/local/bin/dbgpt start controller &,在 Python 應用啟動時加載 cProfile 模塊。

(2)執(zhí)行相關接口壓測。

(3)正常停止應用,生成性能分析結果文件(out.prof)。注意:性能分析結果只能是在程序正常停止后才能輸出。常規(guī)兩種做法:其一、后臺守護進程,可以使用 kill -2 {應用 PID};其二、前臺進程,通過 Ctrl + C 退出。

(4)使用snakeviz -H 0.0.0.0 -s out.prof分析結果文件(其中 -s 僅在服務端模式下運行,不會嘗試打開服務器瀏覽器,一般情況下服務器不自帶瀏覽器;-H 0.0.0.0,支持監(jiān)聽網卡所有接口),執(zhí)行成功后,會輸出可訪問的 URL 地址,通過外部或本地瀏覽器打開。

2. 結果分析

使用外部或本地瀏覽器訪問 snakeviz 生成的 URL 地址。結果如下:

結果說明:

(1)結果包含兩部分,即上圖和下表。上圖展示選中方法及其子方法的調用關系、耗時及占比;下表展示所有方法及其總調用次數(ncalls)、方法本身總耗時(tottime)、方法本身平均耗時(percall)、方法及其子方法總耗時(cumtime)、方法及其子方法平均耗時(percall)以及方法所在文件位置及其行列號。

使用說明:

(1)表格任意列支持升降序操作,選中任意行,頁面上方的圖形會自動展示該方法及其子方法的調用關系、耗時及占比。

(2)單擊圖形中的任意子模塊,可查看子模塊所在方法及其子方法的調用關系、耗時及占比。

分析建議:

(1)選擇 cumtime 列降序,選擇入口代碼,逐步細看,分析瓶頸點。

(2)使用 Sunburst 圖樣展示,更易體現各方法耗時占比。

3. 評估加載 cProfile 對性能的影響

我們用 Jmeter 對未加載以及加載 cProfile 模塊的 Python 應用性能進行評估,以判斷生產環(huán)境加載 cProfile 對性能的影響程度。結果如下:

配置Jmeter 壓測線程數CPU 使用率吞吐量平均響應時間
CASE1 某應用未加載 cProfile20接近單核 100%52736ms
CASE2 某應用加載 cProfile 后20接近單核 100%39549ms

從上表可知,加載 cProfile 后,應用吞吐量下降 25%,平均響應時間增加 13ms,對性能有一定影響。

五、遇到問題

kill -15 {應用 PID} 無法生成性能分析結果文件

由于 cProfile 僅支持監(jiān)聽中斷(SIGINT)信號,導致 kill 15 發(fā)送 SIGTERM 信號時,無法生成性能分析結果文件。

解決辦法:使用 kill -2 {應用 PID}。

六、使用總結

(1)cProfile 可以生成詳細的性能分布和調用鏈,非常適合作為分析和定位 Python 應用性能瓶頸的工具。

(2)由于生成性能分析結果文件需要停止應用,且對性能損耗較大(吞吐量降低 25%),所以一般情況下不建議在生產環(huán)境直接使用。不過可以使用流量復制,將生成環(huán)境的流量復制到測試或預生產環(huán)境,這樣既能定位實際性能瓶頸,又不影響線上業(yè)務。

到此這篇關于Python使用cProfile分析和定位應用性能瓶頸點的文章就介紹到這了,更多相關Python cProfile內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 詳解Python正則表達式re模塊

    詳解Python正則表達式re模塊

    這篇文章主要介紹了Python正則表達式re模塊,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Python字典及字典基本操作方法詳解

    Python字典及字典基本操作方法詳解

    這篇文章主要介紹了Python字典及字典基本操作方法,結合實例形式詳細分析了Python字典的概念、創(chuàng)建、格式化及常用操作方法與相關注意事項,需要的朋友可以參考下
    2018-01-01
  • Python 如何展開嵌套的序列

    Python 如何展開嵌套的序列

    這篇文章主要介紹了Python 如何展開嵌套的序列,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08
  • pytest allure添加環(huán)境信息實例講解

    pytest allure添加環(huán)境信息實例講解

    這篇文章主要介紹了pytest allure添加環(huán)境信息實例,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12
  • python3中numpy函數tile的用法詳解

    python3中numpy函數tile的用法詳解

    今天小編就為大家分享一篇python3中numpy函數tile的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • Python3.8對可迭代解包的改進及用法詳解

    Python3.8對可迭代解包的改進及用法詳解

    這篇文章主要介紹了Python3.8對可迭代解包的改進及用法詳解,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-10-10
  • Python?十個字典用法使用技巧歸納

    Python?十個字典用法使用技巧歸納

    今天小編幫大家簡單介紹下Python的一種數據結構:?字典,字典是一種可變容器模型,且可存儲任意類型對象,它用于存放具有映射關系的數據,這里介紹歸納十個字典的用法技巧,需要的朋友可以參考下
    2022-01-01
  • Python并發(fā)編程實例教程之線程的玩法

    Python并發(fā)編程實例教程之線程的玩法

    編程的樂趣之一是想辦法讓程序執(zhí)行的越來越快,代碼越寫越優(yōu)雅,這篇文章主要給大家介紹了關于Python并發(fā)編程實例教程之線程的相關資料,需要的朋友可以參考下
    2021-06-06
  • Python3.6通過自帶的urllib通過get或post方法請求url的實例

    Python3.6通過自帶的urllib通過get或post方法請求url的實例

    下面小編就為大家分享一篇Python3.6通過自帶的urllib通過get或post方法請求url的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • python3.6編寫的單元測試示例

    python3.6編寫的單元測試示例

    這篇文章主要介紹了python3.6編寫的單元測試,結合實例形式分析了Python3.6使用unittest模塊進行單元測試的相關操作技巧與注意事項,需要的朋友可以參考下
    2019-08-08

最新評論

二连浩特市| 岢岚县| 玉田县| 冀州市| 洮南市| 玉林市| 元朗区| 砚山县| 山西省| 徐州市| 萍乡市| 无锡市| 霍山县| 顺平县| 三河市| 佛学| 喀喇沁旗| 大余县| 永康市| 安泽县| 宜川县| 四会市| 鄱阳县| 牡丹江市| 乌鲁木齐市| 灯塔市| 二手房| 翁源县| 肥东县| 巴马| 平舆县| 大余县| 甘孜县| 瑞金市| 永昌县| 内黄县| 巴楚县| 南召县| 天祝| 兰考县| 堆龙德庆县|