使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比_第1頁
使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比_第2頁
使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比_第3頁
使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比_第4頁
使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、如何使用Python動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比?近期有網(wǎng)上朋友尋求幫助:如何通過腳本動態(tài)控制Linux系統(tǒng)的內(nèi)存占用百分比?經(jīng)過一番百度+編寫調(diào)試,終于初步完成了動態(tài)控制Linux系統(tǒng)內(nèi)存占用百分比。現(xiàn)寫出來以幫助更多的朋友。1 前言根據(jù)需求是動態(tài)控制Linux系統(tǒng)內(nèi)存占用百分比,比如當前內(nèi)存占用30%,如果設(shè)置內(nèi)存占用為70%,則需要申請內(nèi)存使達到占用70%;如果再降低到40%,則需要釋放部分申請的內(nèi)存。其實腳本的本質(zhì)是內(nèi)存動態(tài)申請與釋放。注意:因為Python腳本運行之前內(nèi)存有一定占用,故設(shè)定內(nèi)存占用不能低于該百分比。2 內(nèi)存動態(tài)申請通過查詢資料,使用Python動態(tài)申請內(nèi)存塊

2、,可以使用ctypes包中的函數(shù),導入包及代碼如下所示:>>> from ctypes import *>>> mem=create_string_buffer(1024)說明:內(nèi)存申請使用create_string_buffer()函數(shù),上面申請了1024字節(jié)的內(nèi)存塊。下面演示申請100MB內(nèi)存前后變化申請前如下圖所示:使用代碼如下:>>> mem=create_string_buffer(104857600)申請后如下圖所示:從上述兩幅圖中可以看出,申請內(nèi)存前內(nèi)存占用295MB,申請后內(nèi)存占用397MB,增加了約100MB內(nèi)存占用。3

3、內(nèi)存動態(tài)釋放由于Python對內(nèi)存是有垃圾回收機制的,采用對象引用計數(shù)方式。當對象的引用計數(shù)為0時,啟動垃圾回收GC。此處內(nèi)存動態(tài)釋放就是使用該原理。代碼如下:>>> mem=None釋放后內(nèi)存占用如下圖所示:內(nèi)存占用由397MB降低到297MB,釋放了100MB內(nèi)存占用。說明:將None賦值給對象mem后,mem對象的引用計數(shù)即為0,此時垃圾回收啟動,釋放mem對象占用的內(nèi)存。4 系統(tǒng)總內(nèi)存、占用內(nèi)存檢測由于需要設(shè)定內(nèi)存占用百分比,故需要獲取系統(tǒng)總物理內(nèi)存和占用內(nèi)存。本文使用的方法是讀取系統(tǒng)文件“/proc/meminfo”,從中解析出總內(nèi)存大小以及當前內(nèi)存占用大小等內(nèi)存相

4、關(guān)的信息。該文件內(nèi)容格式如下圖所示:代碼片段如下所示: f = open("/proc/meminfo") lines = f.readlines() f.close() for line in lines: if len(line) < 2: continue name = line.split(':')0 var = line.split(':')1.split()0 memname = long(var) * 1024.0 mem'MemUsed' = mem'MemTotal' - mem'

5、;MemFree'說明:按行讀取meminfo文件內(nèi)容,創(chuàng)建字典對象mem,將meminfo文件第一列設(shè)置為mem對象的鍵值,將meminfo文件第二列數(shù)字設(shè)置為mem對象的值。5 獲取用戶輸入百分比通過讀取鍵盤輸入字符串,然后轉(zhuǎn)換為數(shù)字實現(xiàn)接收用戶輸入的百分比,代碼如下所示:input_str=raw_input("Input Used Memorys Rate or q to exit:")rate=float(input_str)注意:此處鍵盤輸入的都是字符串,需要進行字符串轉(zhuǎn)換為數(shù)字,使用float()或long()函數(shù)進行轉(zhuǎn)換。6 動態(tài)設(shè)置內(nèi)存占用百分比測

6、試測試使用兩個Python腳本文件,分別是test.py和mem_rate.py,其功能分別是查看當前內(nèi)存占用和動態(tài)設(shè)定內(nèi)存占用百分比。如下圖所示:注意:上述兩個文件需要使用“chmod +x *.py”修改為可執(zhí)行屬性。6.1 查看當前內(nèi)存占用查看當前內(nèi)存占用百分比,使用上述test.py文件,運行命令為“./test.py”,運行結(jié)果如下圖所示:當前使用內(nèi)存為320MB,占用百分比為17%。6.2 動態(tài)設(shè)置內(nèi)存占用百分比動態(tài)設(shè)置內(nèi)存占用百分比使用上述mem_rate.py腳本,注意該腳本文件第一行代碼為“#!/usr/bin/python2.6”,表示該腳本使用python2.6程序運行。

