我在云端有一个 Ubuntu 10.04 网络服务器,有 1 GB 的 RAM。以下是 Munin 的内存图表:
但我很难理解它:一方面,未使用的内存非常高;但同时交换内存也非常高,“已提交”的内存远远超过实际可用的内存。
难道不是只有在没有实际内存时才应该使用交换吗?这是正常的内存使用情况图,还是这里可能出了问题?
答案1
难道不是只有在没有剩余实际内存时才应该使用交换吗?
那是不对的。当内核看到长时间未使用的内存页面时,它会主动将其换出(即使有大量其他可用 RAM),使该 RAM 空间可用于磁盘缓存。
答案2
在目睹了系统因内存泄漏而慢慢死机之后,我可以肯定,始终需要空闲内存。UNIX/Linux 需要一些空闲内存来加载程序。Unix 倾向于创建大量进程,并使用空闲内存来加载这些程序。如果没有空闲内存,进程执行将非常缓慢,因为在重新加载程序之前需要回收内存。
共享内存非常有用,因为许多程序可以使用相同的只读内存页。但是,可写页面需要按进程分配。磁盘缓冲区也有帮助,因为所需的代码可能已经在内存中了。
对于长时间运行的程序,初始化和关闭代码换出是可以的。这假设此代码的内存页面不与经常使用的代码共享。某些程序可能包含很少使用的代码,可以将其换出。很少运行的程序也可以换出,影响很小。
一旦开始主动交换内存中的页面,性能就会严重下降。