成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何監視Python程序的內存使用情況

開發 后端
我們使用Python和它的數據處理庫套件(如panda和scikiti -learn)進行大量數據處理時候,可能使用了大量的計算資源。如何監視程序的內存使用情況就顯得尤為重要。

我們使用Python和它的數據處理庫套件(如panda和scikiti -learn)進行大量數據處理時候,可能使用了大量的計算資源。如何監視程序的內存使用情況就顯得尤為重要。

[[330450]]

1. 詢問操作系統

跟蹤內存使用情況的最簡單方法是使用操作系統本身。您可以使用top來提供您在一段時間內使用的資源的概述。或者,如果您想要現場檢查資源使用情況,您可以使用ps命令:

  1. $ ps -m -o %cpu,%mem,command  
  2. %CPU %MEM COMMAND  
  3. 23.4  7.2 python analyze_data.py  
  4.  0.0  0.0 bash 

m標志指示ps按照進程使用最多內存的順序顯示結果。o標志控制顯示每個進程的哪些屬性——在本例中是使用的CPU百分比、消耗的系統內存百分比和正在執行的進程的命令行。CPU百分比將一個完整的CPU核心計算為100%的使用率,因此如果您有一個4核的機器,可能會看到總計高達400%的CPU使用率。還有其他輸出選項用于顯示其他進程屬性,以及用于控制顯示哪些進程的ps的其他標志。

結合一些創造性的shell腳本,可以編寫一個監視腳本,使用ps跟蹤任務的內存使用情況。

2. tracemalloc

Python解釋器的操作中有大量的hooks,可以在Python代碼運行時用于監視和內省。pdb使用這些鉤子來提供調試;覆蓋率也使用它們來提供測試覆蓋率。tracemalloc模塊還使用它們來提供一個了解內存使用情況的窗口。

tracemalloc是在Python 3.4中添加的一個標準庫模塊,它跟蹤Python解釋器分配的每個單獨的內存塊。tracemalloc能夠提供關于運行Python進程中內存分配的非常細粒度的信息:

  1. import tracemalloc 
  2.  
  3. tracemalloc.start() 
  4. my_complex_analysis_method() 
  5. current, peak = tracemalloc.get_traced_memory() 
  6. print(f"Current memory usage is {current / 10**6}MB; Peak was {peak / 10**6}MB") 
  7. tracemalloc.stop() 

調用tracemplugin .start()啟動跟蹤進程。在進行跟蹤時,您可以詢問分配了哪些內容的詳細信息;在本例中,我們只要求當前和峰值內存分配。調用tracemplugin .stop()將刪除hook并清除已經收集的任何跟蹤。

不過,這種程度的細節是要付出代價的。tracemalloc將自己深深地注入到正在運行的Python進程中——正如您所預期的那樣,這會帶來性能損失。在我們的測試中,我們觀察到在運行分析時使用tracemalloc的速度下降了30%。在分析單個進程時,這可能是可以的,但在生產中,您確實不希望僅僅為了監視內存使用情況而降低30%的性能。

3. 抽樣

幸運的是,Python標準庫提供了另一種觀察內存使用情況的方法—resource模塊。resource模塊為程序分配的資源提供基本控制,包括內存使用:

  1. import resource 
  2. usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

getrusage()的調用返回程序所使用的資源。常量RUSAGE_SELF表示我們只對這個進程使用的資源感興趣,而不是它的子進程。返回的對象是一個結構,它包含一系列操作系統資源,包括CPU時間、信號、上下文切換等;但就我們的目的而言,我們感興趣的是maxrss——最大駐留集大小——它是進程當前在RAM中持有的內存量。

但是,與tracemalloc模塊不同的是,資源模塊不隨時間跟蹤使用情況—它只提供點采樣。因此,我們需要實現一種方法來隨時間對內存使用情況進行采樣。

首先,我們定義一個類來執行內存監控:

  1. import resource 
  2. from time import sleep 
  3.  
  4. class MemoryMonitor: 
  5.     def __init__(self): 
  6.         self.keep_measuring = True 
  7.  
  8.     def measure_usage(self): 
  9.         max_usage = 0 
  10.         while self.keep_measuring: 
  11.             maxmax_usage = max( 
  12.                 max_usage, 
  13.                 resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 
  14.             ) 
  15.             sleep(0.1) 
  16.  
  17.         return max_usage 

