为什么Linux有足够的内存但仍在使用交换空间?

9
我有一台服务器运行着一个 Erlang 应用,类似于 Riak...
在问题发生之前,内存使用情况如下:
但是经过长时间后,缓存被清空,系统开始使用交换空间。
现在我有两个问题:
1. 为什么系统会释放缓存?这导致系统的 IO 比以前更高。 2. 为什么系统仍然有足够的内存,但仍然使用了交换空间?
以下是 top 的信息:
更新: 这个问题又出现了..
由于我运行了命令
sudo swapoff -a
所以系统不会使用交换空间,系统运行良好。
现在的问题是为什么系统会释放页面缓存?
我从书《理解Linux内核》中得到了答案。该书说如果有足够的空闲内存,页面将无限期地保留在缓存中,然后可以被其他进程重复使用,而不需要访问磁盘。
我认为这意味着如果页面缓存在系统中停留了很长时间,系统将释放缓存。
阅读了 Linux 源代码后,我会进行更新。为什么即使系统有足够的内存,它也会释放页面缓存?
感谢
更新:
1. 为什么在Linux中,即使系统有足够的内存,也会将内存交换到交换区?
如果在进程发现没有足够的内存时进行内存交换,那么进程获得足够的内存将需要很长时间。它将需要调用页面帧回收。
2. 如果我们将vm.swappiness=0,为什么仍然会有交换?
后端有一个global_reclaim,它不检查swappiness值。
6个回答

1

例如,debian很少交换不常用的数据。我认为这种行为被视为一种优化。此问题直接对应于该链接。您可以设置swap使用因子:

sudo sysctl vm.swappiness=10

1

请查看运行中的进程(例如:mysql,java等...)

如果您为这些进程设置了过低的内存限制,并且有时它们需要更多内存,则缺少的内存不会放在缓冲区上,而是放在交换空间上。

我认为这可能解释了您的问题。


1
echo 0 > /proc/sys/vm/swappiness

将系统仅在绝对必要时进行交换。

0
您可以调整“swappiness”级别来增加或减少内核对交换空间的依赖。

0

你需要记住,从交换空间读取数据比从磁盘读取稍微快一些。

基于这个前提,将东西保存在交换空间中是一个好习惯(并不意味着你的内存已满)。

假设你有4GB内存,其中有2GB可用。然后你加载一个2GB大小的应用程序A,你的4GB内存将被完全占用。接着你关闭应用程序X并加载应用程序Y(1GB),这意味着应用程序X的一半将被移动到交换空间,主内存现在将包含Y和X的一半“缓存”。

在这种情况下,你将会有以下场景:

  • 4GB内存全部被占用
  • 系统占用2GB
  • 应用程序Y占用1GB
  • X的缓存占用1GB

交换空间 * X的1GB(被移除以加载应用程序Y)


感谢您的回复。在这里,我认为我们不能将从交换空间读取和从磁盘读取进行比较。因为我们存储在交换空间中的数据是匿名页面,而匿名页面用于用户模式进程堆栈或堆。而页面缓存则存储在磁盘中。 - baotiao

0

这不是一个问题(交换)

当Linux操作系统运行时,它会在交换分区中“搁置”一些正在运行的服务。

但如果您开始使用这些服务,它们将被带回到RAM中。


是的,你关于交换分区的说法是正确的。但问题在于为什么Linux会释放页面缓存,即使它有足够的内存。 - baotiao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接