kolypto Asked: 2010-02-08 10:24:36 +0800 CST2010-02-08 10:24:36 +0800 CST 2010-02-08 10:24:36 +0800 CST Linux:如何显式取消所有可能的交换? 772 我推出了一些占用大量内存的东西,现在一切都滞后了很多。我想所有应用程序的内存都已经交换,以便为内存密集型进程腾出一些空间,现在一切都在访问时慢慢返回到 RAM。 有没有办法明确地将所有可能的东西从交换移回 RAM?或者也许不是所有的东西,而只是一些特定的过程数据? linux memory swap 10 个回答 Voted Best Answer Douglas Leeder 2010-02-08T10:38:57+08:002010-02-08T10:38:57+08:00 我建议在实际使用的东西中允许正常的 Linux 内存控制交换,因为它们已被使用。 我唯一能想到的就是关闭交换,然后再打开 sudo swapoff -a sudo swapon -a 假设您有足够的备用物理内存来包含交换中的所有内容...... sntg 2010-02-08T10:31:53+08:002010-02-08T10:31:53+08:00 您可以调整它,将 0 到 100 之间的某个数字回显到/proc/sys/vm/swappiness. 此控件用于定义内核交换内存页面的积极程度。较高的值会增加攻击性,较低的值会减少交换量。值 0 指示内核在空闲和文件支持的页面数量小于区域中的高水位线之前不启动交换。 默认值为 60。 CarpeNoctem 2010-02-08T19:25:13+08:002010-02-08T19:25:13+08:00 Linux 在管理内存方面做得很好,你不应该妨碍它。vm.swappiness 设置(前面提到过)不会妨碍它。以其他方式做事更有可能遇到奇怪的问题。 你推出了什么让你记忆犹新的东西?可以调吗?如果它没有自己的内存限制指令,您也可以查看 ulimit。 3dinfluence 2010-02-08T20:23:02+08:002010-02-08T20:23:02+08:00 从这个问题中复制我的一些答案。 这样您就可以知道 swappiness 可调参数是如何工作的。这通过告诉VM子系统在映射到进程页表的内存百分比+交换值> 100时查找要交换的页面。因此设置为60将导致系统开始从进程页表中分页出陈旧的页面当它使用超过 40% 的系统内存时。如果你想让你的程序以缓存为代价使用更多内存,你需要降低交换值。 Gruic 2011-07-18T05:33:52+08:002011-07-18T05:33:52+08:00 如果您的所有应用程序都有可用的内存,则可以将 swappiness 设置为 0,这样就不会换出。例如,qemu-kvm 是 VMM 换出的一个大目标,因为它“看起来”大部分时间都是空闲的。我已经看到 qemu-kvm 内存的 80% 的内存被写入交换。在 qemu-kvm 中运行的 VM 将变得几乎没有响应,因为它们的交换空间用完了(尽管来宾不知道这种情况正在发生)。来宾虚拟机会认为它的性能非常好,尽管实际上它拖得很慢。当我一堆虚拟机“醒来”并开始做事时,即使在具有充足快速内存和磁盘的企业级硬件上,它也可以将平均负载峰值提高到 30 以上。我想这是开箱即用的 qemu-kvm 设计的失败。 希望这可以帮助某人。 Maximus Minimus 2010-02-08T15:46:24+08:002010-02-08T15:46:24+08:00 如果您能够重新启动应该执行此操作的系统(并且可能比尝试任何其他解决方案花费的时间要少得多)。 Michael Kohne 2010-02-09T06:18:59+08:002010-02-09T06:18:59+08:00 我建议不要试图超越内核中的 VM 子系统。您实际上不太可能拥有足够的信息来做出更好的决策。如果你以某种方式强迫它做错事,那么你最终只会让事情变得更慢。 jdoss 2010-02-08T20:02:21+08:002010-02-08T20:02:21+08:00 进程还在运行吗?打开一个终端,看看您是否可以发现已启动的进程。(ps aux |grep processname 可能会更容易一些)如果它们仍在运行,请使用 kill -9 PID 将它们杀死。小心你杀死的东西。如果您不知道进程是什么,请不要杀死它!此外,发布 free -m 的输出,以便我们查看您是否实际上仍在使用大量交换。 如果事情仍然运行缓慢,您可能仍然让您启动的任何东西仍在运行。除非你真的知道自己在做什么或者你喜欢生活在边缘,否则我永远不会关闭交换。=) ZarathustrA 2016-10-14T05:52:45+08:002016-10-14T05:52:45+08:00 我相信没有任何真正好的方法可以强制 Linux 将数据从磁盘取消交换到内存。当 swapoff/swapon 是一个可行的解决方案,但它很脏并且很容易使您的系统不稳定。对于交换中的数据多于空闲内存的情况,很难想象 Linux 可以采用任何有效的策略来决定哪些数据移入内存以及哪些数据保留在磁盘上。 总结:只是让Linux以正常的方式逐渐恢复其性能。它的 VM 子系统的组织方式使其努力并不断地移动到某种理想的平衡状态。 slm 2014-04-16T06:45:34+08:002014-04-16T06:45:34+08:00 清空缓冲区缓存 如果你想清空它们,你可以使用这个命令链。 $ free && sync && echo 3 > /proc/sys/vm/drop_caches && free total used free shared buffers cached Mem: 1018916 980832 38084 0 46924 355764 -/+ buffers/cache: 578144 440772 Swap: 2064376 128 2064248 total used free shared buffers cached Mem: 1018916 685008 333908 0 224 108252 -/+ buffers/cache: 576532 442384 Swap: 2064376 128 2064248 您可以通过将数字参数更改为上述命令,向 Linux 内核发出信号以删除缓存项目的各个方面。 注意:清理不必要的内存(内核 2.6.16 或更新版本)。始终确保首先运行同步以将有用的东西刷新到磁盘! 释放页面缓存: $ echo 1 > /proc/sys/vm/drop_caches 要释放 dentry 和 inode: $ echo 2 > /proc/sys/vm/drop_caches 要释放 pagecache、dentries 和 inode: $ echo 3 > /proc/sys/vm/drop_caches 以上内容以root身份运行。如果您尝试使用 sudo 进行操作,则需要将语法稍微更改为以下内容: $ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches' $ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches' $ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'
我建议在实际使用的东西中允许正常的 Linux 内存控制交换,因为它们已被使用。
我唯一能想到的就是关闭交换,然后再打开
假设您有足够的备用物理内存来包含交换中的所有内容......
您可以调整它,将 0 到 100 之间的某个数字回显到
/proc/sys/vm/swappiness
.Linux 在管理内存方面做得很好,你不应该妨碍它。vm.swappiness 设置(前面提到过)不会妨碍它。以其他方式做事更有可能遇到奇怪的问题。
你推出了什么让你记忆犹新的东西?可以调吗?如果它没有自己的内存限制指令,您也可以查看 ulimit。
从这个问题中复制我的一些答案。
这样您就可以知道 swappiness 可调参数是如何工作的。这通过告诉VM子系统在映射到进程页表的内存百分比+交换值> 100时查找要交换的页面。因此设置为60将导致系统开始从进程页表中分页出陈旧的页面当它使用超过 40% 的系统内存时。如果你想让你的程序以缓存为代价使用更多内存,你需要降低交换值。
如果您的所有应用程序都有可用的内存,则可以将 swappiness 设置为 0,这样就不会换出。例如,qemu-kvm 是 VMM 换出的一个大目标,因为它“看起来”大部分时间都是空闲的。我已经看到 qemu-kvm 内存的 80% 的内存被写入交换。在 qemu-kvm 中运行的 VM 将变得几乎没有响应,因为它们的交换空间用完了(尽管来宾不知道这种情况正在发生)。来宾虚拟机会认为它的性能非常好,尽管实际上它拖得很慢。当我一堆虚拟机“醒来”并开始做事时,即使在具有充足快速内存和磁盘的企业级硬件上,它也可以将平均负载峰值提高到 30 以上。我想这是开箱即用的 qemu-kvm 设计的失败。
希望这可以帮助某人。
如果您能够重新启动应该执行此操作的系统(并且可能比尝试任何其他解决方案花费的时间要少得多)。
我建议不要试图超越内核中的 VM 子系统。您实际上不太可能拥有足够的信息来做出更好的决策。如果你以某种方式强迫它做错事,那么你最终只会让事情变得更慢。
进程还在运行吗?打开一个终端,看看您是否可以发现已启动的进程。(ps aux |grep processname 可能会更容易一些)如果它们仍在运行,请使用 kill -9 PID 将它们杀死。小心你杀死的东西。如果您不知道进程是什么,请不要杀死它!此外,发布 free -m 的输出,以便我们查看您是否实际上仍在使用大量交换。
如果事情仍然运行缓慢,您可能仍然让您启动的任何东西仍在运行。除非你真的知道自己在做什么或者你喜欢生活在边缘,否则我永远不会关闭交换。=)
我相信没有任何真正好的方法可以强制 Linux 将数据从磁盘取消交换到内存。当 swapoff/swapon 是一个可行的解决方案,但它很脏并且很容易使您的系统不稳定。对于交换中的数据多于空闲内存的情况,很难想象 Linux 可以采用任何有效的策略来决定哪些数据移入内存以及哪些数据保留在磁盘上。
总结:只是让Linux以正常的方式逐渐恢复其性能。它的 VM 子系统的组织方式使其努力并不断地移动到某种理想的平衡状态。
清空缓冲区缓存
如果你想清空它们,你可以使用这个命令链。
您可以通过将数字参数更改为上述命令,向 Linux 内核发出信号以删除缓存项目的各个方面。
注意:清理不必要的内存(内核 2.6.16 或更新版本)。始终确保首先运行同步以将有用的东西刷新到磁盘!
释放页面缓存:
要释放 dentry 和 inode:
要释放 pagecache、dentries 和 inode:
以上内容以root身份运行。如果您尝试使用 sudo 进行操作,则需要将语法稍微更改为以下内容: