我的数据库服务器使用了 191MB 的交换空间 - 但还显示 182MB自由的内存
该盒子是一个专用的 MySQL 服务器,运行 Debian Lenny。
我如何确定谁以及为什么填充交换空间而不是使用可用 RAM?
答案1
输入top
,然后点击f编辑可见字段,点击p显示交换使用情况,然后点击Enter返回程序显示。使用Shift+<和>使其按交换使用情况排序。
Linux 根据在短期内需要引用数据的可能性(在 Linux 的拟人化观点中)从 RAM 交换数据。您可以更改交换性以增加/减少发生这种情况的可能性。
答案2
这个问题不太容易回答——看这里:https://help.ubuntu.com/community/SwapFaq。
您可以使用top
命令来查看交换使用情况,输入man top
或谷歌搜索。
至于原因——一种可能的情况如下。假设您有 1GB 的 RAM。然后您将价值 2GB 的应用程序(包括操作系统)加载到其中。您将使用 1GB 的 RAM 和 1GB 的交换空间。然后您卸载 1.5GB 的应用程序。您会假设您将有 0.5GB 的可用 RAM 和所有可用的交换空间。然而,情况可能并非如此。例如,如果您加载了 3 个应用程序:
- A-1 GB,
- B - 900 MB
- C - 100 MB
然后主动使用 A,B 和 C 可能会被交换到磁盘,以使 A 使用 RAM,从而提高速度。当您关闭 A 并切换到 C 时,您将使用 100 MB RAM,而 B 仍然被交换出去(使用了 900 MB 交换空间),因为它是不需要的。
简单来说 - 内核会尝试以它认为最有效的方式使用 RAM 和交换。在仍有可用 RAM 时使用交换并不一定意味着您的系统运行速度比应有的慢。
答案3
free -m
查看 +/- 缓冲区行,了解您的真实 RAM 减去文件系统缓冲区。现代操作系统将常用文件加载到内存中,内核将根据需要释放它们。
例如
total used free shared buffers cached
Mem: 3483 1702 1780 0 299 778
-/+ buffers/cache: 623 2859
Swap: 3999 0 3999
运行 top 时,我会看到有 1.7GB 的可用内存,但如果我查看 free -mi,就会发现实际上有 2.8GB 的可用内存。另外 1.1GB 是文件系统缓存。
答案4
关于交换内存的一点,为了支持ErikA对James的回答的评论:
看到一些交换使用情况并不是一件坏事。正如 James 所说,内核会适时地换出不太可能使用的内存页面。这会释放 RAM 供其他可能需要它的应用程序使用,并且只会在极少数情况下导致性能下降。
从 RAM 中交换出的数据将同时存在于 RAM 和交换磁盘中,直到 RAM 被用作其他用途,因此它们很像 mmap 文件。据我了解,如果某个进程在回收之前决定使用此数据,则无需再次交换。交换通常是好的,但有两个主要原因可能导致您不想要它:
- 您正在尝试节省电力:急切地换出通常会增加磁盘旋转量,因为不需要某些换出属性;
- 交换可能会提高您可能不关心其性能的进程的速度,但却以牺牲存在延迟问题的进程为代价。
可以使用 来消除机会性交换echo 0 > /proc/pid/vm/swappiness
。