在這個類的實例上調用measure_usage()時,它將進入一個循環,每0.1秒測量一次內存使用情況。將跟蹤內存使用量的任何增加,并在循環退出時返回最大內存分配。

但是什么告訴循環退出呢?我們在哪里調用被監視的代碼?我們在單獨的線程中完成。

  1. from concurrent.futures import ThreadPoolExecutor 
  2.  
  3.  
  4. with ThreadPoolExecutor() as executor: 
  5.     monitor = MemoryMonitor() 
  6.     mem_thread = executor.submit(monitor.measure_usage) 
  7.     try: 
  8.         fn_thread = executor.submit(my_analysis_function) 
  9.         result = fn_thread.result() 
  10.  
  11.     finally: 
  12.         monitor.keep_measuring = False 
  13.         max_usage = mem_thread.result() 
  14.  
  15.     print(f"Peak memory usage: {max_usage}") 

ThreadPoolExecutor為提交要在線程中執行的任務提供了一種方便的方法。我們向執行程序提交兩個任務——監視器和my_analysis_function(如果分析函數需要額外的參數,可以通過提交調用傳入它們)。對fn_thread.result()的調用將被阻塞,直到分析函數完成并獲得其結果,此時我們可以通知監視器停止并獲得最大內存。try/finally模塊確保了如果分析函數拋出異常,內存線程仍然會被終止。

使用這種方法,我們可以有效地隨時間對內存使用情況進行抽樣。大部分工作將在主分析線程中完成;但是每0.1秒,監視器線程就會被喚醒,進行一次內存測量,如果內存使用量增加就將其存儲,然后返回睡眠狀態。

英文原文:

https://medium.com/survata-engineering-blog/monitoring-memory-usage-of-a-running-python-program-49f027e3d1ba

 

責任編輯:趙寧寧 來源: 今日頭條
相關推薦

2009-02-03 09:49:00

FTP空間共享

2009-10-21 12:42:20

Linux系統資源操作系統

2009-06-16 09:18:26

Linux系統管理系統資源

2017-01-18 21:57:14

2010-06-02 11:06:15

Linux 內存監控

2010-02-03 17:16:58

Linux內存使用

2010-10-14 16:10:28

MySQL排序

2010-09-26 12:45:29

2022-09-26 09:44:10

Linux

2013-07-23 06:56:12

Android內存機制APP內存使用情況Android開發學習

2022-11-11 14:48:41

內存top命令

2022-07-13 14:26:26

Linux

2019-06-24 08:53:01

Bash腳本Linux系統運維

2020-02-10 19:50:08

Linux內存使用命令

2015-11-09 15:32:34

TorTor網絡隱私網絡

2017-11-30 18:42:22

PythonCPU腳本分析

2009-07-09 18:03:25

tomcatJVM內存

2010-06-02 12:47:12

Linux 內存監控

2023-01-27 15:28:04

開發Python內存

2023-08-21 14:18:48

操作系統Linux
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品成人免费 | 亚洲一区二区精品视频在线观看 | 波多野结衣精品在线 | 一区二区精品在线 | 国产精品视频不卡 | 久久精品伊人 | 婷婷丁香在线视频 | 久久综合一区 | 在线视频91 | 91在线观| 久久www免费视频 | 亚洲精品自在在线观看 | 毛片av免费看 | 国产精品久久久久久一级毛片 | 一级黄色短片 | 99精品网站 | 成人在线播放网站 | 一区二区在线不卡 | 国产成视频在线观看 | 精品国产一区二区国模嫣然 | 国产探花在线精品一区二区 | 久久久久久久久蜜桃 | 久久亚洲欧美日韩精品专区 | 91素人| 一级毛片视频 | 亚洲视频一区在线观看 | 日韩一区二区三区精品 | 99资源| 国产清纯白嫩初高生视频在线观看 | av特级毛片 | 欧美a区 | 中文字幕精品一区久久久久 | 岛国精品| 国产在线资源 | 狠狠干av| 久久精品aaa | 九九热在线观看 | 丁香婷婷综合激情五月色 | 欧美亚洲另类丝袜综合网动图 | 最新日韩精品 | 成人污污视频 |