我需要通过 SSH 在远程计算机上运行一些内存繁重的测试。上次我这样做时,计算机停止响应,需要有人物理重新启动它。
有没有一种方法可以设置它,以便在使用太多内存时系统重新启动而不是冻结?(我确实有 root 访问权限)。内核版本为 4.9.0。
我们正在 AWS EC2 内构建在 Centos7 之上的 Jenkins 实例中构建或运行 Docker 容器。我们有 2 个带有 2 个 CPU 和 3.5 Gb 可用内存的 t2.medium 盒实例。
在一种情况下,我们正在另一个中构建容器,我们只是拉动它们并运行(不同的容器)。
我们开始出现错误
open /var/lib/docker/overlay/<sha>-init/merged/dev/console: cannot allocate memory
Run Code Online (Sandbox Code Playgroud)
在journalctl我们得到
page allocation failure: order:4
Run Code Online (Sandbox Code Playgroud)
运行页面缓存转储可以暂时解决问题
echo 1 > /proc/sys/vm/drop_caches
Run Code Online (Sandbox Code Playgroud)
所以我注意到在运行 docker 任务时,Dirty内存块会出现峰值(应该如此)并Mapped在它之后跳跃。然而,DirectMap4k相对接近那个跳跃。
例如:
闲置机器
cat /proc/meminfo | grep -P "(Dirty|Mapped|DirectMap4k)"
Dirty: 104 kB
Mapped: 45696 kB
DirectMap4k: 100352 kB
Run Code Online (Sandbox Code Playgroud)
主动机
cat /proc/meminfo | grep -P "(Dirty|Mapped|DirectMap4k)"
Dirty: 72428 kB
Mapped: 70192 kB
DirectMap4k: …Run Code Online (Sandbox Code Playgroud) 当 OOM Killer 或内核报告内存状态时,它使用以下缩写
Node 0 DMA: 26*4kB (M) 53*8kB (UM) 33*16kB (ME) 23*32kB (UME) 6*64kB (ME) 7*128kB (UME) 1*256kB (M) 2*512kB (ME) 0*1024kB 0*2048kB 0*4096kB = 4352kB
Node 0 DMA32: 803*4kB (UME) 3701*8kB (UMEH) 830*16kB (UMH) 2*32kB (H) 0*64kB 0*128kB 1*256kB (H) 0*512kB 0*1024kB 0*2048kB 0*4096kB = 46420kB
Run Code Online (Sandbox Code Playgroud)
我理解其中一些,例如M——可动UMH——不可动高。但我找不到什么办法E
在哪里可以找到有关它的文档?
我的情况,我有下一条消息
page allocation stalls for 27840ms, order:0, mode:0x14200ca(GFP_HIGHUSER_MOVABLE)
Run Code Online (Sandbox Code Playgroud)
进程请求 4kb 页是什么意思(2^0 * 4kb),应该编码为 (MH) 我说得对吗?或者HIGHUSER以不同的方式编码?
我有一个存在内存问题的虚拟机。我想在其中运行的任务之一是因内存不足错误而崩溃。
然而,当它崩溃时,系统仍然保持内存不足。我不确定这是否只是我遗漏的一个进程,还是一个实际的错误(这是在 hyper-v 中,具有允许 linux 主机内存膨胀的新内核扩展,因此它很可能是一个真正的内核错误)。
durr@sqlbox:~$ free -h
total used free shared buffers cached
Mem: 3.1G 2.6G 541M 88K 7.4M 39M
-/+ buffers/cache: 2.5G 588M
Swap: 1.0G 6.2M 1.0G
Run Code Online (Sandbox Code Playgroud)
Free 告诉我,它不只是缓存,实际上有一些东西似乎正在占用 2.6G 内存。
但是,查看按虚拟大小排序的 PS 输出并不具有启发性:
durr@sqlbox:~$ ps -e ax -o pid,vsz,comm | sort --numeric-sort --key=2
[ ... snip ... ]
PID VSZ COMMAND
96 0 rcuob/23
97 0 rcuob/24
98 0 rcuob/25
99 0 rcuob/26
1124 4368 acpid
59863 10016 ps
1031 15668 upstart-file-br
1047 15820 getty
1050 …Run Code Online (Sandbox Code Playgroud) 我通读了 man proc 的文档。当谈到 overcommit_memory 时,overcommit_memory=0 中的启发式不太好理解。启发式实际上是什么意思?
“不检查使用 MAP_NORESERVE 调用 mmap(2)”是否意味着内核只分配虚拟内存而不知道交换空间的存在?
该文件包含内核虚拟内存记帐模式。值是:
0:启发式过量使用(这是默认设置)
1:总是过量使用,从不检查
2:始终检查,永远不要过度使用
模式0下,不检查mmap(2)和MAP_NORESERVE的调用,默认检查很弱,导致风险
获得一个进程“OOM 杀死”。
除了前面的问题,虚拟地址空间耗尽是否会导致 OOM,而不管剩余的物理内存是否足够。
谢谢。
在服务器级别可视化一些与内存相关的指标时,我得到一个如下所示的图表:
蓝线下方的区域是RAM Used。红线下方和蓝线上方的区域是RAM Cache + Buffer。黑线下方和红线上方的区域是RAM Free。橙色线以下和黑色线以上的区域是SWAP Used。
正如您在图表中看到的:RAM Used随着时间的推移略有减少(或至少没有增加)。但 RAM Free 也在减少,因为RAM Cache + Buffer.
我们尝试估计此服务器将来是否会耗尽内存,因此创建了一条RAM Free明显减少的趋势线,因此趋势分析表明,RAM Free在不久的将来不会再有内存问题,并且会出现内存问题。
我现在的问题是:
RAM Free+ Ram Cache + Buffer)或仅关注RAM Used?RAM Free和增加RAM Cache + Buffer是关于可用内存的危险信号还是无需担心?我正在遵循一个在启动时自动解密硬盘驱动器的指南,使用自生成的密钥和 tpm2 变量,接近尾声时,它使这一点似乎有意义: https: //blastrock.github.io/fde- tpm-sb.html#disable-the-magic-sysrq-key
神奇的 SysRq 键允许运行一些特殊的内核操作。默认情况下,最危险的功能是禁用的,您应该保持这种状态以获得最大的安全性。
例如,其中之一 (f) 将调用 OOM-killer。此功能可能会杀死您的锁屏,从而使恶意用户能够完全访问您的桌面。
问题是我只找到了如何禁用所有sysrq 键,例如https://askubuntu.com/questions/911522/how-can-i-enable-the-magic-sysrq-key-on-ubuntu-desktop或https ://askubuntu.com/questions/11002/alt-sysrq-reisub-doesnt-reboot-my-laptop,使用添加/etc/sysctl.d/90-sysrq.conf以下行的文件:
kernel.sysrq=1
Run Code Online (Sandbox Code Playgroud)
我希望如果可能的话能够使用所有其他键,例如 REISUB,以防系统崩溃,并且只禁用该F键。
我还发现这篇文章https://www.kernel.org/doc/html/latest/admin-guide/sysrq.html,其中提到添加一个位掩码,例如:
2 = 0x2 - enable control of console logging level
4 = 0x4 - enable control of keyboard (SAK, unraw)
8 = 0x8 - enable debugging dumps of processes etc.
16 = 0x10 - enable sync command
32 = 0x20 - enable remount read-only
64 = 0x40 - …Run Code Online (Sandbox Code Playgroud) 内存不足是一个常见问题,官方的 OOM 效率不高。为了更快地完成查杀工作,还引入了其他几个程序。
我想知道为什么没有办法创建交换而不是杀死。考虑一个没有交换的系统,OOM 程序可以触发sudo swapon /swapfile(假设swapfile存在)而不是杀死进程。
实施这个想法有技术限制吗?