如何确保某些功能(例如 Alt+Ctrl+F1 切换到 tty)在重交换系统中可用?

如何确保某些功能(例如 Alt+Ctrl+F1 切换到 tty)在重交换系统中可用?

目前,当我不小心启动占用大量内存的应用程序(导致系统大量交换)时,系统变得反应迟钝(等待几个小时只是为了看到鼠标移动/或使用Alt+ Ctrl+切换到 tty1 F1),以至于它实际上意味着我需要 REISUB(= 硬重启)并丢失了所有当前的、未保存的工作。

在 Windows 世界中,内核的某些部分永远不会被换出(例如鼠标移动或Alt+ Ctrl+Del组合),即使在非常糟糕的内存不足情况下,我也可以通过调用任务管理器并终止有问题的应用程序在 5 分钟内恢复。

当然,我肯定错过了一些东西,我无法想象整个 Linux 系统可以通过像使用 imagemagick 预览多页 tiff 书这样简单而无辜的东西而崩溃(imgemagick 恰好加载了图像的所有页面)首先解压缩到内存中...)

我听说过实验BFQ I/O 调度程序,也许这有帮助?

答案1

相信。 :(。我假设我们正在考虑这里的单用户系统,所以 SaK(杀死你的整个登录)并没有真正的帮助。

了解您的硬盘活动指标。知道如何快速拿下东西。有时它可能会拯救你,有时却不会。

交换曾经工作得还算可以。现在,RAM 更快、更大,硬盘也更大,但相对速度(尤其是随机访问)却很糟糕。 Windows 在设置可怕程度的上限方面投入了大量的工作。 Linux 没有,只​​是让你自己开枪。

如果您有足够的 RAM 并且不需要休眠,可以考虑禁用交换。如果你需要休眠...你需要一个与你的内存大小相同的交换空间:(。当然可以编写脚本。可能缺乏官方支持,尽管至少 pm-utils 有一个很好的架构来安装你自己的钩子。(在挂起之前添加自定义交换设备并在恢复后将其删除;您可能还需要添加恢复=启动选项)。

也就是说,如果您有内核模式切换,ctrl+alt+f1 会工作得更好。 (否则,X 服务器必须做一些工作,并且它是一个用户空间进程。整个内核始终位于 RAM 中,这与 Windows 不同,其中某些部分可以被交换)。像 nvidia 这样的二进制驱动程序在这里不是你的朋友。

答案2

首先,对这篇文章的长度表示抱歉

冒着听起来像是 FOSS 陈词滥调的风险,针对与 Windows 任务管理器的比较:

让你更容易理解为什么 GNU/Linux 上的某些东西是这样设计的一件事就是提醒自己 Windows 并不是大多数 Linux 发行版设计的参考点(也许 Ubuntu 除外)。例如,Red Hat 是一家价值 10 亿美元的公司,但他们通过向企业用户推销自己作为传统(专有)Unix 供应商的经济实惠且易于使用的替代品并与 HP-UX Solaris、AIX 等操作系统竞争来实现这一目标。大多数 Unix 部署都在高端数据中心,因此 Unix 从一开始就考虑到任何对其进行维护的人都将拥有一定水平的技术知识,并且会重视诸如系统惰性、明确定义的转换过程之类的东西。 ,以及高水平的粒度控制。

这种(理性)思维方式与 Window 的设计直接相反:将所有内容放在轨道上,让您获得一个单一的基本解决方案,然后您可以将其打造成您自己的品牌,对配置进行一些基本更改,也许,如果您是高级用户用户,进去改变一些“低级”的东西(Unix管理员的“低级”概念和Windows管理员的“低级”概念由于这种设计差异而有很大不同)。对于 Windows 管理员来说,检查/更改 AD Kerberos 服务器的 HMAC 被认为是 l33t(至少我希望普通 AD 管理员只是不知道 AD 使用 MD4 哈希值),而在 Unix 上,HMAC、密码等只是设置的一部分服务器,只是您在设计公司解决方案时应该考虑的一些事情。

这并不是说为了减少部署所消耗的时间而将事情放在轨道上一定是不好的,有时您只需要一个解决方案,而通过管理控制贡献的价值并不值得这种程度的明确性。这就是为什么红帽仍然开发 FreeIPA(点击式身份管理)和 ktune(通过选择最适合您的系统预期用途的“配置文件”进行基本性能调整)之类的东西。但从 Unix 的角度来看,大多数 MS 产品都被认为是鼓励不良管理工作道德的软件(通过误导您哪种工作流程最有效),特别是如果它用于解决您办公桌上遇到的每一个问题。它使你的工作变得更轻松,但你却降低了雇主的效率。

我可以详细阐述这一点(太晚了,对吧?)并开始谈论 Windows 所做的一些没有技术意义但无论如何都实现了的事情,但你明白了。

对于 Window 的设计,Unix/Linux 管理员有很多捶胸顿足和故作姿态的说法(其中一些只是“讨厌者会讨厌”或演讲者的自负),但如果你深入探讨这个论点足够长的时间,你就会发现我们会发现,关于操作系统应该如何运行以及您的管理风格应该是什么,存在着根本的意识形态分歧。

不过,要回答这个问题:

Linux 让系统陷入这样的困境并不是设计缺陷,而是一种设计选择。你可以争论默认值,但 Unix 的设计理念是管理员应该理解确切地系统正在做什么。在目标工作环境中,“这就是 Unix 的做法”并不是一个可以接受的答案。你的老板会希望你确信,当问题出现时,你确切地知道发生了什么,并且你从根本上解决了问题,这样它就不会再次出现。

由于期望管理员会重视不透明的自动化平台流程的明确性和系统惰性,因此由管理员决定他们想要实施哪种解决方案(您从不直接与之交互的软件供应商如何了解您的公司需要并开箱即用?)。 Unix/Linux 为您提供了完成工作的基本机制(希望这些机制能够防止您变得多余、“干”等等),但他们不会尝试为您开发最终的解决方案。

您可能感兴趣的是研究内核机制,例如OOM 杀手这将在系统范围内或在每个进程的基础上杀死失控的进程(请参阅上一跳转以了解如何执行此操作)。C组是目前控制资源使用的首选机制,但是限制.conf已经存在相当长一段时间了,并且可以根据用户名或组成员身份设置限制(但它是基于每个会话的)。

如果特定用户或组使系统陷入困境,供应商方面的设计假设是您不得对进程施加限制(也许是为了优雅地适应临时峰值,或者通过避免对应用程序的限制性上限来挤出系统的更多性能,这可能会导致不良的应用程序性能/行为),因此会让进程达到 OOM杀戮极限,.

如果情况并非如此,您需要对 cgroups 或 limit.conf 进行一些操作,以便包含导致此问题的任何软件,并且不会导致系统崩溃。这与您预期的 Windows 行为相反,在这种情况下,他们并没有真正为您提供选择加入或选择退出的权限,它们只是去做就对了一种方式,如果这不适合您的思维方式或业务流程,那么您只需要学会处理它。许多 Windows 的设计隐藏了体面的管理员有意的设计选择,告诉非技术人员(真诚地)“这不是系统的工作方式”或“这不是计算机的工作方式”,这基本上是一套令人扼杀的逻辑他们鼓励管理员承担起责任。

最终,您需要关心解决问题以及控制问题和摆脱问题。对于平台设计,我可以看到将 Xorg 及其后代添加到某种默认 cgroup 中的论点,然后您可以将其作为目标,但您必须将其与 Canonical 结合起来(我假设这是在 Ubuntu 上从您的其他评论中获得的) )。发生此问题有一些根本原因,需要通过以下方式之一解决:1) 额外的硬件容量 2) 限制/分配应用程序对所述容量的访问 3) 解决应用程序级错误,例如内存泄漏或软件错误。

