jfo*_*her 411 performance ram-usage swap
当我打开 RAM 密集型应用程序(VirtualBox 设置为 2GB RAM)时,通常会使用一些交换空间,具体取决于我当时打开的其他内容。
但是,当我退出最后一个应用程序时,会释放 2GB 的 RAM,但仍然使用相同的交换空间。
例如,现在,在关闭 VirtualBox 大约两个小时后,我有 1.6GB 的可用 RAM,交换中仍有 770MB。
如何告诉 Ubuntu 停止使用该交换并恢复使用 RAM?
Spa*_*apS 588
Ubuntu 底层的 Linux 内核会根据需要自动将这些页面从磁盘“交换”到 RAM,所以一般来说,我会说让它自然发生。
但是,如果你真的觉得你需要强制它,(我可以看到你想知道系统稍后会响应的场景)你可以暂时禁用和重新启用交换
sudo swapoff -a
sudo swapon -a
Run Code Online (Sandbox Code Playgroud)
或者作为单行
sudo swapoff -a; sudo swapon -a
Run Code Online (Sandbox Code Playgroud)
这样做时要小心,因为您可能会使您的系统不稳定,尤其是当它的 RAM 已经很低时。
pop*_*pey 205
仅仅因为交换被分配,并不意味着它被“使用”。虽然像 system monitor 和 top 这样的程序会显示你的一些交换空间被分配(在你的例子中是 770MB),但这并不意味着系统正在积极地换入/换出。
要查明是否有任何东西在换入/换出,您可以使用该vmstat命令。让它运行几秒钟以稳定下来并观察si(swapin) 和so( swapout ) 列。如果什么都没有发生,那么就没有理由担心。
这是 running 的输出vmstat 1,您可以在其中看到我的机器根本没有交换。
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 78588 230788 9596 72196 0 0 0 0 543 652 12 6 78 0
0 0 78588 230780 9596 72196 0 0 0 0 531 410 1 0 99 0
0 0 78588 230796 9596 72196 0 0 0 0 300 335 1 1 97 0
1 0 78588 230788 9608 72224 0 0 40 0 737 762 4 4 84 8
5 0 78588 230788 9608 72224 0 0 0 0 415 385 9 3 84 0
0 0 78588 230540 9616 72224 0 0 0 44 611 556 55 5 31 0
0 0 78588 230532 9616 72224 0 0 0 0 574 662 1 6 89 0
Run Code Online (Sandbox Code Playgroud)
然而在这里top你可以看到我分配了交换空间:-
Mem: 475236k total, 245076k used, 230160k free, 9720k buffers
Swap: 491512k total, 78588k used, 412924k free, 72476k cached
Run Code Online (Sandbox Code Playgroud)
Eli*_*ynn 172
您还可以将“swappiness”值设置为默认值 60,这样交换就不会在一开始就变得如此之大。当推荐值是 10 时,为什么运费默认设置为 60 让我感到困惑。来自 Ubuntu SwapFAQ:
Ubuntu 中的默认设置是 swappiness=60。减少 swappiness 的默认值可能会提高典型 Ubuntu 桌面安装的整体性能。建议使用 swappiness=10 的值,但可以随意尝试。
通过将此值更改为 10 甚至 0,您可以为具有慢速驱动器的旧系统添加显着且可感知的速度提升。将此值设置为 0 不会关闭 Linux 内核 3.4 及更低版本的交换,但对于 3.5+,它会这样做,因此如果您想将其保持在最低设置*,则需要使用值 1。
我认为没有理由不将其设置为 0,因为任何命中磁盘的内容都比 RAM 慢。我有 8 个虚拟内核、一个快速的 SSD 和 8 GB 内存,我的交换设置为 0。目前我有 3 个虚拟机在运行,我的内存使用量为 7.7 GB 中的 7.1,我使用的交换仅为 576KB 952MB,所有系统运行流畅!
swappiness 参数控制内核将进程从物理内存移到交换磁盘上的趋势。由于磁盘比 RAM 慢得多,如果进程过于频繁地移出内存,这可能会导致系统和应用程序的响应时间变慢。
- swappiness 的值可以在 0 到 100 之间
- swappiness=0 告诉内核尽可能长时间地避免将进程交换出物理内存
- swappiness=100 告诉内核主动从物理内存中交换进程并将它们移动到交换缓存
以下是检查swappiness、清空swappiness并将swappiness更改为0的基本说明:
要检查 swappiness 值:
cat /proc/sys/vm/swappiness
Run Code Online (Sandbox Code Playgroud)
暂时将 swap 设置为 0(如 SpamapS 所建议的):
这将清空您的交换并将所有交换转移回内存。首先通过查看 gnome-system-monitor 的资源选项卡确保您有足够的可用内存,您的可用内存应该大于您使用的交换空间。此过程可能需要一段时间,请使用 gnome-system-monitor 来监控和验证进度。
sudo swapoff --all
Run Code Online (Sandbox Code Playgroud)
要将新值设置为 0:
sudo sysctl vm.swappiness=0
Run Code Online (Sandbox Code Playgroud)
要重新打开交换:
sudo swapon --all
Run Code Online (Sandbox Code Playgroud)
要将 swappiness 永久设置为 0:
sudoedit /etc/sysctl.conf vm.swappiness = 0 sudo shutdown -r now #重启系统* 使用内核版本 3.5+ 将 swappiness 设置为 0 会完全关闭它,如果您想要最低的 swappiness 算法,建议设置为 1。来源:https : //www.percona.com/blog/2014/04/28/oom-relation-vm-swappiness0-new-kernel/
Sco*_*nce 56
我发现清空交换对磁盘速度慢且 RAM 有限的系统有很大帮助。当然,如前所述,执行此操作的方法是运行sudo swapoff -a; sudo swapon -a. 这里的问题是,如果内存不足,这样做会导致各种问题。
我写了一个我称之为toggle_swap过去几年对我有用的脚本。在实际禁用交换之前,它会检查是否有足够的可用 RAM。这里是:
#!/bin/bash
free_data="$(free)"
mem_data="$(echo "$free_data" | grep 'Mem:')"
free_mem="$(echo "$mem_data" | awk '{print $4}')"
buffers="$(echo "$mem_data" | awk '{print $6}')"
cache="$(echo "$mem_data" | awk '{print $7}')"
total_free=$((free_mem + buffers + cache))
used_swap="$(echo "$free_data" | grep 'Swap:' | awk '{print $3}')"
echo -e "Free memory:\t$total_free kB ($((total_free / 1024)) MB)\nUsed swap:\t$used_swap kB ($((used_swap / 1024)) MB)"
if [[ $used_swap -eq 0 ]]; then
echo "Congratulations! No swap is in use."
elif [[ $used_swap -lt $total_free ]]; then
echo "Freeing swap..."
sudo swapoff -a
sudo swapon -a
else
echo "Not enough free memory. Exiting."
exit 1
fi
Run Code Online (Sandbox Code Playgroud)
Eri*_*ami 26
在与swappiness 折腾了几天之后,我得出的结论是内核应该留给它自己的设备。它知道自己在做什么,并且经过优化,可为您提供最佳体验。
除非您有充分的理由想要取回该磁盘,否则我会保留它。