我在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所以现在一切似乎都好起来了。即使缓存包括在内,我们仍然有1076 of的RAM。但是过了一段时间(我计算了java服务器重启->大约2天的时间),java进程开始使用交换空间(可以在/proc//status中看到)。今天上午,它已经开始使用10 it的RAM,而缓存的数据几乎是15 it。为什么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发布于 2019-12-08 12:16:53
您的Java占用了6GB(几乎全部是数据),并且有3MB (0.0005%)的交换空间让您担心?对于这个过程来说,46MB所用的交换(不是而不是)怎么样?
当然,不应该为了缓存而交换活动进程。但是这3MB的Java可能在几天前加载后就没有被使用过。你不知道它实际上是在交换任何东西,只是交换的算法决定了它可以更好地使用RAM。
你能解释为什么Java需要永远保持6GB吗?在我看来,它可能存在内存泄漏,或者是一种对大数据具有不可接受行为的算法。
我认为你需要一些工具,让你对整个系统有一个更广阔的诊断视角,但我手头上没有RHEL。
https://unix.stackexchange.com/questions/556150
复制相似问题