即使有可用的交换,我的服务器也耗尽了内存。
为什么?
我可以这样重现它:
eat_20GB_RAM() {
perl -e '$a="c"x10000000000;print "OK\n";sleep 10000';
}
export -f eat_20GB_RAM
parallel -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)
当稳定(即所有进程都进入睡眠状态)时,我再运行一些:
parallel --delay 5 -j0 eat_20GB_RAM ::: {1..25} &
Run Code Online (Sandbox Code Playgroud)
当稳定(即所有进程都进入睡眠状态)时,使用大约 800 GB RAM/swap:
$ free -m
total used free shared buff/cache available
Mem: 515966 440676 74514 1 775 73392
Swap: 1256720 341124 915596
Run Code Online (Sandbox Code Playgroud)
当我再运行一些时:
parallel --delay 15 -j0 eat_20GB_RAM ::: {1..50} &
Run Code Online (Sandbox Code Playgroud)
我开始得到:
Out of memory!
Run Code Online (Sandbox Code Playgroud)
即使有明显的交换可用。
$ free
total used free shared buff/cache available
Mem: 528349276 518336524 7675784 14128 …Run Code Online (Sandbox Code Playgroud) [免责声明:我最初对在此处发布此内容感到有些紧张,因此我在 Meta 上询问讨论自制软件/改装是否可以接受。根据我从几位资深成员那里得到的回应,我已经继续发布了这个帖子。这是 Meta 上的链接。]
我目前正在尝试使用 xboxhdm 和 ndure 3.0 修改我的原始 Xbox。xboxhdm 是围绕一个小型的可启动 Linux 发行版构建的,它让我很适合,所以我想我会在这里问一下,看看是否有人可以帮我一把。(注意:在有人建议使用不同的主板之前,xboxhdm 从 PC 上的 CD 启动 - Xbox 硬件完全不参与该过程,所以这就是我在这里问的原因。)
我使用的 PC 相对较旧 - 它是一个旧的 Compaq 台式机,具有大约 512mb RAM 和一个 2.5ghz 处理器(可能是 P IV)。我使用它是因为它在主板上有 2 个 IDE 端口。计算机的年龄不应该是一个问题,性能方面 - xboxhdm + ndure hack 已经存在多年了 - 它被设计为在这样的硬件上运行。
无论如何 - 在此过程中的某个时刻,我必须将一些文件从 CD 复制到 Xbox 硬盘驱动器(这是一个标准的希捷 IDE 驱动器,由 Molex 提供支持)。大约复制到一半时,一切都消失了......我收到一个unable to handle kernel paging request错误,并最终导致内核恐慌。
我找不到有关此错误的任何信息以及它与 Xbox 改装的具体关系,但是我能找到的信息表明我的 RAM 可能有问题。我还不能对此进行测试,但是我一到家就会运行 MEMTEST。
我没有带设置 - 我在工作,它在家里 - 但如果有人有兴趣伸出援手,我今晚会拍照并张贴。我在这里问的唯一原因是因为我仍然是一个相当新的 …
我正在配置和编译新的 3.0 内核。我计划使用一段时间(通过修补)并合并到 3.0 中的好东西之一是 zram。
是否可以同时设置 hdd 交换和 zram 交换,以便首先使用 zram 并且只将溢出的页面放入实际交换?
64 位 linux 中的默认用户/内核拆分是什么?
我读过Documentation/x86_64/mm.txt(有人指出),但我无法辨认。有人可以提供一个直接的答案(例如 32 位实现的 3GB/1GB)。
为什么/proc/pid/maps包含同一个图书馆的几条记录?下面是一个例子:
7fae7db9f000-7fae7dc8f000 r-xp 00000000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7dc8f000-7fae7de8f000 ---p 000f0000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de8f000-7fae7de97000 r--p 000f0000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
7fae7de97000-7fae7de99000 rw-p 000f8000 08:05 536861 /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.20
Run Code Online (Sandbox Code Playgroud)
这是什么意思 ?
过去,我对 Linux 上的内存不足情况感到有些厌烦,在这种情况下,虚拟内存开始交换并占用磁盘活动,并且机器速度变慢。
所以当我在我的 MacBook Pro 上安装 Ubuntu 时,我注意到它有 8 GB 的内存,我对自己说,“这似乎足够了,我想我会避免交换问题,而不是为虚拟内存保留一个分区。我无论如何都需要磁盘空间。”
好吧,令我惊讶的是,事实证明,没有虚拟内存的 Linux 在内存不足的情况下的用户体验比我预期的要糟糕得多。
如果我不小心一次编译了太多的大型 C++ 文件(使用“make -j6”很容易做到),或者在我注意到之前意外消耗了机器内存的其他东西,而不是该程序崩溃并给出我所期望的错误,事实证明,行为是我的整个桌面停止响应,我被迫硬重启计算机!有时我会因此失去很多时间或工作!
我会通过返回并重新分区给自己一些虚拟内存来修复它,但该死的......我现在负担不起。是否有任何提示可以让 Linux 更干净地处理内存不足情况?
$ cat /proc/meminfo | grep Dirty
Dirty: 2396 kB
Run Code Online (Sandbox Code Playgroud)
我如何查看那些 599 个脏页位于哪些文件(至少作为一个 mountid:inode 对)?
$ cat /proc/meminfo | grep Cached
Cached: 6171156 kB
Run Code Online (Sandbox Code Playgroud)
如何在不查看vmtouch整个文件系统的情况下查看缓存中的文件?
也许有一些 netlink 或 debugfs 或 /dev/kmem-reading 或任何技巧可以做到这一点?
Linux 编程接口显示了进程的虚拟地址空间的布局:
物理内存中的内核是否完全或部分映射到每个进程的虚拟地址空间中从0xC0000000到0XFFFFFFFF顶部的“内核”部分?
如果部分,物理内存中内核的哪一部分映射到每个进程的虚拟地址空间中的“内核”部分,哪一部分不是?
进程的虚拟地址空间中的“内核”部分是否准确地存储了进程在内核模式下运行时可以访问的内核代码部分,而不是内核代码中不可访问的部分?
所有进程的虚拟地址空间在它们的“内核”部分是否具有相同的内容?
Linux 内核是否为其数据结构(页表、描述符等)使用虚拟内存?进一步来说:
内核空间地址是否在 MMU 中进行了转换(页表遍历)?
内核内存可以被换出吗?
对内核数据结构的内存访问会导致页面错误吗?
linux和其他unix在这方面有什么区别吗?
我正在为 RHCSA 学习,但对我在一些培训材料中遇到的声明感到困惑:
没有实际的最大 RAM,因为理论上,您可以在 RHEL 6 上运行 128 TB 的 RAM。但这只是理论。Red Hat 在 RHEL 6 上支持的最大 RAM 在 32 位系统上为 16 GB,在 64 位系统上为 2 TB。
有人可以解释一下 128 TB 的理论限制来自哪里吗?如果 RHEL 6 明确定义了其他最大限制,我对作者如何知道理论限制存在感到困惑。这只是考虑了 64 位架构的理论限制吗?还是这里有其他原因?