我从系统日志 (/var/log/messages) 中得到以下错误。他们表示什么?以及如何解决它们?
Sep 30 05:19:35 node23 kernel: Mem-info:
Sep 30 05:19:35 node23 kernel: Node 0 DMA per-cpu:
Sep 30 05:19:35 node23 kernel: cpu 0 hot: high 0, batch 1 used:0
Sep 30 05:19:35 node23 kernel: cpu 0 cold: high 0, batch 1 used:0
Sep 30 05:19:35 node23 kernel: cpu 1 hot: high 0, batch 1 used:0
Sep 30 05:19:35 node23 kernel: cpu 1 cold: high 0, batch 1 used:0
Sep 30 05:19:35 node23 kernel: cpu 2 hot: high 0, …Run Code Online (Sandbox Code Playgroud) 我知道虚拟内存的概念。通过按需分页(取决于 vm.overcommit_memory),您可以分配比可用 RAM 更多的内存。除非您“触摸”页面,否则什么都不会发生。否则我猜有一个页面错误,然后物理内存被用于页面框架。但这在某种程度上意味着,如果系统内存紧张,它只会调出最近使用的内容并正常工作。
怎么可能需要终止一个进程呢?发生这种情况是因为 mlock() 处理了太多内存吗?垃圾过多后是否会调用 OOM?或者换个角度问:触发 OOM 杀手背后的启发到底是什么?
我读到您可以执行“echo 1 > memory.oom_control”或“echo -17 > /proc/PID/oom_adj”来禁用它。这意味着什么?机器可能会在一段时间内完全没有响应。但是,如果以某种方式,有问题的进程检测到它没有取得进展,它也可能暂时停止消耗内存(那么快),最终一切都应该重新开始工作,还是我错了?
在我的场景中,只有一个进程(具有巨大的内存缓存)。当然,该数据不是持久的,但我仍然不想重新启动该过程(并重新加载该数据)。
一些 apache httpd 进程的内存和 cpu 使用率过高,被内核杀死,但我不知道为什么 httpd 使用这么多内存。我需要一些方法来分析或一些方法来重现。
关于 apache 和 syslog 的一些消息
Server version: Apache/2.2.34 (Unix)
Server built: Aug 17 2017 15:49:40
Run Code Online (Sandbox Code Playgroud)
系统日志消息
Oct 19 15:28:20 kernel: httpd invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
Oct 19 15:28:20 kernel: httpd cpuset=/ mems_allowed=0-1
Oct 19 15:28:20 kernel: Pid: 7446, comm: httpd Not tainted 2.6.32_1-12-0-0 #1
Oct 19 15:28:20 kernel: Call Trace:
Oct 19 15:28:20 kernel: [<ffffffff8108acf6>] ? dump_header+0x7c/0x187
Oct 19 15:28:20 kernel: [<ffffffff8108b24b>] ? oom_kill_process+0x6c/0x17b
Oct 19 15:28:20 kernel: [<ffffffff8108b784>] ? …Run Code Online (Sandbox Code Playgroud) 我正在使用 cgroup 对我的进程进行分区,并且在我的内核日志中收到 Out Of Memory 消息。
但是,我找不到导致它们的分区。我检查了内存控制器 cgroup,但没有明显的使用方法。
问题是,当我在系统日志中看到“任务被杀死”消息时,任务已经死亡,它的 /proc 条目消失了,cgroup 的任务文件没有被杀死任务的 pid。
我在 Digital Ocean 上为最小的 Droplet 设置了一个 WordPress 几个月。
最近,我的博客疯传(1000+ facebook 分享),服务器需要 50 多秒才能响应。(Google Analytics 显示今天几乎一整天都有大约 40 人同时访问我的博客。)
我询问 Digital Ocean 支持团队,他们告诉我我的 512 MB RAM 太小了。
但我使用“free -m”并看到
total used free shared buffers cached
Mem: 490 465 24 64 94 136
-/+ buffers/cache: 234 256
Swap: 999 0 999
Run Code Online (Sandbox Code Playgroud)
所以我认为我有 256 MB 可用内存?
我告诉他们,他们说“虽然它可能显示 100MB 的可用内存,但这可能只是在它终止了一些服务以节省内存之后。”
但我使用“顶部”并看到
%Cpu(s): 0.3 us, 0.0 sy, 0.0 ni, 99.7 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
Run Code Online (Sandbox Code Playgroud)
我发现CPU保持在92~100% id,所以我认为我的CPU不忙。
那么如何才能找到瓶颈呢?
我想在支付更多升级费用之前知道瓶颈是什么。
我的老朋友OOM杀手来拜访我已经有很长时间了。现在它每周来一次,我无法弄清楚它为什么被触发。似乎我没有失去记忆。是什么导致了这种情况,可以采取哪些措施来防止这种情况发生?
内核:3.13.0-49-generic #83-Ubuntu SMP
就在 OOM 杀手被触发之前:
Fri Nov 16 01:45:01 EST 2018
COMMAND %MEM
mysqld 17.2
apache2 7.2
spamd child 7.0
apache2 7.0
apache2 6.9
apache2 6.8
apache2 6.8
apache2 6.6
apache2 6.6
apache2 6.4
apache2 6.4
/usr/sbin/spamd 6.4
spamd child 6.2
apache2 5.6
opendkim 0.6
horde-alarms 0.5
fail2ban-server 0.5
apache2 0.4
munin-node 0.2
pickup 0.1
cron 0.1
cron 0.1
cron 0.1
mem.sh 0.1
init 0.1
ps 0.1
config 0.0
tlsmgr 0.0
ntpd 0.0
qmgr 0.0
sh 0.0
sh …Run Code Online (Sandbox Code Playgroud) 大约每周一次,OOM-killer 会在我的服务器中关闭一个 postgres 进程,尽管“免费”状态它有足够的可用内存。
我在这里和那里阅读了几个线程,但看不到任何真正的解释。难道真的是因为服务器现在已经掉呢?它是(Ubuntu)内核错误吗?
并且先发制人,是的,也许我会添加交换。但是就没有其他的解决办法了吗?或者至少解释一下?:)
服务器:物理戴尔 内存:64GB RAM 和 0 Swap uname:Linux 服务器名称 4.4.0-62-generic #83-Ubuntu SMP Wed Jan 18 14:10:15 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux Postgres 版本:9.5.10(8GB 共享内存) vm.overcommit_memory = 0
free -m在最后一次杀戮之前的输出
可用的免费共享 buff/缓存总数 电话:64312 2666 450 8699 61196 52126 交换:0 0 0
上次杀死的内核日志
6 月 19 日 21:29:49 服务器名称内核:[17009377.877956] bash 调用 oom-killer:gfp_mask=0x26000c0,order=2,oom_score_adj=0 6 月 19 日 21:29:49 服务器名称内核:[17009377.877959] bash cpuset=/ mems_allowed=0-1 6 月 19 日 21:29:49 服务器名称内核:[17009377.877964] CPU:23 PID:61771 通讯:bash 未受污染 4.4.0-62-generic #83-Ubuntu …
当我看到有足够的内存可用时,我无法理解为什么内核会发出这个 oom 杀手:
我看后说有足够的可用内存
普通的
DMA
普通自由行
这是一个基于 NAND 闪存的嵌入式设备,具有 256 MB RAM
内核:2.6.31
myshellscript invoked oom-killer: gfp_mask=0xd0, order=2, oomkilladj=0
Backtrace:
[<c0106494>] (dump_backtrace+0x0/0x110) from [<c03641a0>] (dump_stack+0x18/0x1c)
r6:000000d0 r5:c9040c60 r4:00000002 r3:c0448690
[<c0364188>] (dump_stack+0x0/0x1c) from [<c015a314>] (oom_kill_process.clone.11+0x60/0x1b4)
[<c015a2b4>] (oom_kill_process.clone.11+0x0/0x1b4) from [<c015a738>] (__out_of_memory+0x154/0x178)
r8:c21e86e0 r7:001fb000 r6:00000002 r5:000000d0 r4:c9b6e000
[<c015a5e4>] (__out_of_memory+0x0/0x178) from [<c015a980>] (out_of_memory+0x68/0xa0)
[<c015a918>] (out_of_memory+0x0/0xa0) from [<c015d230>] (__alloc_pages_nodemask+0x42c/0x520)
r5:00000002 r4:000000d0
[<c015ce04>] (__alloc_pages_nodemask+0x0/0x520) from [<c015d388>] (__get_free_pages+0x18/0x44)
[<c015d370>] (__get_free_pages+0x0/0x44) from [<c0109418>] (get_pgd_slow+0x1c/0xe0)
[<c01093fc>] (get_pgd_slow+0x0/0xe0) from [<c0129ab0>] (mm_init.clone.43+0xb0/0xf0)
r7:c90858c0 r6:00000000 r5:c90858c0 r4:ce1a6680
[<c0129a00>] (mm_init.clone.43+0x0/0xf0) from [<c0129c40>] …Run Code Online (Sandbox Code Playgroud) 我有多台机器通过 6-10 个用户使用的 NFS 共享共享主目录。所有机器都用于运行计算实验,包括带有 NFS 服务器的机器。虽然这种情况非常罕见,但有可能某些实验可能会导致内存不足 (OOM) 问题。虽然用户进程可能会在某个时间点被杀死,但我想知道它如何影响 NFS 服务器从而反过来影响其他机器。我尝试搜索它,但找不到具体的答案。还有我可以采取什么措施来避免 OOM 影响 NFS 共享?
NFS 服务器配置:Intel Core i7-9700、32 GB RAM、SWAP 32 GB 和 Graphics TITAN RTX 其他机器也有类似的配置。
我能够使用旧的 2.6.x 内核在 VPS 上编译具有 1 GiB RAM 的程序。但是当我尝试在具有 1.1 GiB RAM 和 3.9.x 内核的 VPS 上编译它时,编译器总是被 OOM Killer 杀死。
如何让 OOM 更被动?
oom ×10
linux ×8
kernel ×3
memory ×2
ubuntu ×2
apache-2.2 ×1
bash ×1
centos ×1
cgroup ×1
linux-kernel ×1
memory-usage ×1
nfs ×1
postgresql ×1
wordpress ×1