我的 Linux 缓存和交换内存有问题。我知道 Linux 在从磁盘读取数据时正在优化自身(将其缓冲在 RAM 中),但在我的情况下,这部分内存似乎导致应用程序使用交换空间,因此应用程序开始运行速度非常慢(我的问题是在linux上运行的java服务器)。这是输出:
[glassfish@pahod001 logs]$ free -m
total used free shared buffers cached
Mem: 32108 31031 1076 1 452 14980
-/+ buffers/cache: 15598 16509
Swap: 8191 49 8142
所以现在看来一切都差不多了。即使包含缓存,我们仍然有 1076MB RAM 可用。但过了一段时间(我从 java 服务器重新启动开始计算时间 -> 大约 2 天),java 进程开始使用交换空间(可以在 中看到/proc/<proc id>/status
)。今天早上它已经开始使用 10MB 的 RAM,而缓存的数据几乎是 15GB。为什么 Linux 优先考虑缓存内存而不是我的应用程序真正需要的内存并将其移至交换区?我应该禁用交换吗?系统正常运行时间为737天(这是重要的服务器),也许缓存中有东西卡住了,应该手动清理?它是生产服务器,所以一切都必须小心谨慎。
两天前重新启动的进程已经在使用交换,此时有 15,5GB 可用 RAM。我无法理解这种缓存内存管理风格......
[glassfish@pahod001 logs]$ cat /proc/20122/status
Name: java
State: S (sleeping)
Tgid: 20122
Pid: 20122
PPid: 1
TracerPid: 0
Uid: 537 537 537 537
Gid: 537 537 537 537
Utrace: 0
FDSize: 256
Groups: 537
VmPeak: 5995004 kB
VmSize: 5995000 kB
VmLck: 0 kB
VmHWM: 1017892 kB
VmRSS: 759988 kB
VmData: 5843144 kB
VmStk: 88 kB
VmExe: 4 kB
VmLib: 16624 kB
VmPTE: 2600 kB
VmSwap: 2844 kB
答案1
您的 Java 占用了 6 GB(几乎所有数据),并且有 3 MB (0.0005%) 的交换空间让您担心?已用 46MB 交换空间怎么样?不是对于这个过程——什么在使用它,多久使用一次?
当然,不应该为了缓存而交换活动进程。但是,自从几天前加载以来,这 3 MB 的 Java 可能还没有被使用过。你不知道它实际上正在交换任何东西,只是交换出的算法决定它可以更好地使用 RAM。
您能解释为什么 Java 需要永远保留 6 GB 吗?在我看来,它可能存在内存泄漏,或者算法对大数据具有不可接受的行为。
我认为您需要能够为您提供整个系统更广泛的诊断视图的工具,但我手头没有 RHEL。