AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 499485
Accepted
Philip Couling
Philip Couling
Asked: 2019-02-09 06:28:24 +0800 CST2019-02-09 06:28:24 +0800 CST 2019-02-09 06:28:24 +0800 CST

如何仅将交换空间用于紧急情况?

  • 772

我有一台8 GB RAM 和 16 GB 交换的 Debian (Buster) 笔记本电脑。我正在运行一个很长的运行任务。这意味着我的笔记本电脑在过去六天里一直处于开机状态。

这样做时,我需要定期将笔记本电脑用作笔记本电脑。这应该不是问题;长时间运行的任务受 I/O 限制,通过 USB 硬盘上的东西工作,并且不需要太多 RAM (<200 MB) 或 CPU (<4%)。

问题是当我几个小时后回到我的笔记本电脑时,它会非常缓慢,可能需要 30 分钟才能恢复正常。这太糟糕了,以至于崩溃监视器将它们各自的应用程序标记为已冻结(尤其是浏览器窗口)并且事情开始错误地崩溃。

查看系统监视器,大约一半使用的 2.5 GB 被转移到交换中。我已通过删除交换空间 ( swapoff /dev/sda8) 确认这是问题所在。如果我离开它而没有交换空间,即使在 24 小时后它也几乎立即恢复了生机。使用交换,前五分钟几乎是一块砖,只剩下六个小时。我已经确认即使我不在,内存使用量也不会超过3 GB 。

我尝试将交换性(另见:Wikipedia)减少到and的值,10但0问题仍然存在。似乎在一天不活动之后,内核认为不再需要整个 GUI 并将其从 RAM 中擦除(将其交换到磁盘)。长期运行的任务是读取庞大的文件树并读取每个文件。所以可能是内核被混淆了,认为缓存会有所帮助。但是在一次扫描具有约 10 亿个文件名的 2 TB USB HD 时,额外的 GB RAM 对性能没有太大帮助。这是一款便宜的笔记本电脑,但硬盘驱动器很慢。它根本无法足够快地将数据加载回 RAM。

如何告诉 Linux 只在紧急情况下使用交换空间?我不想在没有交换的情况下运行。如果发生意外情况,并且操作系统突然需要额外的几 GB,那么我不希望任务被杀死,而是更愿意开始使用交换。但目前,如果我启用交换,我的笔记本电脑将无法在需要时使用。

“紧急情况”的准确定义可能有待商榷。但是要澄清我的意思:紧急情况是系统除了交换或终止进程之外别无选择。


什么是紧急情况?-你真的要问吗?......我希望你永远不会发现自己在燃烧的建筑物中!

我不可能在这个问题中定义所有可能构成紧急情况的东西。但是例如,紧急情况可能是当内核被推送内存以致它开始使用OOM Killer杀死进程时。紧急情况不是内核认为它可以通过使用交换来提高性能。


最终编辑: 我已经接受了一个答案,它完全符合我在操作系统级别的要求。未来的读者还应该注意提供应用级解决方案的答案。

linux memory
  • 6 6 个回答
  • 7113 Views

