⑴ 如何使用python动态控制linux系统的内存占用百分比
如何使用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脚本怎么获取远程linux服务器的进程名
进程信息
/proc目录包含了所有正运行的进程目录。这些目录的名字和进程的标识符是一样的。所以,如果你遍历/proc目录下那些使用数字作为它们的名字的目录,你就会获得所有现在正在运行的进程列表。在下面的代码中process_list()函数返回所有现在正在运行的进程的标识符列表。当你执行这个程序后,这个列表的长度就是在系统上运行的总进程数。
复制代码 代码如下:
#!/usr/bin/env python
"""
List of all process IDs currently active
"""
from __future__ import print_function
import os
def process_list():
pids = []
for subdir in os.listdir('/proc'):
if subdir.isdigit():
pids.append(subdir)
return pids
if __name__=='__main__':
pids = process_list()
print('Total number of running processes:: {0}'.format(len(pids)))
上面的程序当执行后会显示和下面类似的输出:
复制代码 代码如下:
Total number of running processes:: 229
每个进程目录包含了一些其他文件和目录,如进程命令的调用,它正使用的共享库以及其它的。
建议看看《Linux就该这么学》这本书
⑶ Python 在 Linux 系统运维中都有哪些应用
本人主要用shell,结合工作经验,给出如下常用功能:
1.制作定时任务,可以获得系统状态,然后截取系统状态,发送至故障监控平台或短信平台,实现故障的自动预警。
2.提取数据,形成文本,处理文本,得到规格化的数据,提供给相关部门使用。
3.制作shell交互式菜单,提供给其他运维值班人员使用,用以手工监控系统各种状态
4.版本升级、系统变更等操作需要使用。
⑷ 请教如何在Python中获取Linux当前系统时间
1234In [1]: from datetime import datetime In [2]: datetime.now()Out[2]: datetime.datetime(2015, 1, 31, 12, 19, 46, 862178)
如果解决了您的问题请采纳!
如果未解决请继续追问!
⑸ python脚本怎么执行linux系统命令
打开apache服务其实就一条,就是执行{type httpd}所得到的执行文件。
#!/usr/bin/python
#!coding=<utf-8>
import os
os.system("service httpd start")
#这样就执行完了,os模块还有其他可用方法,比如popen(),请参考标准模块手册。
⑹ 如何在 Linux 上使用 Python 读取 word 文件信息
请注意,所有的程序在它们第一行都是#!/usr/bin/env/python,也就是说,我们想要Python的解释器来执行这些脚本。因此,如果你想你的脚本具有执行性,请使用chmod +x your-script.py, 那么你就可以使用./your-script.py来执行它了(在本文中你将会看到这种方式)
探索platform模块
platform模块在标准库中,它有很多运行我们获得众多系统信息的函数。让我们运行Python解释器来探索它们中的一些函数,那就从platform.uname()函数开始吧:
>>> import platform
>>> platform.uname()
('Linux', 'fedora.echorand', '3.7.4-204.fc18.x86_64', '#1 SMP Wed Jan 23 16:44:29 UTC 2013', 'x86_64')
如果你已知道linux上的uname命令,那么你就会认出来这个函数就是这个命令的一个接口。在Python 2上,它会返回一个包含系统类型(或者内核版本),主机名,版本,发布版本,机器的硬件以及处理器信息元组(tuple)。你可以使用下标访问个别属性,像这样:
>>> platform.uname()[0]
'Linux'
在Python 3上,这个函数返回的是一个命名元组:
>>> platform.uname()
uname_result(system='Linux', node='fedora.echorand',
release='3.7.4-204.fc18.x86_64', version='#1 SMP Wed Jan 23 16:44:29
UTC 2013', machine='x86_64', processor='x86_64')
因为返回结果是一个命名元组,这就可以简单地通过名字来指定特定的属性,而不是必须记住下标,像这样:
>>> platform.uname().system
'Linux'
platform模块还有一些上面属性的直接接口,像这样:
>>> platform.system()
'Linux'
>>> platform.release()
'3.7.4-204.fc18.x86_64'
⑺ 请教如何在Python中获取Linux当前系统时间
In[1]:fromdatetimeimportdatetime
In[2]:datetime.now()
Out[2]:datetime.datetime(2015,1,31,12,19,46,862178)
如果解决了您的问题请采纳!
如果未解决请继续追问!
⑻ 如何用python获取linux系统的网卡信息
1.下载源代码
2. 安装,过程如下。
$ tar –jxvf Python-2.5.2.tar.bz2
$ cd Python-2.5.2
$ ./configure
$ make
$ make install
3. 测试。
在命令行下输入python,出现python解释器即表示已经正确安装。
在suse10或rhel5(es5)下系统默认已经装了python但版本是2.4.x;本次安装后在shell中输入#python
会发现显示结果:
# python
Python 2.4.3 (#1, Dec 11 2006, 11:38:52)
[GCC 4.1.1 20061130 (Red Hat 4.1.1-43)] on linux2
Type “help”, “right”, “credits” or “license” for more information.
>>>