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