内容


使用 AIX 性能工具发现与内存相关的问题

案例研究

Comments

问题

在启动某个应用程序时,我们注意到内存被完全消耗光了。这个应用程序是系统中运行的惟一进程。另外,在执行手工事务时也会出问题,常常由于服务器没有响应而超时。

问题分析和解决

我们最初的想法是内存耗尽与这个应用程序有关。但是,使用性能工具进行检查之后,我们改变了想法。

在印度神话中,有一种名为 Sanjeevini 的药可以治愈几乎所有疾病。topas 就是性能工具中的 Sanjeevini。它提供所有系统资源的概况,可以作为性能分析的起点。对于我们的问题,它提供分析问题的基础。在我们第一次观察到这个问题时,topas 显示计算内存的总使用量达到 99%。与此同时,团队也观察到了执行手工事务时的问题。团队当时只执行与一个应用程序有关的测试。

因此,研究过程的下一步是停止应用程序,再次使用 topas 检查计算内存的状态。这时的计算内存是 78%。考虑到没有其他应用程序在运行,这个数字不正常,它向我们提示了新的思考方向。

有助于分析问题的其他工具还有 svmon、vmstat 和 vmo。

svmon 命令

svmon 命令是一个性能度量工具,它捕捉和分析虚拟内存的快照。

svmon -G 命令显示下面的全局内存报告。它显示系统中真实内存和虚拟内存的使用量和空闲量。

 svmon -G
图 1. svmon 全局内存报告
svmon 全局内存报告
svmon 全局内存报告

内存报告表明,总内存量为 1998848 个页面(页面大小为 4K),使用了 1996881 个页面,1967 个页面空闲。

在上面的报告中,空闲页面数量为 1967,但是不能由此断定存在任何与内存相关的限制或内存瓶颈,因为为了提高 I/O 性能,如果应用程序或内核没有明确请求的话,AIX® 会用尽可能多的空闲内存进行文件缓存。另外,报告表明分页空间总量为 3145728 个页面,其中使用的分页空间为 99556 个页面。

svmon -P 命令显示所有进程的内存使用量统计数据。

 svmon -P
图 2. 进程内存使用量报告
进程内存使用量报告
进程内存使用量报告

进程内存使用量报告表明,一个 Java™ 进程使用的内存为 166690 个页面。把这个报告中所有进程使用的内存量相加,我们发现所有进程使用的内存总量远远小于系统的内存总量。这也说明内存并不是限制因素。

vmstat 命令

另一个性能监视工具 vmstat 用于报告内核线程、虚拟内存、磁盘和 CPU 活动的统计数据。

 # vmstat 2 10
图 3. vmstat 报告
vmstat 报告
vmstat 报告

vmstat 报告表明,空闲内存大约为 114MB。另外,没有报告页面换出。但是最后五项表明,有一个被阻塞的线程,而且系统中发生了一些 I/O 等待。

vmo

我们还使用 vmo 命令检查性能参数。vmo 命令也显示和调整虚拟内存管理器参数。

 vmo – a
图 4. vmo 命令输出
vmo 命令
vmo 命令

观察 vmo 命令的输出,我们发现 lgpg_regions 被设置为 256,lgpg_size 被设置为 16777216(即 16MB)。AIX 把大页面当作固定内存对待,对于大页面不提供分页支持。存储为大页面的应用程序数据会一直留在物理内存中,直到应用程序终止。对于这个应用程序,这意味着 256 个 16MB 的页面被固定并设置为保留。

如果再看一下 图 1(svmon – G 的输出),会发现对于 16MB 的大页面,池大小为 256,因为大页面的内存是固定的,256 个 16MB 的页面无法交换出去。看一下 图 2(svmon – P 命令),输出的第一行的最后一列是 16MB,对应的值是 'N'。这意味着 PID 为 266372 的进程不使用 16MB 的页面;也就是说,这个应用程序不使用 vmo 命令已经保留的大页面。同样,在同一个报告中检查正在运行的其他进程时,发现没有应用程序使用大页面支持。因此,256*16=4096MB 的内存空间被阻塞,但是根本没有任何进程使用它。

图 3 中可以看到,物理内存总量是 7808MB。通过上面的分析很容易看出,其中的 4096MB 为大页面保留。这意味着所有正在运行的应用程序只能使用 7808-4096=3712MB。一大块内存被阻塞并且不能得到使用,这就是内存完全耗尽的原因。

因此,要么不为大页面保留内存,要么确保应用程序利用保留的内存。

配置大页面

可以通过配置让应用程序或系统使用大页面。

应用程序的大页面配置

在 ldedit 命令中使用 blpdata 标志让可执行文件能够请求大页面。在 参考资料 中可以找到更多信息。

系统的大页面配置

在默认情况下,系统并不为大页面物理内存池分配任何内存。可以使用 vmo 命令的 lgpg_regions 和 lgpg_size 选项配置大页面物理内存池的大小。

通过使用 LDR_CNTRL 环境变量,让应用程序的数据和堆内存使用大页面。

参考资料 中可以找到关于使用 vmo 命令配置大页面和 LDR_CONTROL 变量的更多信息。

对于上面的案例研究,把 lgpg_regions 的值改为一个名义值,让应用程序使用大页面,这有助于解决内存问题和提高总体系统性能。

决定 lgpg_regions 的值

对于 lgpg_regions 和与性能相关的其他调优参数的值,无法给出通用的建议;但是,可以通过研究系统的工作负载决定一个名义值。对于上面的案例研究,当导出 the LDR_CNTRL 变量时,应用程序开始使用大页面。在此之后,再次使用 vmstat 命令。

 # vmstat – l 10

这个命令显示与大页面部分相关的统计数据,时间间隔为 10 秒。

图 5. 大页面统计数据
大页面统计数据
大页面统计数据

输出中有一个大页面部分,提供与大页面相关的详细统计数据。alpflp 字段分别表示活跃的大页面数和空闲的大页面数。对于这个案例研究,alp 的值不超过 80。因此,应该把 lgpg_regions 的值从 256 降低到 100。这会把大量内存还给 4K 页面的内存池,增加正在运行的其他应用程序可以使用的内存量,提高系统的总体性能。简而言之,应该研究系统的工作负载,然后调整参数,这是高效地使用系统资源的关键。

结束语

使用大页面的主要目的是,提高高性能计算应用程序或使用大量虚拟内存的任何内存访问密集型应用程序的系统性能。大页面是有用的,但是只应该在特定的场景中使用。它是一个特殊用途的性能改进特性,不建议普遍使用。


相关主题

  • 性能管理指南讨论 AIX 中的 大页面
  • AIX Performance Tools Handbook 讨论 AIX 性能工具。
  • AIX 6.1 information center 提供关于 AIX 操作系统的技术信息。
  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。
  • AIX and UNIX 专题汇总:AIX and UNIX 专区已经为您推出了很多的技术专题,为您总结了很多热门的知识点。我们在后面还会继续推出很多相关的热门专题给您,为了方便您的访问,我们在这里为您把本专区的所有专题进行汇总,让您更方便的找到您需要的内容。

评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=426561
ArticleTitle=使用 AIX 性能工具发现与内存相关的问题
publish-date=09072009