6 个回答

  • Voted
  1. derobert
    2019-02-09T08:07:48+08:002019-02-09T08:07:48+08:00

    一种解决方法是确保内存 cgroup 控制器已启用(我认为即使在半新的内核中也是默认的,否则您需要添加cgroup_enable=memory到内核命令行)。然后,您可以在具有内存限制的 cgroup 中运行 I/O 密集型任务,这也限制了它可以消耗的缓存量。

    如果您使用的是 systemd,您可以在单元或包含它的切片中设置+MemoryAccounting=yes和MemoryHigh/MemoryMax或MemoryLimit(取决于您使用的是 cgroup v1 还是 v2)。如果它是一个切片,您可以使用它在切片systemd-run中运行程序。

    来自我的一个系统的完整示例,用于运行具有内存限制的 Firefox。请注意,这使用 cgroups v2 并设置为我的用户,而不是 root(v2 相对于 v1 的优点之一是将其委托给非 root 是安全的,因此 systemd 会这样做)。

    $ systemctl --user cat mozilla.slice 
    # /home/anthony/.config/systemd/user/mozilla.slice
    [Unit]
    Description=Slice for Mozilla apps
    Before=slices.target
    
    [Slice]
    MemoryAccounting=yes
    MemoryHigh=5G
    MemoryMax=6G
    
    $ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/firefox &
    $ systemd-run --user --slice mozilla.slice --scope -- /usr/bin/thunderbird &
    

    我发现要让用户工作,我必须使用切片。系统一只需将选项放在服务文件中(或systemctl set-property在服务上使用)即可工作。

    这是一个示例服务(使用 cgroup v1),请注意最后两行。这是系统 (pid=1) 实例的一部分。

    [Unit]
    Description=mount S3QL filesystem
    Requires=network-online.target
    After=network-online.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    Type=forking
    User=s3ql-user
    Group=s3ql-user
    LimitNOFILE=20000
    ExecStartPre=+/bin/sh -c 'printf "S3QL_CACHE_SIZE=%%i\n" $(stat -c "%%a*%%S*.90/1024" -f /srv/s3ql-cache/ | bc) > /run/local-s3ql-env'
    ExecStartPre=/usr/bin/fsck.s3ql  --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo  --log none «REDACTED»
    EnvironmentFile=-/run/local-s3ql-env
    ExecStart=/usr/bin/mount.s3ql --keep-cache --cachedir /srv/s3ql-cache/fs1 --authfile /etc/s3ql-authinfo --cachesize ${S3QL_CACHE_SIZE} --threads 4
    ExecStop=/usr/bin/umount.s3ql /mnt/S3QL/
    TimeoutStopSec=2m
    MemoryAccounting=yes
    MemoryLimit=1G
    

    文档位于systemd.resource-control(5).

    • 29
  2. Best Answer
    phuclv
    2019-02-10T04:31:38+08:002019-02-10T04:31:38+08:00

    如今进行如此巨大的交换通常是一个坏主意。当操作系统只交换了几 GB 的内存进行交换时,你的系统已经爬到了死地(就像你看到的那样)

    最好与小型备份交换分区一起使用zram。许多操作系统,如ChromeOS、Android 和各种 Linux 发行版(Lubuntu、Fedora)多年来默认启用 zram,尤其是对于 RAM 较少的系统。它比在 HDD 上交换要快得多,并且在这种情况下您可以清楚地感受到系统的响应能力。在 SSD 上则更少,但根据这里的基准测试结果,即使使用默认的 lzo 算法,它似乎仍然更快。您可以更改为lz4以获得更好的性能,但压缩率会更低。根据官方基准,它的解码速度比 lzo 快近 5 倍

    事实上, Windows 10和macOS默认也使用类似的页面文件压缩技术

    还有,zswap虽然我没用过。可能值得一试,比较哪个更适合您的用例

    之后,另一个建议是降低那些 IO 绑定进程的优先级,并可能让终端以更高的优先级运行,这样即使系统处于高负载状态,您也可以立即在其上运行命令

    进一步阅读

    • Arch Linux - 提高性能 - Zram 或 zswap
    • 启用 ZSwap 以提高性能
    • 启用 zRAM 以改善内存处理并减少交换
    • Ubuntu 内存不足?启用 ZRAM
    • ZRAM 和 ZSWAP 的区别
    • zram vs zswap vs zcache 终极指南:何时使用哪一个
    • Linux、SSD 和交换
    • https://wiki.debian.org/ZRam
    • https://www.kernel.org/doc/Documentation/blockdev/zram.txt
    • https://wiki.gentoo.org/wiki/Zram
    • 18
  3. jlliagre
    2019-02-09T07:27:52+08:002019-02-09T07:27:52+08:00

    似乎在一天不活动之后,内核认为不再需要整个 GUI 并将其从 RAM 中擦除(将其交换到磁盘)。

    内核相信它正在做正确的事情™ 。为什么它将未使用的1内存保留在 RAM 中,因此基本上浪费了它,而不是将其用作缓存或其他东西?

    我不认为 Linux 内核是无偿或预期换出页面的,所以如果它这样做,必须在 RAM 上存储其他东西,从而提高你的长期运行任务的性能,或者至少达到这个目标。

    如果您提前知道何时需要重新使用您的笔记本电脑,您可以使用at命令(或crontab)来安排交换清理(swapoff -a;swapon -a)。

    由于清理交换可能是矫枉过正,甚至触发 OOM 杀手,如果出于某种原因,不是所有的东西都适合 RAM,你可能只是“取消交换” 2与你想要恢复的正在运行的应用程序相关的所有东西。

    一种方法是将调试器附加gdb到每个受影响的进程并触发核心转储生成:

    # gdb -p <pid>
    ...
    generate-core-dump /dev/null
    ...
    quit
    

    正如您所写,您的长期运行的应用程序不会重用它在初始传递后读取的数据,因此您处于长期缓存无用的特定情况。然后像 Will Crawford 建议的那样使用直接 I/O 绕过缓存应该是一个很好的解决方法。

    1或者,您可能只是在操作系统认为交换您的 GUI 应用程序和环境是一个好主意之前,通过回显或3到/proc/sys/vm/drop_caches伪文件定期刷新文件缓存。

    请参阅如何清空 Linux 系统上的缓冲区和缓存?详情。

    1从某种意义上说未使用:在很长一段时间内不再积极使用,内存仍然与其所有者相关。
    2放回存储在交换区的 RAM 页。

    • 15
  4. Will Crawford
    2019-02-09T11:15:41+08:002019-02-09T11:15:41+08:00

    您正在运行的流程是您自己创建的吗?

    如果是这样,可能值得调整您的代码以使用该O_DIRECT标志打开文件,该标志引用手册页-

    尽量减少进出该文件的 I/O 的缓存影响。一般来说,这会降低性能,但在特殊情况下很有用,例如当应用程序进行自己的缓存时。文件 I/O 直接与用户空间缓冲区进行。O_DIRECT 标志自己努力同步传输数据,但不提供 O_SYNC 标志的保证,即传输数据和必要的元数据。为了保证同步 I/O,除了 O_DIRECT 之外,还必须使用 O_SYNC。有关进一步讨论,请参见下面的注释。

    • 10
  5. X Tian
    2019-02-09T07:33:20+08:002019-02-09T07:33:20+08:00

    这是一个我自己没有尝试过的想法(很抱歉我现在没有时间尝试这个)。

    假设您为后台进程创建了一个只有 512MB 内存的小型 VM,我不确定您是否希望它在主机系统上进行任何交换、调用和关闭交换。

    • 6
  6. Satoshi Nakamoto
    2019-02-09T07:57:44+08:002019-02-09T07:57:44+08:00

    删除交换或将其减少约 20%(可能因系统而异),因为最近操作系统不再像过去几年那样使用交换。可能它会回答你的问题:

    --> 官方redhat.com

    下面的一些红帽信息,

    过去,一些应用程序供应商建议交换大小等于 RAM,甚至是 RAM 的两倍。现在让我们想象一下上面提到的具有 2GB RAM 和 2GB 交换空间的系统。系统上的数据库被错误地配置为具有 5GB RAM 的系统。一旦物理内存用完,交换空间就会被使用。由于交换磁盘比 RAM 慢得多,因此性能下降,并发生抖动。此时,甚至可能无法登录系统。随着越来越多的内存被写入,最终物理内存和交换内存都被完全耗尽,OOM 杀手启动,杀死一个或多个进程。在我们的例子中,有相当多的交换可用,因此性能不佳的时间很长。

    和

    https://wiki.debian.org/Swap

    上面 Debian 链接的一部分,

    与使用的掉期金额相关的信息和注意事项:

    “推荐的交换空间量传统上是系统内存量的两倍。随着时间的推移,这已经变为系统内存的一倍半,这两个答案都是不错的基线,但随着时间的推移,这个问题的答案越来越没用。关于您的系统和预期用途的许多变量将决定您想要拥有的可用系统交换。”

    你可以试试:

    “在 Linux 中禁用交换的最佳方法”


    ***个人备注:***

    因为我有 6 GB RAM 并且在我最近的所有 Linux 操作系统中。我从未见过任何使用 Swap 的迹象。我决定我必须关闭它,要么是为了空间(几 GB 以上),要么是因为它有时会减慢我的系统速度。

    • 3

相关问题

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • 进程是否可以分配高速缓存,以便内核在必要时可以占用它?

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve