我有一个云服务器,内存约 14G,没有交换。但是,我偶尔会看到 kswapd0 在运行top
. 如果没有可供管理的交换空间,为什么 kswapd0 会运行?
psu*_*usi 31
交换空间仅用于没有任何其他文件支持的数据。即使您没有交换设备,从磁盘上的其他文件(例如可执行程序)映射的数据仍会交换到它们各自的文件中。
小智 14
一个众所周知的问题是,当 Linux 内存不足时,它会进入交换循环而不是做它应该做的事情,杀死进程以释放内存。有一个 OOM(内存不足)杀手可以做到这一点,但前提是 Swap 和 RAM 已满。
然而,这应该不是问题。如果有一堆有问题的进程,例如 Firefox 和 Chrome,每个进程都有使用和占用内存的选项卡,那么这些进程将导致交换读回。Linux 然后进入一个循环,其中相同的内存在内存和硬盘驱动器之间来回移动。这反过来会导致优先级反转,其中来回交换几个进程会使系统无响应。
如果禁用交换,则会使这个问题变得更糟,因为 kswapd0 现在别无选择,只能换出映射内存,例如可执行文件。如果您换出可执行文件,则更有可能很快将它们重新换回。
我尝试在 NetBSD 中触发此行为以进行测试,结果发现违规过程变得非常缓慢,而操作系统本身却非常敏感。这意味着交换问题确实发生了,但没有优先级反转。但是 NetBSD 没有 AMDGPU 驱动程序,所以我暂时坚持使用 Linux。也许 NetBSD 不内存映射可执行文件,这就是它不进入交换循环的原因,但我对它的实现知之甚少,无法说明为什么它不会变得无响应。
Facebook 也有这个问题,并创建了 OOMD,即内存不足守护进程。这是检测 kswapd0 活动并开始终止进程的守护进程。据 Facebook 称,这几乎完全消除了 Linux 服务器无响应的问题。但是,我尚未对其进行测试,也不知道它在其他服务器或台式机/笔记本电脑上的运行情况如何。吸引人的 OOMD 有一些逻辑来决定首先杀死哪些进程,以保留系统进程及其服务器系统中负责重新启动被杀死的任何进程的部分。
然而,这不是它应该如何解决。OOMD 是一个丑陋的黑客。真正的解决方案是修复交换循环导致的优先级反转,并使内核 OOM Killer 更积极地杀死进程以释放内存。修复属于内核,因为这是我们可以确保及时检测到问题并正确终止进程的唯一地方。
设置 swappiness=0 不是解决方案,因为当系统没有可用 RAM 时,它无论如何都会开始交换。没有选项可以保证系统不会开始交换。
而且修复有问题的应用程序也不是解决办法。如果用户想要利用此错误故意使操作系统无响应,则尤其如此。响应是内核的责任。如果 Firefox 使自己无响应,则修复是针对应用程序的。然而,它不仅使自己无响应,而且导致整个操作系统变得非常缓慢和无响应。到了登录SSH可能需要半小时的程度。SSH 无关,如果它不能运行,那是内核中的错误,而不是系统的任何其他部分。这不是一个错误,而是两个错误。一个错误是优先级反转,其中允许偏离轨道的交换周期干扰除违规进程之外的其他进程,并且这本身是不好的。另一个错误是它没有 t 检测到它处于交换循环中,这会导致 HDD/SSD 或支持交换的任何存储出现疯狂磨损。当交换可执行文件时,这不是一个问题,因为它们是只读的内存映射,不会写回磁盘,但 kswapd0 仍然锁定读取它同时从内存中删除的内容。
哦,还有第三个错误。当内存饥渴的应用程序吞噬所有可用内存时,没有办法保护磁盘缓存不被吃掉这一事实。这是 kswapd0 使系统无响应的原因之一。最热的内存映射数据通常存储在磁盘缓存中,但是当 Firefox 吃掉该缓存时,显然意味着必须进行磁盘读取。
不一定是 Firefox 导致了您的问题,但它是默认浏览器,而不是 Chrome。众所周知,两者都会触发这个问题,因为它们将可用内存视为浪费的东西,包括缓存和交换内存,在 Linux 中被视为“可用内存”。因此,为了不浪费“可用内存”,将其用于缓存和其他内容。显然,将 SWAP 用于 DISK CACHE 是一个非常糟糕的想法,但 Firefox 和 Chrome 的研究员都回应说“空闲内存是浪费内存”。
所以我们这里有三个内核错误,内核团队似乎没有考虑这些错误。以及 Firefox、Chrome 和所有他们不认为是错误的衍生产品中的错误。我尝试在我的 Fedora 笔记本电脑上构建 Firefox 以研究这个问题并可能修补它。你猜怎么着。在具有 4GB ram 的 4 核 CPU 上构建带有 GCC 的 Firefox 会触发带有 PRIORITY INVERSION 的 SWAP LOOP。所以必须重写的应用程序之一是 GCC。在 NetBSD 上,只是运行 4 个 GCC 实例比运行一个实例慢,但它不会冻结系统。
是的,这有点咆哮,但我希望它能澄清 Linux 内存子系统以及导致它的应用程序的当前问题。
Ell*_*sch 10
它仍然有一个过程来检查是否有任何交换。为了减少它,你需要设置你的swappiness -
以 root 身份编辑“/etc/sysctl.conf”,然后更改(或添加)
vm.swappiness = 0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
29524 次 |
最近记录: |