使用Python动态控制Linux系统的内存占用百分比_第1页
使用Python动态控制Linux系统的内存占用百分比_第2页
使用Python动态控制Linux系统的内存占用百分比_第3页
使用Python动态控制Linux系统的内存占用百分比_第4页
使用Python动态控制Linux系统的内存占用百分比_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、如何使用Python动态控制Linux系统的内存占用百分比?近期有网上朋友寻求帮助:如何通过脚本动态控制Linux系统的内存占用百分比?经过一番百度+编写调试,终于初步完成了动态控制Linux系统内存占用百分比。现写出来以帮助更多的朋友。1 前言根据需求是动态控制Linux系统内存占用百分比,比如当前内存占用30%,如果设置内存占用为70%,则需要申请内存使达到占用70%;如果再降低到40%,则需要释放部分申请的内存。其实脚本的本质是内存动态申请与释放。注意:因为Python脚本运行之前内存有一定占用,故设定内存占用不能低于该百分比。2 内存动态申请通过查询资料,使用Python动态申请内存块

2、,可以使用ctypes包中的函数,导入包及代码如下所示:>>> from ctypes import *>>> mem=create_string_buffer(1024)说明:内存申请使用create_string_buffer()函数,上面申请了1024字节的内存块。下面演示申请100MB内存前后变化申请前如下图所示:使用代码如下:>>> mem=create_string_buffer(104857600)申请后如下图所示:从上述两幅图中可以看出,申请内存前内存占用295MB,申请后内存占用397MB,增加了约100MB内存占用。3

3、内存动态释放由于Python对内存是有垃圾回收机制的,采用对象引用计数方式。当对象的引用计数为0时,启动垃圾回收GC。此处内存动态释放就是使用该原理。代码如下:>>> mem=None释放后内存占用如下图所示:内存占用由397MB降低到297MB,释放了100MB内存占用。说明:将None赋值给对象mem后,mem对象的引用计数即为0,此时垃圾回收启动,释放mem对象占用的内存。4 系统总内存、占用内存检测由于需要设定内存占用百分比,故需要获取系统总物理内存和占用内存。本文使用的方法是读取系统文件“/proc/meminfo”,从中解析出总内存大小以及当前内存占用大小等内存相

4、关的信息。该文件内容格式如下图所示:代码片段如下所示: 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文件内容,创建字典对象mem,将meminfo文件第一列设置为mem对象的键值,将meminfo文件第二列数字设置为mem对象的值。5 获取用户输入百分比通过读取键盘输入字符串,然后转换为数字实现接收用户输入的百分比,代码如下所示:input_str=raw_input("Input Used Memorys Rate or q to exit:")rate=float(input_str)注意:此处键盘输入的都是字符串,需要进行字符串转换为数字,使用float()或long()函数进行转换。6 动态设置内存占用百分比测

6、试测试使用两个Python脚本文件,分别是test.py和mem_rate.py,其功能分别是查看当前内存占用和动态设定内存占用百分比。如下图所示:注意:上述两个文件需要使用“chmod +x *.py”修改为可执行属性。6.1 查看当前内存占用查看当前内存占用百分比,使用上述test.py文件,运行命令为“./test.py”,运行结果如下图所示:当前使用内存为320MB,占用百分比为17%。6.2 动态设置内存占用百分比动态设置内存占用百分比使用上述mem_rate.py脚本,注意该脚本文件第一行代码为“#!/usr/bin/python2.6”,表示该脚本使用python2.6程序运行。

7、该行需要修改为待运行Linux系统中Python实际的安装程序路径。动态内存百分比设置界面如下图所示:处于待输入状态。另外显示了当前内存占用(321MB),总内存大小(1869MB)以及内存占用百分比(17%)。如果此时设置内存占用百分比为80%,则脚本会每次申请10MB空间,直至内存占用接近或等于80%为止。如下图所示:内存申请过程如下图所示:内存申请过程中占用百分比变化为:35%,45%,56%,70%,mem_rate.py运行过程如下图所示:内存申请过程中占用变化为:1461MB,1471MB,1481MB,1491MB。此时如果内存占用百分比设置为20%,则需要释放一部分内存。tes

8、t.py脚本运行过程如下图所示:由于释放内存运行较快,抓取到最后结果内存占用为20%。mem_rate.py脚本运行过程如下图所示:内存释放过程中内存占用为:413MB,403MB,393MB,383MB,最后内存占用稳定在20%,383MB。输入“q”或“Q”退出内存占用百分比设定过程,如下图所示:此时内存占用如下图所示:内存占用恢复到运行mem_rate.py脚本之前状态,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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论