簡體   English   中英

分析長期運行的 Python 服務器

[英]Profiling a long-running Python Server

我有一個長期運行的扭曲服務器。

在大型系統測試中,在測試開始幾分鍾的某個特定時間點,當一些客戶端進入特定狀態並發生特定外部事件,該服務器需要幾分鍾的 100% CPU 並且其工作非常緩慢。 我想知道它在做什么。

如何在長時間運行的服務器中獲取特定時間跨度的配置文件?

如果有辦法在運行時啟用或注入探查器,我可以輕松地通過 HTTP 發送服務器啟動和停止消息嗎?

如果可以選擇,我想要基於堆棧的/call-graph 分析,但即使是葉子采樣也可能會提供洞察力。

yappi profiler 可以在運行時啟動和停止。

出現了兩個有趣的工具來嘗試解決該特定問題,您可能不一定事先在代碼中進行了分析,但希望在緊要關頭分析生產代碼。

  • pyflame將使用ptrace(2)系統調用附加到現有進程並創建進程的“火焰圖”。 它是用 Python 編寫的。

  • py-spy通過讀取進程內存並找出 Python 調用堆棧來工作。 它還提供了一個火焰圖,還提供了一個“類似頂部”的界面,以顯示哪個函數花費的時間最多。 它是用 Rust 和 Python 編寫的。

不是一個非常 Pythonic 的答案,但可能strace過程可以提供一些見解(假設您使用的是 Linux 或類似系統)。

嚴格使用 Python,對於此類事情,我使用跟蹤所有調用,將它們的結果存儲在環形緩沖區中並使用信號(也許你可以通過 HTTP 消息做到這一點)轉儲該環形緩沖區。 當然,跟蹤會減慢一切,但在您的場景中,您也可以通過 HTTP 消息打開跟蹤,因此只有當您的問題也處於活動狀態時才會啟用它。

Pyliveupdate是一個為以下目的而設計的工具:分析長時間運行的程序而不重新啟動它們。 它允許您動態選擇特定函數進行分析或停止分析,而無需提前檢測您的代碼——它動態地檢測代碼以進行分析。

Pyliveupdate 具有三個關鍵功能:

  • 分析特定 Python 函數(按函數名稱或模塊名稱)的調用時間。
  • 添加/刪除配置文件而無需重新啟動程序。
  • 使用調用摘要和火焰圖顯示分析結果。

在此處查看演示: https ://asciinema.org/a/304465。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM