我们有一个 Java 应用程序在两个 RHEL5.5 系统上运行。我们最近遇到了需要为两个系统添加更多内存的情况。
每个系统都在 5 分钟内重新启动。我们确认系统通过我们的负载平衡设备连接均匀。免费输出如下所示:
主机A:
total used free shared buffers cached
Mem: 3977340 3570688 406652 0 26472 3194816
-/+ buffers/cache: 349400 3627940
Swap: 2097144 0 2097144
主机B:
total used free shared buffers cached
Mem: 3977340 1369456 2607884 0 44200 860736
-/+ buffers/cache: 464520 3512820
Swap: 1048568 0 1048568
虽然我预计当前用于缓存的内存会有差异,但这种极端差异似乎相当令人不安。是否有任何方法可以查看哪些文件当前在缓存中有块,或者是否有任何其他方法可以确定为什么在两个互为镜像克隆的系统中,在负载平衡设置且重新启动时间相对较近的情况下,会出现如此大的差异?
我意识到它们的词干状态并不是很糟糕,但是,我被要求提供一个理由或解释,说明为什么一个系统将如此多的内容带入缓存,而另一个系统却没有。
其他 VM 设置(例如 swappiness、min_free_kbytes 等)均相同。
关于我应该采取什么步骤来解决这个问题,您有什么想法吗?
答案1
您可以使用 lsof 查找两台机器上的 Java 进程正在使用的文件,这可能有助于指出问题。
另外,最好在系统上验证使用内存和相应的缓存内存的位置,以确保使用/缓存的内存实际上是由您的 Java 程序而不是其他程序使用的。
答案2
使用 或任何你喜欢的方法将进程列表进行比较。此外,还可以使用 查看内核内存使用情况的细分,ps aux
并比较这些输出。top
slabtop
好的,使用 RHEL 5.5 时您很可能使用 ext3 作为文件系统,但例如 XFS 正在大量利用可用内存,并且这一点在 中变得非常明显,但如果您只是盯着其他内存报告,slabtop
可能会让您感到困惑。free