如何使用Python动态控制Linux系统的内存占用百分比

作者&投稿:不贺 (若有异议请与网页底部的电邮联系)
怎样利用shell脚本或者程序,控制linux系统CPU和内存使用率~

系统CPU和内存是无法控制的,只能是在系统上跑个什么后台进程或者程序来使CPU下降才行。

想监视系统内存?好像是没法直接得到现成的百分比的,自己取值计算一下吧
totalmem=`free -m | grep 'Mem' | awk '{print $3}'`
usedmem=`free -m | grep 'Mem' | awk '{print $2}'`
usage=$(bc<<EOF
scale=4
($freemem/$totalmem)*100
EOF)
freeusage=`echo $free | awk -F. '{print $1}'`
echo "Free Memory Usage = $freeusage%"
以前Solaris里的改了改
只是个片段,需要什么判断之类自己填充到脚本里 一点点加吧 呵呵 希望对你有帮助
单要使用率的话二楼的更简练~~ 呵呵
free -m | sed -n '2p' | awk '{print "used mem is "$3"M,total mem is "$2"M,used percent is "$3/$2*100"%"}'


如何使用Python动态控制Linux系统的内存占用百分比?

近期有网上朋友寻求帮助:如何通过脚本动态控制Linux系统的内存占用百分比?经过一番百度+编写调试,终于初步完成了动态控制Linux系统内存占用百分比。现写出来以帮助更多的朋友。
1 前言
根据需求是动态控制Linux系统内存占用百分比,比如当前内存占用30%,如果设置内存占用为70%,则需要申请内存使达到占用70%;如果再降低到40%,则需要释放部分申请的内存。其实脚本的本质是内存动态申请与释放。
注意:因为Python脚本运行之前内存有一定占用,故设定内存占用不能低于该百分比。
2 内存动态申请
通过查询资料,使用Python动态申请内存块,可以使用ctypes包中的函数,导入包及代码如下所示:
>>> from ctypes import *
>>> mem=create_string_buffer(1024)
说明:内存申请使用create_string_buffer()函数,上面申请了1024字节的内存块。
下面演示申请100MB内存前后变化
申请前如下图所示:

使用代码如下:
>>>mem=create_string_buffer(104857600)
申请后如下图所示:

从上述两幅图中可以看出,申请内存前内存占用295MB,申请后内存占用397MB,增加了约100MB内存占用。
3 内存动态释放
由于Python对内存是有垃圾回收机制的,采用对象引用计数方式。当对象的引用计数为0时,启动垃圾回收GC。此处内存动态释放就是使用该原理。
代码如下:
>>> mem=None
释放后内存占用如下图所示:

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

代码片段如下所示:
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]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
说明:按行读取meminfo文件内容,创建字典对象mem,将meminfo文件第一列设置为mem对象的键值,将meminfo文件第二列数字设置为mem对象的值。
5 获取用户输入百分比
通过读取键盘输入字符串,然后转换为数字实现接收用户输入的百分比,代码如下所示:
input_str=raw_input("Input UsedMemory`s Rate or q to exit:")
rate=float(input_str)
注意:此处键盘输入的都是字符串,需要进行字符串转换为数字,使用float()或long()函数进行转换。
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程序运行。该行需要修改为待运行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脚本代码
test.py
------------------------------------------------------------------------------------------------
#!/usr/bin/python2.6
def memory_stat():
mem = {}
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]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
# - mem['Buffers']- mem['Cached']
return mem

mem=memory_stat()
print("Used(MB):%d"%(long(mem['MemUsed'])/1024/1024))
print("Rate:%d%%"%(100*long(mem['MemUsed'])/float(mem['MemTotal'])))

§§§§§§§§§§§§§§§§§§§§§§§§§§
mem_rate.py
---------------------------------------------------
#!/usr/bin/python2.6

from 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(':')[0]
var = line.split(':')[1].split()[0]
mem[name]= long(var)* 1024.0
mem['MemUsed']= mem['MemTotal']- mem['MemFree']
# Return MemroyInfo Object
return mem

# Get Simple Memory Info
def get_memory_info(mem):
# Byte -> MB
n=1024* 1024
used=float(mem['MemUsed'])/ n
total=float(mem['MemTotal'])/ n
rate=used/total* 100
smp={'used':used,'total':total,'rate':rate}
return smp

# Display Current Memory Info
def print_memory_info(mem):
# Get SimpleMemory Info
smp=get_memory_info(mem)
print("Used(MB):%d\tTotal(MB):%d\tUsedRate:%d%%"%(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 UsedMemory`s Rate or q to exit:")
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_rate)and (rate<=95)):
info={'rate':rate,'used':mem['MemUsed']/ n}
return info
else:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))
except:
print("Please inputa valid number(%d%%~95%%)."%(org_rate))

# Set Rate Of Memory Used
def set_memory_used_rate(new_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 OrAllocate Memory ?
is_new=dest_mem>pre_used
cur_used=pre_used
while(True):
# To Calc FreeMemory Or Allocate Memory ?
need_new=dest_mem-n_chg>=pre_used
need_del=dest_mem+n_chg<=pre_used

# Need To AllocateMemory
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 FreeMemory
else:
idx=len(list)-1
if(need_deland (idx>=0)):
p=list[idx]
del list[idx]
p=None
dest_mem=dest_mem+n_chg
cur_used=cur_used-n_chg
else:
return"end"
print("****** MemoryUsed(MB):%d"%(cur_used))

# Entry Of Program

# List Of Memory Object, 10MB Of One Object
list=[]
# Get Current Memory Info
mem=get_memory_stat()
# Get Simple Memory Info
smp=get_memory_info(mem)
org_rate=smp['rate']
total=smp['total']

while(True):
# Get Rate OfMemory To Be Used
info=input_memory_used_rate(org_rate)
new_rate=float(info['rate'])
pre_used=float(info['used'])
# Set Rate OfMemory To Be Used
rtn=set_memory_used_rate(new_rate, total, pre_used, list)
if(not rtn):
print("bye!")
exit()


如何用python设计一个能实现添加、修改、删除、显示、退出等功能的小...
可以使用 Python 中的字典(dictionary)来实现一个简单的增删改查程序。具体实现步骤如下:创建一个空字典用于存储数据。通过循环菜单的方式,让用户可以选择添加、修改、删除、显示、退出等功能。根据用户的选择执行相应的操作,例如添加数据就让用户输入键值对,修改数据就让用户选择要修改的键和新值,删除...

python用什么软件编程
发展历程:由于Python语言的简洁性、易读性以及可扩展性,在国外用Python做科学计算的研究机构日益增多,一些知名大学已经采用Python来教授程序设计课程。例如卡耐基梅隆大学的编程基础、麻省理工学院的计算机科学及编程导论就使用Python语言讲授。众多开源的科学计算软件包都提供了Python的调用接口,例如著名的计算机...

python怎么运行py文件?
在如何使用Python脚本转换数据和命令行中,我们将深入探讨如何使用Python脚本和命令行来转换数据。 但是首先,值得提出一个您可能正在思考的问题:“Python如何适合命令行,为什么当我知道我可以使用IPython笔记本完成所有数据科学工作时,为什么还要使用命令行与Python进行交互?还是Jupyter实验室?” 笔记本非常适合快速进行数据可视化...

python的用途和优点
2.免费Python的使用是完全免费的,您可以从网络上免费下载、安装使用,Python上的其他程序包,也可下载安装使用。Python的免费的同时又有很多的的社区对用户的提问提出快速的技术支持,学习和使用Python技术不再是一个人在战斗!3.可移植性Python的实现是用ansic编写的,可以运行在目前所有主流平台上,手机...

Python能干什么,Python的应用领%
Python的诞生历史比Web还要早,由于Python是一种解释型的脚本语言,开发效率高,所以非常适合用来做Web开发。Python有上百种Web开发框架,有很多成熟的模板技术,选择Python开发Web应用,不但开发效率高,而且运行速度快。二、网络爬虫 网络爬虫是Python比较常用的一个场景,国际上google在早期大量地使用Python...

怎样使用python语言?
python语言是脚本语言。使用的话当然是编写代码然后就可以用了。下载开发包后,可以它自带一个IDLE,可以直接输入语句(命令)。这点类似matlab直接输入语句。当然也可以借助文本编辑器编写代码,然后直接点击代码就可以运行,脚本不需要编译,链接~~建议找本书看看~...

如何用python开发移动App后台?需要掌握哪些技术
1、如果使用python语言,需要学习哪些知识?python作为一门简单明了的语言,非常容易上手,语言层面不会太复杂,稍微有点难度的顶多就是装饰器、元类和少量函数式编程内容。要说学习的话,我觉得更多是一些编程方面通用的东西,比如:数据结构和算法、设计模式、操作系统、计算机网络之类的 2、选择什么样的...

Python字符串是什么,如何使用?
字符串可以被成对的单引号(single quote)或双引号(double quotes)包围起来,这两者的作用是一样的:字符串中当然也可以包含中文:一些情况下,选择其中一个会比另外一个更好,比如字符串本身就存在引号:如果字符串中本身就包含单引号,我们再用单引号包围字符串会怎么样呢?做个实验:Python解释器提示...

如何使用python将大量数据导出到Excel中的小技巧
1【专注:Python+人工智能|Java大数据|HTML5培训】 2【免费提供名师直播课堂、公开课及视频教程】 3【地址:北京市昌平区三旗百汇物美大卖场2层,微信公众号:yuzhitc】 向TA提问 关注 展开全部 何使用python将大量数据导出到Excel中的小技巧 (1) 问题描述:为了更好地展示数据,Excel格式的数据文件往往比文本文件更...

python可以应用在哪些领域
·Web应用开发 Python常被用于Web开发,随着Python的Web开发框架逐渐成熟,如Django、flask等等,开发者们可以更轻松地开发和管理复杂的Web程序。通过mod_wsgi模块,Apache可以运行Python编写的Web程序,举个最直观的例子,全球最大的搜索引擎 Google,在其网络搜索系统中就广泛使用 Python 语言。另外,我们经常...

广灵县18766612937: element - ui 怎样动态控制树的全部折叠和展开 -
柯叙志苓: 1.点击按钮,全部展开,然后el-tree则全部展开2.点击按钮,全部折叠,然后el-tree则全部折叠3.使用 :default-expand-all="isExpand",动态改变isExpand的值,值变化,树却没有变化

广灵县18766612937: selenium的python自动测试的子frame的动态页面的元素控制 -
柯叙志苓: selenium可以直接获取到页面动态渲染后的html元素,像你这个情况前提是要先切换到frame里,切换的代码是:driver.switch_to.frame("frame1"),其中frame1是frame的id或name

广灵县18766612937: LIN总线的应用 -
柯叙志苓: 典型的LIN 总线应用是汽车中的联合装配单元,如:门、方向盘、座椅、空调、照明灯、 湿度传感器,交流发电机等.对于这些成本比较敏感的单元,LIN 可以使那些机械元件如 智能传感器、制动器或光敏器件得到较广泛的使用.这些元件可以...

广灵县18766612937: EXTJS 中如何Treepanel动态控制节点的拖拽 -
柯叙志苓: 监听拖拽事件,如果被拖拽的节点的父节点是根节点的话,停止拖拽事件,楼主可以试下,祝你成功

广灵县18766612937: maya里怎么用mel和python写动态 button,简单来说就是用一个按钮控制另一个按钮的显示与隐藏,谢谢 -
柯叙志苓: python的脚本如下import maya.cmds as mc win=mc.window() mc.columnLayout( adjustableColumn = True ) btn1=mc.button(l="按钮开",c='') btn2=mc.button(l="按钮2",c='mc.button(btn1,e = 1,l = "按钮关")') mc.showWindow(win)mel的脚...

广灵县18766612937: python如何实现管道编程 -
柯叙志苓: 管道调用子程序 我们想在程序中使用一个子程序,但是需要动态的传递参数(这里说的动态,是指根据上次子程序输入的结果来决定这次输入什么),怎么办呢,不用慌,有subprocess! 下文我先介绍一个例子代码,以及他的输出结果! 1.#!...

广灵县18766612937: 怎样用python脚本生成一个html格式的测试报告 -
柯叙志苓: 比如很简单的,可以这样:# -*- coding:utf-8 -*- import os,sys html = open('index.html', 'w') html.write("""<html><head> <title>Test</title> <style>img{float:left;margin:5px;}</style></head><body>""") files = os.listdir('.')# 首先处理文本 for f in ...

广灵县18766612937: cansina怎样使用 faltal python module requests not found install it -
柯叙志苓: fnServerData": function ( sSource, aoData, fnCallback ) { aoData.push( { "name": "table", "value": "wordforms" } );$.ajax( {"dataType": 'json', "url": sSource, "data": aoData, "success": fnCallback } ); }

广灵县18766612937: 零基础学习python需要直接使用linux吗 -
柯叙志苓: 关键是看你需要用python干什么,是搞自动化运维,那就需要linux,初学者可以在windows下就可以学习了.入门后再根据需要考虑是否在linux下使用.

广灵县18766612937: 怎么用ArraysList动态数组控制输入一行数组,可以在控制台输入的?,输入的数组长度是随便的 -
柯叙志苓: import java.util.ArrayList; import java.util.Scanner; public class Test{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); ArrayList a = new ArrayList(); a.add(str); System.out.println(a); } } 不知道是否满足你的要求

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网