这个问题与 RHEL 5.3 上 /proc/vmstat 中记录的特定指标的定义有关。
我正在使用 nmon 监控负载测试,该测试包括模拟 2500 名用户在一小时内执行一天的工作量。最近,我发现性能不佳,正在诊断和排除各种问题。
我们在 vmware ESX 上运行 Red Hat Enterprise Linux Server 版本 5.3 (Tikanga)。我关注的物理服务器运行 Oracle Application Server(包括 Apache HTTP 服务器和 OC4J J2EE 容器)。
我正在查看的 nmon 图表显示 pswpin 指标的分配一致。总结为:最小值 = 4312;最大值 = 245352;平均值 = 86734。Nmon 显示这些值以“每秒千字节”为单位
在整个测试过程中,以下指标均为零;
- 输出
- 普吉特
- 输出
鉴于我对分页和交换的理解,我对这些指标组合的含义感到困惑。
我的问题:
- 有人能确认这些指标代表什么吗?
- 知道什么系统行为可能导致这种类型的 VM 行为吗?
目前,我正在尝试排除虚拟内存问题作为性能不佳的原因。
编辑:我发现在整个测试过程中存在大量 fork() 调用的证据。我怀疑是 Apache 守护进程。但进程创建可能是导致这些指标的原因吗?
编辑:我添加了 nmon 的 VM 输出的典型示例。格式不佳,敬请谅解。
提前感谢任何回复。
T0001 -1 22 -1 -1 -1 150 -1 -1 -1 5196046163 -1 0 30 100199751 3060 -1 0 -1 885 -1 -1 -1 46163 -1 -1 18 -1 828189171 -1 -1 3838 -1 -1 -1 -1 -1 165231
03:07:23 Paging and Virtual Memory nr_dirty nr_writeback nr_unstable nr_page_table_pages nr_mapped nr_slab pgpgin pgpgout pswpin pswpout pgfree pgactivate pgdeactivate pgfault pgmajfault pginodesteal slabs_scanned kswapd_steal kswapd_inodesteal pageoutrun allocstall pgrotated pgalloc_high pgalloc_normal pgalloc_dma pgrefill_high pgrefill_normal pgrefill_dma pgsteal_high pgsteal_normal pgsteal_dma pgscan_kswapd_high pgscan_kswapd_normal pgscan_kswapd_dma pgscan_direct_high pgscan_direct_normal pgscan_direct_dma
03:07:33 -1 99 -1 -1 -1 241 0 0 0 77526 0 0 0 824 0 0 0 0 0 0 0 0 77526 0 0 0 0 0 0 0 78216 0 0 0 0 0 0
03:07:43 -1 10 -1 -1 -1 262 0 0 0 21653 0 0 8 500 2 0 0 0 0 0 0 0 21653 0 0 0 0 0 0 0 17675 0 0 0 0 0 0
03:07:53 -1 69 -1 -1 -1 257 0 0 0 115744 0 0 0 724 0 0 0 0 0 0 0 0 115744 0 0 0 0 0 0 0 -79544 0 0 0 0 0 0
03:08:03 -1 69 -1 -1 -1 196 0 0 0 81202 0 0 0 628 0 0 0 0 0 0 0 0 81202 0 0 0 0 0 0 0 -18335 0 0 0 0 0 0
03:08:13 -1 81 -1 -1 -1 205 0 0 0 29051 0 0 0 352 0 0 0 0 0 0 0 0 29051 0 0 0 0 0 0 0 24449 0 0 0 0 0 0
03:08:24 -1 91 -1 -1 -1 131 0 0 0 122795 0 0 0 1172 0 0 0 0 0 0 0 0 122795 0 0 0 0 0 0 0 9640 0 0 0 0 0 0
03:08:34 -1 6 -1 -1 -1 182 0 0 0 74914 0 0 4 372 1 0 0 0 0 0 0 0 74914 0 0 0 0 0 0 0 -24477 0 0 0 0 0 0
03:08:44 -1 38 -1 -1 -1 200 0 0 0 42957 0 0 4 464 1 0 0 0 0 0 0 0 42957 0 0 0 0 0 0 0 42778 0 0 0 0 0 0
03:08:54 -1 6 -1 -1 -1 141 0 0 0 89751 0 0 36 1000 9 0 0 0 0 0 0 0 89751 0 0 0 0 0 0 0 -9665 0 0 0 0 0 0
03:09:04 -1 6 -1 -1 -1 171 0 0 0 74740 0 0 4 516 1 0 0 0 0 0 0 0 74740 0 0 0 0 0 0 0 -24583 0 0 0 0 0 0
03:09:14 -1 10 -1 -1 -1 179 0 0 0 56063 0 0 0 500 0 0 0 0 0 0 0 0 56063 0 0 0 0 0 0 0 56384 0 0 0 0 0 0
03:09:24 -1 6 -1 -1 -1 74 0 0 0 75623 0 0 0 696 0 0 0 0 0 0 0 0 75623 0 0 0 0 0 0 0 -23994 0 0 0 0 0 0
03:09:34 -1 6 -1 -1 -1 137 0 0 0 75466 0 0 8 972 2 0 0 0 0 0 0 0 75466 0 0 0 0 0 0 0 -23837 0 0 0 0 0 0
03:09:44 -1 3 -1 -1 -1 153 0 0 0 72535 0 0 4 460 1 0 0 0 0 0 0 0 -927465 0 0 0 0 0 0 0 -26880 0 0 0 0 0 0
03:09:54 -1 6 -1 -1 -1 170 0 0 0 56775 0 0 0 284 0 0 0 0 0 0 0 0 56775 0 0 0 0 0 0 0 56895 0 0 0 0 0 0
03:10:04 -1 6 -1 -1 -1 166 0 0 0 74756 0 0 0 1116 0 0 0 0 0 0 0 0 74756 0 0 0 0 0 0 0 -24568 0 0 0 0 0 0
03:10:14 -1 6 -1 -1 -1 148 0 0 0 78043 0 0 0 432 0 0 0 0 0 0 0 0 78043 0 0 0 0 0 0 0 -21241 0 0 0 0 0 0
03:10:24 -1 64 -1 -1 -1 189 0 0 0 64057 0 0 0 412 0 0 0 0 0 0 0 0 64057 0 0 0 0 0 0 0 60788 0 0 0 0 0 0
答案1
pgpgin - Number of kilobytes the system has paged in from disk per second.
pgpgout - Number of kilobytes the system has paged out to disk per second.
pswpin - Number of kilobytes the system has swapped in from disk per second.
pswpout - Number of kilobytes the system has swapped out to disk per second.
我有 87% 的把握,每个增加 pswpin 计数器的页面也应该增加 pgpgin。你说不是。嗯。
这可能太简单了(抱歉!)但是... 您是否 200% 确定您观察到的指标是 pswpin,而不是 pgpgin?后者可以理解为:进程正在读取一些文件。
另一种解释是,应用程序在测试前被大量换出,然后系统获得大量可用内存。在测试期间,你观察到它“恢复活力”(随着代码执行的进行,不断将自身换入),而不读取/写入任何文件。但为什么在这种情况下 pgpgin 没有随着 pswpin 而增加,这让我无法理解。
也许您的图表经过了调整,所以 pswpin 是从 pgpgin 中减去的?支持这一点的一点是,这两个指标通常都以页面为单位(在 /proc/vmstat 中),并且您已将它们转换为 KB/s。
编辑:这可能与 ESX 有关。我大胆猜测,这是膨胀或透明页面共享 (TPS) 的副作用。你能通过 ESX 上的 esxtop 进行分析? 这是另一个 esxtop 指南。
编辑:您的 nmon 统计数据似乎有问题。首先,列名比实际指标多(即您没有最后一列的数据pgscan_direct_dma
)。指标上有很多 -1 或 0 值,在繁忙的系统上应该有这些值,不仅缺少 pgpgin。pgsteal 和 pgrotated 有,但有时是负数,这是不可能的。
那么,看看 /proc/vmstat,那里发生了什么?并使用其他工具来确认 nmon 统计数据。