最近有網友求助:如何通過腳本動態控制Linux系統的內存占用百分比?經過百度+的壹番調試,最終完成了Linux系統內存占用百分比的動態控制。現在寫出來幫助更多的朋友。
1前言
根據需求動態控制Linux系統的內存占用百分比,比如當前的內存占用為30%。如果內存占用設置為70%,則需要申請內存達到70%。如果進壹步減少到40%,就需要釋放壹些請求的內存。其實腳本的本質就是內存的動態應用和釋放。
註意:因為Python腳本運行前有壹定的內存占用,所以內存占用不能低於這個百分比。
2動態內存應用
通過查詢數據,使用Python動態申請內存塊,可以使用ctypes包中的函數。導入包和代碼如下:
& gt& gt& gt從ctypes導入*
& gt& gt& gtmem = create _ string _ buffer(1024)
註意:內存應用程序使用create_string_buffer()函數,該函數適用於1024字節的內存塊。
下面演示申請100MB內存前後的變化。
應用前,如下圖所示:
按如下方式使用代碼:
& gt& gt& gtmem = create _ string _ buffer(104857600)
應用後,如下圖所示:
從上面兩張圖可以看出,應用前內存占用295MB,應用後397MB,增加了約100MB。
3動態內存釋放
因為Python對內存有垃圾收集機制,所以采用對象引用計數法。當對象的引用計數為0時,啟動垃圾回收GC。這個原理用在這裏的動態內存釋放中。
代碼如下:
& gt& gt& gtmem =無
釋放後的內存占用如下圖所示:
內存使用量從397MB減少到297MB,釋放了100MB內存使用量。
描述:給對象mem賦值None後,mem對象的引用計數為0,開始垃圾回收,釋放mem對象占用的內存。
4系統總內存和占用內存檢測
因為需要設置內存占用的百分比,所以需要獲取系統的總物理內存和占用內存。本文采用的方法是讀取系統文件“/proc/meminfo”,從中可以分析出內存總大小、當前內存占用大小等內存相關信息。文件內容格式如下圖所示:
代碼片段如下:
f =打開("/proc/meminfo ")
lines = f.readlines()
f.close()
對於線中的線:
if len(line)& lt;2:繼續
name = line.split(':')[0]
var = line.split(':')[1]。拆分()[0]
mem[name]= long(var)* 1024.0
mem[' MemUsed ']= mem[' mem total ']-mem[' mem free ']
描述:逐行讀取meminfo文件的內容,創建字典對象mem,將meminfo文件的第壹列設置為mem對象的鍵值,將meminfo文件的第二列的編號設置為mem對象的值。
5獲取用戶輸入的百分比
通過讀取鍵盤輸入字符串並將其轉換為數字來接收用戶輸入的百分比。代碼如下:
Input _ str = raw _ Input(" Input used memory ` s Rate或q to exit:")
rate=float(input_str)
註意:這裏的鍵盤輸入都是字符串,需要轉換成數字。使用float()或long()函數進行轉換。
6動態設置內存占用率測試
該測試使用了兩個Python腳本文件test.py和mem_rate.py,它們的功能是查看當前的內存占用情況,並動態設置內存占用百分比。如下圖所示:
註意:以上兩個文件需要用“chmod +x *修改成可執行屬性。py”。
6.1查看當前內存使用情況
檢查當前的內存占用百分比,使用上面的test.py文件,運行命令as "。/test.py ",運行結果如下圖所示:
目前使用的內存是320MB,占17%。
6.2動態設置內存占用率
使用上面的mem_rate.py腳本動態設置內存百分比。請註意,腳本文件的第壹行是“#!/usr/bin/python2.6”,這意味著腳本是用python2.6程序運行的。這壹行需要修改為要運行的Linux系統中Python的實際安裝程序路徑。
動態內存百分比設置界面如下圖所示:
處於等待輸入的狀態。此外,它還顯示了當前內存占用量(321MB)、總內存大小(1869MB)和內存占用百分比(17%)。
如果此時內存占用率設置為80%,腳本將壹次申請10MB空間,直到內存占用率接近或等於80%。如下圖所示:
內存申請流程如下圖所示:
在內存應用過程中,百分比變化為:35%,45%,56%,70%,…
mem_rate.py的運行過程如下圖所示:
內存申請過程中,占用變化為:1461MB,1471MB,1481MB,1491MB。
此時,如果內存占用率設置為20%,則需要釋放部分內存。
test.py腳本的運行過程如下圖所示:
因為釋放的內存運行速度更快,所以最終的結果是捕獲。
內存使用率為20%。
mem_rate.py腳本的運行過程如下圖所示:
內存釋放過程中,內存占用為:413MB,403MB,393MB,383MB,最終內存占用穩定在20%,383MB。
輸入“q”或“q”退出內存占用百分比設置過程,如下圖所示:
此時內存占用情況如下圖所示:
內存使用恢復到運行mem_rate.py腳本之前的狀態,即17%和321MB。
※※※※※※※※※※※※※※※※※※※※※※※※※※※※※
附件:完整的Python腳本代碼
測試. py
-
#!/usr/bin/python2.6
def memory_stat():
mem = {}
f =打開("/proc/meminfo ")
lines = f.readlines()
f.close()
對於線中的線:
if len(line)& lt;2:繼續
name = line.split(':')[0]
var = line.split(':')[1]。拆分()[0]
mem[name]= long(var)* 1024.0
mem[' MemUsed ']= mem[' mem total ']-mem[' mem free ']
# - mem['Buffers']- mem['Cached']
返回內存
mem=memory_stat()
print(" Used(MB):% d " %(long(mem[' MemUsed '])/1024/1024))
print(" Rate:% d % % "(100 * long(mem[' MemUsed '])/float(mem[' mem total ']))
內存速率. py
-
#!/usr/bin/python2.6
從ctypes導入*
#獲取內存信息(總計,已用...字節)
def get_memory_stat():
mem = {}
f =打開("/proc/meminfo ")
lines = f.readlines()
f.close()
對於線中的線:
if len(line)& lt;2:繼續
name = line.split(':')[0]
var = line.split(':')[1]。拆分()[0]
mem[name]= long(var)* 1024.0
mem[' MemUsed ']= mem[' mem total ']-mem[' mem free ']
# Return MemroyInfo對象
返回內存
#獲取簡單的內存信息
def獲取內存信息(mem):
# Byte-& gt;醫學學士
n=1024* 1024
used=float(mem['MemUsed'])/ n
total=float(mem['MemTotal'])/ n
比率=已用/總數* 100
smp={'used ':已用,' total ':總計,' rate':rate}
返回smp
#顯示當前內存信息
def print_memory_info(內存):
#獲取簡單內存信息
smp =獲取內存信息(mem)
print(" Used(MB):% d \ t total(MB):% d \ t setrate:% d % % "(SMP[' Used '],smp['total'],smp['rate']))
#獲取用於設置的內存速率(整數格式)
定義輸入_存儲_使用_比率(組織_比率):
# Byte-& gt;醫學學士
n=1024* 1024
while(True):
mem=get_memory_stat()
打印存儲信息
Input _ str = raw _ Input(" Input used memory ` s Rate或q to exit:")
if(len(input_str)== 0):
繼續
if("q"== input_str):
info={'rate':0,' used':mem['MemUsed']/ n}
退貨信息
if("Q"== input_str):
info={'rate':0,' used':mem['MemUsed']/ n}
退貨信息
嘗試:
rate=float(input_str)
如果((rate & gt=org_rate)和(rate & lt=95)):
info={'rate':rate,' used':mem['MemUsed']/ n}
退貨信息
否則:
print("請輸入有效數字(%d%%~95%%)。"%(org_rate))
除了:
print("請輸入有效數字(%d%%~95%%)。"%(org_rate))
#設置內存使用率
def set _ memory _ used _ rate(new _ rate,total,pre_used,list):
if(new_rate==0):
不返回
dest _ mem =總計* new_rate /100.0
# 10MB
mb10=10485760
n_chg=10
#釋放內存還是分配內存?
is _ new = dest _ mem & gt二手的
當前使用的=預先使用的
while(True):
#計算空閑內存還是分配內存?
need _ new = dest _ mem-n _ chg & gt;=預先使用的
need _ del = dest _ mem+n _ chg & lt;=預先使用的
#需要分配內存
if(is_new):
if(need_new):
p =創建字符串緩沖區(mb10)
列表.追加(p)
dest_mem=dest_mem-n_chg
cur _ used = cur _ use+n _ chg
否則:
返回“結束”
#需要釋放內存
否則:
idx=len(list)-1
if(need _ deland(idx & gt;=0)):
p=list[idx]
刪除列表[idx]
p =無
目標內存=目標內存+n_chg
cur_used=cur_used-n_chg
否則:
返回“結束”
print(" * * * * * * * memory used(MB):% d " %(cur _ used))
#節目入口
#內存對象列表,10MB壹個對象
list=[]
#獲取當前內存信息
mem=get_memory_stat()
#獲取簡單的內存信息
smp =獲取內存信息(mem)
org_rate=smp['rate']
total=smp['total']
while(True):
#獲取要使用的內存速率
info =輸入_存儲_使用_比率(組織_比率)
new_rate=float(info['rate'])
pre_used=float(info['used'])
#設置要使用的內存速率
RTN = set _ memory _ used _ rate(new _ rate,total,pre_used,list)
如果(非rtn):
打印(“拜拜!”)
退出()