最佳化應用程式記憶體用量
調整 Guardium® 應用程式架構以最佳化應用程式記憶體用量。
在「Guardium 主控台」上執行的應用程式限制使用 200 MB 的記憶體。當應用程式超過此臨界值時,會在 /var/log/guardium.error 檔案中產生日誌。最後,管理應用程式的儲存器會關閉,如果應用程式使用的記憶體數量繼續超過此臨界值,則會重新啟動該儲存器。
有三個方法可以協助避免應用程式超過 100 MB 臨界值:
- 將工作區塊化(或錯列)成小型的記憶體覆蓋區,即可避免配置大量記憶體。
- 變更應用程式架構所使用的記憶體模型。
- 完成使用大量記憶體的程式碼時,呼叫記憶體回收
變更應用程式架構記憶體模型
依預設,應用程式架構會配置 Werkzeug WSGI Web 應用程式伺服器,Flask 將使用該伺服器作為單一處理程序來執行。執行緒用來處理每一個要求。您可以配置應用程式伺服器,使其建立個別的處理程序來處理每一個新要求。當要求完成時,處理程序便會毀損。而 Python 直譯器配置來處理此要求的所有記憶體都會釋放。
若要置換此行為,請編輯 run.py 檔案,並設定 threading=False 及 process=N,其中 N 大於 1。 例如,process=3 的值會對每個直譯器配置大約 25 MB,因此保留一些空間供日後成長時使用。
__author__ = 'IBM'
from app import app
from app.gpylib import gpylib
gpylib.create_log()
app.run(debug = True, host='0.0.0.0',
threaded=False,
process=3)
在您的應用程式 ZIP 保存檔內,併入 template 資料夾中的 run.py 原始檔。然後,以您的設定改寫在安裝期間所建立的 run.py。
呼叫記憶體回收
Python 可能不知道何時釋放記憶體。您可以加快記憶體回收的速度,只要在不再需要大量記憶體的區段後面放入下列程式碼即可:
import gc
gc.collect()
註: Python 不保證您的程式碼所使用的所有記憶體都會回到 OS。記憶體回收唯一可以保證的是,物件所使用且已回收的記憶體,日後可由其他物件使用。上一節所提到的變更應用程式架構記憶體模型選項,對長時間執行的應用程式而言很重要。
結束處理程序一律保證釋出記憶體,以供其他元件使用。
工具
有一些工具可協助您識別記憶體問題:
- 記憶體側寫程式
- 此 Python 模組用來監視處理程序的記憶體耗用量。如需相關資訊,請參閱 Python Memory Profiler。
- Linux 公用程式
- 指令行公用程式 top 可用來監視機器上執行的所有 Python 處理程序:
top -p $(pgrep -d',' python)
您也可以使用下列指令來取得系統上所有 Python 直譯器所使用的 MB 總數:
ps -e -o pid,comm,rss | grep python | awk '/python/{print $3}' | awk '{sum+=$1} END
- 資源模組
- 將下列程式碼新增至您的模組,即可記載處理程序所使用的記憶體數量:
import resource print 'Memory usage: %s (kb)' % resource.getrusage (resource.RUSAGE_SELF).ru_maxrss