7、該行需要修改為待運行Linux系統(tǒng)中Python實際的安裝程序路徑。動態(tài)內(nèi)存百分比設(shè)置界面如下圖所示:處于待輸入狀態(tài)。另外顯示了當前內(nèi)存占用(321MB),總內(nèi)存大?。?869MB)以及內(nèi)存占用百分比(17%)。如果此時設(shè)置內(nèi)存占用百分比為80%,則腳本會每次申請10MB空間,直至內(nèi)存占用接近或等于80%為止。如下圖所示:內(nèi)存申請過程如下圖所示:內(nèi)存申請過程中占用百分比變化為:35%,45%,56%,70%,mem_rate.py運行過程如下圖所示:內(nèi)存申請過程中占用變化為:1461MB,1471MB,1481MB,1491MB。此時如果內(nèi)存占用百分比設(shè)置為20%,則需要釋放一部分內(nèi)存。tes

8、t.py腳本運行過程如下圖所示:由于釋放內(nèi)存運行較快,抓取到最后結(jié)果內(nèi)存占用為20%。mem_rate.py腳本運行過程如下圖所示:內(nèi)存釋放過程中內(nèi)存占用為:413MB,403MB,393MB,383MB,最后內(nèi)存占用穩(wěn)定在20%,383MB。輸入“q”或“Q”退出內(nèi)存占用百分比設(shè)定過程,如下圖所示:此時內(nèi)存占用如下圖所示:內(nèi)存占用恢復到運行mem_rate.py腳本之前狀態(tài),17%,321MB。附:完整Python腳本代碼test.py-#!/usr/bin/python2.6def memory_stat(): mem = f = open("/proc/meminfo"

9、;) lines = f.readlines() f.close() for line in lines: if len(line) < 2: continue name = line.split(':')0 var = line.split(':')1.split()0 memname = long(var) * 1024.0 mem'MemUsed' = mem'MemTotal' - mem'MemFree' # - mem'Buffers' - mem'Cached'

10、return mem mem=memory_stat()print("Used(MB):%d"%(long(mem'MemUsed')/1024/1024)print("Rate:%d%"%(100*long(mem'MemUsed')/float(mem'MemTotal')§§§§§§§§§§§§§§§§§§§

11、67;§§§§§§mem_rate.py-#!/usr/bin/python2.6from ctypes import *# Get Memory Info(Total, Used. Byte)def get_memory_stat(): mem = f = open("/proc/meminfo") lines = f.readlines() f.close() for line in lines: if len(line) < 2: continue name = line.split(':

12、9;)0 var = line.split(':')1.split()0 memname = long(var) * 1024.0 mem'MemUsed' = mem'MemTotal' - mem'MemFree' # Return Memroy Info Object return mem # Get Simple Memory Infodef get_memory_info(mem): # Byte -> MB n=1024 * 1024 used=float(mem'MemUsed') / n to

13、tal=float(mem'MemTotal') / n rate=used/total * 100 smp='used':used, 'total':total, 'rate':rate return smp# Display Current Memory Infodef print_memory_info(mem): # Get Simple Memory Info smp=get_memory_info(mem) print("Used(MB):%dtTotal(MB):%dtUsed Rate:%d%"

14、%(smp'used', smp'total', smp'rate') # Get Rate Of Memory Used To Be Setted(Integer Formate)def input_memory_used_rate(org_rate): # Byte -> MB n=1024 * 1024 while(True): mem=get_memory_stat() print_memory_info(mem) input_str=raw_input("Input Used Memorys Rate or q to e

15、xit:") if(len(input_str) = 0): continue if("q" = input_str): info='rate':0,'used':mem'MemUsed' / n return info if("Q" = input_str): info='rate':0,'used':mem'MemUsed' / n return info try: rate=float(input_str) if(rate>=org_ra

16、te) and (rate<=95): info='rate':rate,'used':mem'MemUsed' / n return info else: print("Please input a valid number(%d%95%)."%(org_rate) except: print("Please input a valid number(%d%95%)."%(org_rate) # Set Rate Of Memory Useddef set_memory_used_rate(new_

17、rate, total, pre_used,list): if(new_rate=0): return None dest_mem=total * new_rate / 100.0 # 10MB mb10=10485760 n_chg=10 # Free Memory Or Allocate Memory ? is_new=dest_mem>pre_used cur_used=pre_used while(True): # To Calc Free Memory Or Allocate Memory ? need_new=dest_mem-n_chg>=pre_used need_

18、del=dest_mem+n_chg<=pre_used # Need To Allocate Memory if(is_new): if(need_new): p=create_string_buffer(mb10) list.append(p) dest_mem=dest_mem-n_chg cur_used=cur_used+n_chg else: return "end" # Need To Free Memory else: idx=len(list)-1 if(need_del and (idx>=0): p=listidx del listidx p=None dest_mem=dest_mem+n_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論