UnixLinux 系统自动化管理 内存管理篇.docx
- 文档编号:5729149
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:10
- 大小:22.06KB
UnixLinux 系统自动化管理 内存管理篇.docx
《UnixLinux 系统自动化管理 内存管理篇.docx》由会员分享,可在线阅读,更多相关《UnixLinux 系统自动化管理 内存管理篇.docx(10页珍藏版)》请在冰豆网上搜索。
UnixLinux系统自动化管理内存管理篇
本文是Unix/Linux系统管理自动化系列中的一篇文章,主要介绍了内存管理所涉及的命令,并通过编写自动化脚本实现了内存管理与监控的自动化
内存是Unix/Linux内核所管理的最为重要的资源之一,内存管理是系统管理中非常重要也是最复杂的的部分。
系统管理员需要掌握内存管理的基本工作原理以及使用合适的工具与策略监控内存的工作状态。
本文将分别阐述AIX和Linux系统中所涉及到的内存监控的方法,并对其中涉及到的内核内存管理的原理做初步的说明。
AIX内存管理与监控
内存管理概述
内存管理在不同的操作系统中会有不同的实现。
AIX系统使用VMM(VirtualMemoryManager)实现物理内存的管理,处理应用程序的内存分配请求与内存回收。
内存和交换空间一般都是通过页面来进行分配和管理,VMM将所有的内存段划分为若干个页面,Power4芯片支持4K,64K,和16M大小的虚拟内存页,Power5芯片支持4K,64K,16M,16G大小的虚拟内存页,每个页面的缺省大小是4KB。
虚拟内存页面越大,对需要大内存块的应用程序可以起到优化作用,主要是提高TLB的命中率。
当我们执行应用程序的时候,内存中的页面会被逐渐的占用,这里我们设计两个重要的参数:
Minfree(最小空闲页面的大小)和Maxfree(最大空闲页面的大小)。
当空闲的内存达到Minfree大小的时候,VMM的调页算法将被唤醒,将内存中的页面转移到交换空间中,知道空闲内存达到Maxfree,才停止调页。
上面主要是对AIX内存管理中所涉及到的的基本概念做了简单的介绍说明,对于任何与内存相关的操作,了解这些概念都是非常必要的。
系统管理员在进行正确的优化或者问题发生之前,必须首先监视系统,使用合适的工具捕获基准数据,并且知道如何进行分析工作。
下面笔者将介绍AIX系统所提供的工具来监控系统内存的使用情况。
内存调整命令
与其他的子系统相比,内存调整更为困难,但同时收到的效果往往更加显著,特别是在那些尚未对各种内存参数进行优化的运行环境中。
系统管理员可以通过vmo命令动态的调整内存参数,进行内存性能优化方面的各种实践。
vmo
vmo命令用来管理虚拟内存可调试的参数。
例如如果我们发现空闲内存不足,可以使用下面的命令增加Minfree和Maxfree参数:
清单1.使用vmo命令调整空闲的虚拟内存最小和最大值
#vmo–ominfree=1024–omaxfree=30070
Settingmaxfreeto30070
Settingminfreeto1024
注:
-p参数能够使修改永久生效,而且立即生效,不需要重启,下次重启设置仍然有效。
例如 vmo-p–ominfree=1024命令能够永久设置空闲的虚拟内存值为1024
一般情况下,minfree和maxfree的设定值可以通过下面的公式计算得到:
maxfree=minnum(memory/128,128)
minfree=maxfree/8
-a参数能够显示当前所有的内存参数设置,之后系统管理员可以对其中的任何参数进行调整,在此必须说明的是:
对内存参数的任何微小改动都有可能造成系统运行的不稳定,所以系统管理员做的任何修改,都必须非常慎重并且对可能造成的影响有所了解。
上文提到的两个关键参数minfree和maxfree也包含于下面的列表中。
清单2.vmo命令所能调整的内存参数
#vmo-a
ams_loan_policy=n/a
force_relalias_lite=0
kernel_heap_psize=65536
lgpg_regions=0
lgpg_size=0
low_ps_handling=1
maxfree=30070
maxperm=902102
maxpin=845450
maxpin%=80
memory_frames=1048576
memplace_data=2
memplace_mapped_file=2
memplace_shm_anonymous=2
memplace_shm_named=2
memplace_stack=2
memplace_text=2
memplace_unmapped_file=2
minfree=1024
minperm=30070
minperm%=3
nokilluid=0
npskill=1024
npswarn=4096
numpsblks=131072
pinnable_frames=868968
relalias_percentage=0
scrub=0
v_pinshm=0
vmm_default_pspa=0
wlm_memlimit_nonpg=1
其中maxperm,maxpin%,minperm,minpin%值得我们特别的注意。
AIX中,文件型内存一般占用系统内存很少的一部分,大部分的内存被用来做计算型内存,其中一个主要的应用为oracleSGA,所使用的内存为pinnedmemory.我们通常希望把oracleSGA保持在内存内,同时需要将文件系统缓存比例控制到一定范围内。
这时我们根据系统内存的大小,调整maxpin%,maxperm,minpin%,minperm的值。
minperm–文件型内存最小值minpin-计算型内存最小值minpin%-计算型内存占总的系统内存百分比的最小值maxperm–文件型内存最大值maxpin-计算型内存最大值maxpin%-计算型内存占总的系统内存百分比的最大值
计算型内存和文件型内存的调整需要遵循下面的一些简单原则:
1.计算型内存和文件型内存所占系统内存百分比之和要小于100%。
2.计算型内存的设置要合理,留出足够的空间给操作系统。
原因在于操作系统同样会占用一部分计算型内存,系统资源紧张时,操作系统会抢占应用程序所占计算型内存,影响程序的正确运行。
3.数据库服务器上,文件型内存不需要太多的空间。
通常我们会遇到的pagingspace占用率过高就有可能设置了过高的文件型内存。
进程空间内存监控命令
系统管理员有时需要对某个特定的进程进行跟踪调试,这时就需要一些命令能够动态的显示每个进程内存占用情况的实时信息。
ps是我们经常使用到的能够解决这方面问题的命令。
事实上,这个命令的使用非常简单,但是得到的数据非常有效。
ps
几乎所有的Unix/Linux分发版都包含了这一工具,ps提供的简洁而有效的信息能够允许系统管理员快速地对性能问题进行故障排除,不足之处就是其并不适合用于进行历史趋势研究与分析。
ps一般用来查看系统中运行的进程,事实上,ps命令同样可以帮助管理员对可能的内存瓶颈进行故障排除。
下面我们使用ps显示系统中每个活动进程的内存使用情况
清单3.ps命令输出当前内存状况
#psaux
USERPID%CPU%MEMSZRSSTTYSTATSTIMETIMECOMMAND
root5327410.70.0384384-A03:
17:
33453:
29wait
root819610.70.0384384-A03:
17:
33453:
28wait
root4917610.70.0384384-A03:
17:
33453:
20wait
root5737210.70.0384384-A03:
17:
33453:
06wait
其中rss标示每个进程的实际内存使用量,这是我们需要重点查看的属性,代表着这个进程真正占用内存的多少。
通过观察rss的数据信息,我们能够清楚的获得此进程的内存使用变化情况。
在极端情况下,系统管理员可以通过kill命令关闭某些内存占用率过高的进程来确保系统的正常运行。
同时我们也可以通过观察rss段的数据信息来检查进程存不存在内存泄漏现象。
系统内存监控命令
系统管理员除了需要对特定的进程内存占用情况跟踪观察外,更多的时候需要监控整个系统的内存使用信息。
vmstat和svmon能够帮助我们轻易的获得这方面的数据。
vmstat
vmstat(VirtualMemoryStatistics)命令能够帮助我们监控内核进程,虚拟内存,磁盘和处理器统计信息。
它是对系统的整体情况进行统计,不足之处就是无法对某个特定进程做分析。
vmstat的输出可以是以百分比表示的平均值,也可以是其统计的总和。
如果没有指定任何的参数,vmstat将会输出系统从开机启动之后所有的虚拟内存活动。
我们经常使用类似vmstat55的命令参数,代表着表示在5秒时间做5次采样。
清单4.vmstat55命令监控内存资源使用状况
SystemConfiguration:
lcpu=4mem=1024MB
kthrmemorypagefaultscpu
---------------------------------------------------------------
rbavmfrerepipofrsrcyinsycsussyidwa
002088174482800000036022000990
002088174482800000022722500990
002088174482800000042921900990
下面将对输出的结果中涉及到的内存管理相关字段进行说明:
memory:
物理内存和虚拟内存的使用信息。
如果虚拟内存被访问,那么将被认为是活动的。
.
∙avm活动的虚拟内存页面
∙fre空闲内存列表的大小。
注:
很大一部分的实际内存都被用来作为文件系统的缓存用来加快应用程序的运行速度,所以空闲内存大小一般保持在很小的数值。
page:
缺页异常和分页活动信息。
此数值是间隔时间内的平均值,以秒为单位。
∙re页面调度输入/输出列表
∙pi从页面空间输入的页面
∙po写入页面空间的页面
∙fr释放的页面
∙sr通过页面替换算法扫描页面的频率
∙cy页面替换算法运行的时钟周期
内存的瓶颈问题我们可以通过sr(页面扫描频率)来观察,如果扫描频率过高,始终维持高于200页说明存在内存瓶颈,同样的道理如果page项中的pi(调入的页面数)和po(调出的页面数)不为0,说明系统必须经常性被动的通过页面的调入调出程序来维持系统的稳定运行,表明也有可能存在内存瓶颈。
解决的方法可以通过简单的增加内存或者优化设计应用程序来减少对内存的使用率。
svmon
svmon命令提供了一个更加深入的内存使用情况的分析,比起vmstat和ps命令,它带有更多的信息量。
-i选项能够间隔性的捕获一个内存状态的快照。
svmon命令可以生成9种不同的报告结果,这里我们选用比较有代表性的带-G标志来监视内存全局使用情况。
清单5.svmon命令显示当前内存全局使用状况
#svmon-G
sizeinusefreepinvirtual
memory2621442081285401672891163644
pgspace1310721912
workpersclntother
pin624970010394
inuse163644044484
PageSizePoolSizeinusepgsppinvirtual
s4KB-12803219122466783548
m64KB-5006030145006
∙size标示了实际内存的页面数
∙inuse正在使用中的页面数
∙free空闲的页面数
∙pin物理内存中固定的页面数
∙virtual虚拟内存使用的页面数
这里svmon只是提供了更加精确的结果,具体的内存调试优化可以参照以上vmo,ps和smstat命令中所涉及到的方法。
回页首
Linux内存管理与监控
Linux系统内存监控命令
Linux同样具有众多与内存管理相关的命令,可以帮助我们快速获得内存使用信息。
如vmstat,ps,AIX中我们已经做了介绍,在此不再赘述。
free是Linux系统所具有的十分小巧简介的命令,这也是Linux上常用的查看内存的方式。
Free
与AIX系统中的svnmon命令类似,free提供了内存全局使用情况。
清单6.free命令显示当前内存使用信息
#free
totalusedfreesharedbufferscached
Mem:
4166976406355210342408757122694592
-/+buffers/cache:
4932483673728
Swap:
10520967681051328
下面是对各个输出字段的详细说明
∙total总计物理内存的大小
∙used已经使用的内存大小
∙free空闲的内存大小
∙shared多个进程共享的内存大小
∙buffers块设备缓存的大小
∙cached页面缓存的大小
free命令所提供的数据不如vmstat所得到的详细,但是能够提供给我们最初和最直接的参考,指明我们需要仔细检查的方向,比如如果sharedmemory数据过大,我们就能很容易发现有些程序请求分配了过多的共享内存池,配合其他的管理命令,找到具体的某个进程消耗了过多的共享内存,从而解决问题。
回页首
内存监控自动化实现
合理的利用以上介绍的众多内存管理工具,系统管理员可以自己编写一些脚本自动化的监控内存使用情况,记录内存使用信息,设置警戒点,甚至阻止异常程序的内存申请行为,将系统从灾难中恢复过来。
下面是一个内存监控自动化脚本实现的例子MemMonitor.perl。
这个脚本在使用内存达到或超过实际内存的75%的时候会打印出内存不足的警告。
在使用内存达到或超过实际内存的90%的时候,将打印出内存即将用尽的警告,并且关掉当前占用内存最高的进程。
同时我们通过将此脚本添加到cron服务中来实现内存的监控自动化。
脚本在AIX5.3和SLES11上测试通过。
清单7.MemMonitor.perl
#!
/usr/bin/perl
usestrict;
#打印此脚本使用信息和输出说明。
################################################################
#Outputtheusageofthisperlscript
################################################################
subusage
{
print"memmonitor:
Monitorsystemmemoryusage\n";
print"1.ifusedmemoryismorethan75%oftotalmemory,memmonitor\n";
print"willoutputonewarningmessageperminites.\n";
print"2.ifusedmemoryismorethan90%oftotalmomory,memmonitor\n";
print"willkilltheprocessesthatoccupiedthemostmemoryuntill\n";
print"usedmemoryislessthan75%oftotalmemory.\n\n";
return0;
}
usage
my$total_mem;
my$used_mem;
my$next_line=0;
my@rc;
my$rate;
#$total_mem和$used_mem变量分别代表了总计实际内存大小和已经使用的内存大小
rc=`vmstat`;
foreach(@rc){
if($next_line){
my@value=split/\s+/,$_;
$used_mem=@value[3]*4;
$next_line=0;
last;
}elsif(/^.*mem=(\d+)MB$/){
$total_mem=$1*1024;
}elsif(/^.*avm.*$/){
$next_line=1;
}
}
#这段代码使用了vmstat命令得到系统内存状态信息,并对结果进行逐行解析,得到各个字段的数据。
if($total_mem){
$rate=$used_mem/$total_mem;
}
#计算得到了当前全局内存使用率
if($rate>0.75){
print"Warning:
Memoryisnotenough\n";
}
#如果内存使用率大于0.75,将打印出警告信息。
if($rate>0.9){
my$line_count=0;
my@output=`psaux|head-1;psaux|sort-rn+5`;
foreach(@output){
if($line_count){
my@killed_process=split/\s+/,$_;
print"Warning:
Outofmemory.Killprocess:
@killed_process[1]\n";
#发送警告信息给root用户,保存程序运行记录。
`echo"Process@killed_process[1]hasbeenkilledbecauseofunlimitedmemory\
allocation"|mail-s"Outofmemory"root`
`kill-11@killed_process[1]`;
last;
}
$line_count=$line_count+1;
}
#如果内存使用率大于0.9,脚本将调用ps命令并且找出内存使用率最高的进程,打印出将要杀掉进程的警告信息,
#杀掉内存使用率最高的进程。
此过程将循环进行知道内存占用率低于0.9
}
清单8.root用户警告邮件内容
Fromtest@TueJuly3113:
01:
122009
X-Original-To:
root
Delivered-To:
root@
Date:
Tue,31July200913:
01:
11-0400
To:
root@
Subject:
Outofmemory
User-Agent:
Heirloommailx12.201/07/07
MIME-Version:
1.0
Content-Type:
text/plain;charset=us-ascii
Content-Transfer-Encoding:
7bit
From:
test@
------------------------------------------------------------
Process10482hasbeenkilledbecauseofunlimitedmemoryallocation
上面的脚本MemMonitor.perl实现了自动监控内存使用率,并对内存占用率比较高的时候分别作了处理,能够保障内存子系统的稳定运行。
下面我们将借助系统的cron服务每间隔设定的一段时间自动调用上面的脚本,实现内存监控管理的完全自动化。
使用命令“crontab–e”编辑crontab,添加一条自动运行脚本MemMonitor.perl的项目:
清单9.添加为cron服务
*/2****/tmp/MemMonitor.perl2>&1>>/tmp/memmonitor.log
此时MemMonitor.per将被每两分钟自动执行一次,并将输出结果保存在/tmp/memmonitor.log中。
回页首
总结
本文详细介绍了Unix/Linux上常用的内存管理与监控的命令,并通过编写脚本实例应用内存管理的命令,实现了内存管理的自动化,当内存使用率过高的时候,给出警告信息,通过关闭内存占用率高的进程来确保了系统全局的稳定运行,并对其中所做的操作做了日志记录,方便了系统管理员监测并调试系统内存故障。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UnixLinux 系统自动化管理 内存管理篇 系统 自动化 管理 内存