考虑到你所说的你喜欢的内容,豪克关于为系统恢复创建一个特定的 tty 的想法实际上是一个非常好的想法。我在上面添加了一个附录,以使其更接近目标。这是您可以为自己开发的特定解决方案,不过您可以自己找出几乎无限的排列组合。

答案3

如果您将 CPU 和 I/O 实时优先级赋予其中一个 getty,则问题可能会减少。您还可以创建另一个具有 UID 0 的用户,并使其 shell 成为具有静态链接 shell 的 ramdisk 的路径。并/etc/passwd每隔几秒继续读取一次,以便将其保留在缓存中。

更好的方法可能是运行一个进程来停止消耗大量 RAM 的进程。

编辑1:

另一个想法:您可以在一个虚拟控制台上以 root 身份在屏幕内启动 top(均具有实时优先级)并自动锁定屏幕。因此,您需要 root 密码才能使用 top,但优点是您需要的进程已经在运行。由于它们正在积极地做某事,因此它们不会被换出,但会消耗很少的 CPU 和内存。

答案4

正如您所注意到的,SysRq 仍然响应,您可以调整违规进程的 OOM 优先级。通过写入 来完成调整/proc/XYZ/oom_score_adj,其中 XYZ 是进程 ID。如果进程失控,如有必要,请使用AltGr+ SysRq+终止其中一个进程。F

这是我执行此操作的脚本:

#!/bin/bash

# match any process containing "thunderb" or "chrome" - that's specific enough for me
for i in `ps ax | grep -E 'thunderb|chrome' | cut -f1 "--delimiter= "` ; do
        fname=/proc/$i/oom_score_adj
        if [ -f "$fname" ] ; then
                # the higher the score, the more likely the process is 
                #  to be chosen by the OOM killer
                echo '900' > $fname
        fi
done

请注意,您需要以 root 身份运行此脚本,它只会影响已经存在的进程。

相关内容