最佳化應用程式記憶體用量

調整 Guardium® 應用程式架構以最佳化應用程式記憶體用量。

在「Guardium 主控台」上執行的應用程式限制使用 200 MB 的記憶體。當應用程式超過此臨界值時,會在 /var/log/guardium.error 檔案中產生日誌。最後,管理應用程式的儲存器會關閉,如果應用程式使用的記憶體數量繼續超過此臨界值,則會重新啟動該儲存器。

有三個方法可以協助避免應用程式超過 100 MB 臨界值:

  • 將工作區塊化(或錯列)成小型的記憶體覆蓋區,即可避免配置大量記憶體。
  • 變更應用程式架構所使用的記憶體模型。
  • 完成使用大量記憶體的程式碼時,呼叫記憶體回收

變更應用程式架構記憶體模型

依預設,應用程式架構會配置 Werkzeug WSGI Web 應用程式伺服器,Flask 將使用該伺服器作為單一處理程序來執行。執行緒用來處理每一個要求。您可以配置應用程式伺服器,使其建立個別的處理程序來處理每一個新要求。當要求完成時,處理程序便會毀損。而 Python 直譯器配置來處理此要求的所有記憶體都會釋放。

若要置換此行為,請編輯 run.py 檔案,並設定 threading=Falseprocess=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