Unix/Linux 系统自动化管理:内存管理篇
内存是 Unix/Linux 内核所管理的最为重要的资源
本文是 Unix/Linux 系统管理自动化系列中的一篇文章,主要介绍了内存管理所涉及的命令,并通过编写自动化脚本实现了内存管理与监控的自动化 内存是 Unix/Linux 内核所管理的最为重要的资源之一,内存管理是系统管理中非常重要也是最复杂的的部分。系统管理员需要掌握内存管理的基本工作原理以及使用合适的工具与策略监控内存的工作状态。 本文将分别阐述 AIX 和 Linux 系统中所涉及到的内存监控的方法,并对其中涉及到的内核内存管理的原理做初步的说明。 AIX 内存管理与监控 内存管理概述 内存管理在不同的操作系统中会有不同的实现。AIX 系统使用 VMM(Virtual Memory Manager) 实现物理内存的管理unix系统管理,处理应用程序的内存分配请求与内存回收。 内存和交换空间一般都是通过页面来进行分配和管理,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 – o minfree=1024 – o maxfree=30070 Setting maxfree to 30070 Setting minfree to 1024 注:-p 参数能够使修改永久生效,而且立即生效,不需要重启,下次重启设置仍然有效。例如 vmo -p – o minfree=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 中, 文件型内存一般占用系统内存很少的一部分,大部分的内存被用来做计算型内存,其中一个主要的应用为 oracle SGA,所使用的内存为 pinned memory. 我们通常希望把 oracle SGA 保持在内存内,同时需要将文件系统缓存比例控制到一定范围内。 这时我们根据系统内存的大小,调整 maxpin%,maxperm,minpin%,minperm 的值。 minperm – 文件型内存最小值 minpin - 计算型内存最小值 minpin% - 计算型内存占总的系统内存百分比的最小值 maxperm – 文件型内存最大值 maxpin - 计算型内存最大值 maxpin% - 计算型内存占总的系统内存百分比的最大值 计算型内存和文件型内存的调整需要遵循下面的一些简单原则: 计算型内存和文件型内存所占系统内存百分比之和要小于 100%。 计算型内存的设置要合理,留出足够的空间给操作系统。 原因在于操作系统同样会占用一部分计算型内存,系统资源紧张时,操作系统会抢占应用程序所占计算型内存,影响程序的正确运行。 数据库服务器上,文件型内存不需要太多的空间。 通常我们会遇到的 paging space 占用率过高就有可能设置了过高的文件型内存。 进程空间内存监控命令 系统管理员有时需要对某个特定的进程进行跟踪调试,这时就需要一些命令能够动态的显示每个进程内存占用情况的实时信息。ps 是我们经常使用到的能够解决这方面问题的命令。事实上,这个命令的使用非常简单,但是得到的数据非常有效。 ps 几乎所有的 Unix/Linux 分发版都包含了这一工具,ps 提供的简洁而有效的信息能够允许系统管理员快速地对性能问题进行故障排除,不足之处就是其并不适合用于进行历史趋势研究与分析。 ps 一般用来查看系统中运行的进程,事实上,ps 命令同样可以帮助管理员对可能的内存瓶颈进行故障排除。 下面我们使用 ps 显示系统中每个活动进程的内存使用情况 清单 3. ps 命令输出当前内存状况 # ps aux USER PID %CPU %MEM SZ RSS TTY STAT STIME TIME COMMAND root 53274 10.7 0.0 384 384 - A 03:17:33 453:29 wait root 8196 10.7 0.0 384 384 - A 03:17:33 453:28 wait root 49176 10.7 0.0 384 384 - A 03:17:33 453:20 wait root 57372 10.7 0.0 384 384 - A 03:17:33 453:06 wait 其中 rss 标示每个进程的实际内存使用量,这是我们需要重点查看的属性,代表着这个进程真正占用内存的多少。通过观察 rss 的数据信息,我们能够清楚的获得此进程的内存使用变化情况。 在极端情况下,系统管理员可以通过 kill 命令关闭某些内存占用率过高的进程来确保系统的正常运行。 同时我们也可以通过观察 rss 段的数据信息来检查进程存不存在内存泄漏现象。 系统内存监控命令 系统管理员除了需要对特定的进程内存占用情况跟踪观察外,更多的时候需要监控整个系统的内存使用信息。 Vmstat 和 svmon 能够帮助我们轻易的获得这方面的数据。 vmstat vmstat(Virtual Memory Statistics) 命令能够帮助我们监控内核进程,虚拟内存,磁盘和处理器统计信息。 它是对系统的整体情况进行统计,不足之处就是无法对某个特定进程做分析。 Vmstat 的输出可以是以百分比表示的平均值,也可以是其统计的总和。 如果没有指定任何的参数,vmstat 将会输出系统从开机启动之后所有的虚拟内存活动。 我们经常使用类似 vmstat 5 5 的命令参数,代表着表示在 5 秒时间做 5 次采样。 清单 4. vmstat5 5 命令监控内存资源使用状况 System Configuration: lcpu=4 mem=1024MB kthr memory page faults cpu ----- ----------- ------------------------ ------------ ----------- r b avm fre re pi po fr sr cy in sy cs us sy id wa 0 0 208817 44828 0 0 0 0 0 0 3 60 220 0 0 99 0 0 0 208817 44828 0 0 0 0 0 0 2 27 225 0 0 99 0 0 0 208817 44828 0 0 0 0 0 0 4 29 219 0 0 99 0 下面将对输出的结果中涉及到的内存管理相关字段进行说明: memory:物理内存和虚拟内存的使用信息。如果虚拟内存被访问,那么将被认为是活动的。. page:缺页异常和分页活动信息。此数值是间隔时间内的平均值,以秒为单位。 内存的瓶颈问题我们可以通过 sr( 页面扫描频率 ) 来观察,如果扫描频率过高,始终维持高于 200 页说明存在内存瓶颈,同样的道理如果 page 项中的 pi( 调入的页面数 ) 和 po( 调出的页面数 ) 不为 0,说明系统必须经常性被动的通过页面的调入调出程序来维持系统的稳定运行,表明也有可能存在内存瓶颈。解决的方法可以通过简单的增加内存或者优化设计应用程序来减少对内存的使用率。 svmon svmon 命令提供了一个更加深入的内存使用情况的分析,比起 vmstat 和 ps 命令,它带有更多的信息量。-i 选项能够间隔性的捕获一个内存状态的快照。 时间:2009-10-30 20:14来源:developworks 作者:王华忠 杨国梁 原文链接 (编辑:海南站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |