在运行了大约 18 个小时后,这个系统使用了大约 10GB 的内存,导致我们在运行我们的日常任务时触发了 OOM-killer:
# free -h
total used free shared buffers cached
Mem: 14G 9.4G 5.3G 400K 27M 59M
-/+ buffers/cache: 9.3G 5.4G
Swap: 0B 0B 0B
# cat /proc/meminfo
MemTotal: 15400928 kB
MemFree: 5567028 kB
Buffers: 28464 kB
Cached: 60816 kB
SwapCached: 0 kB
Active: 321464 kB
Inactive: 59156 kB
Active(anon): 291464 kB
Inactive(anon): 316 kB
Active(file): 30000 kB
Inactive(file): 58840 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
Dirty: 40 …Run Code Online (Sandbox Code Playgroud) 我的小型 ec2 实例有 1.7 GB 内存,运行基于 CentOS 的 Amazon AMI,在 Apache 使用过多内存时存在问题。如果你看一下截图,内存使用率将在 90-100%,直到我重新启动 httpd 服务,它会重新开始,增加到 90+%。

我真的很感激有关如何定位问题的一些帮助。这可能是“正常”的 apache 行为,以利用所有可用内存吗?或者是否有我必须追捕的可能泄漏。目前,我对可能发生的事情感到有些困惑。
我们正在使用 Apache MPM prefork,没有 sql 或任何类似的东西——只有 apache。网站在这里。
我有一个 Redis 3.0.5 实例,随着时间的推移,它往往会显示 mem_fragmentation_ratio 的增长。
使用该实例的应用程序不断地创建和删除密钥。
一个月后,我的结果是 mem_fragmentation_ratio > 1.30。这会影响 Redis 在该服务器上的内存占用:
~$ redis-cli info memory
# Memory
used_memory:7711297480
used_memory_human:7.18G
used_memory_rss:10695098368
used_memory_peak:11301744128
used_memory_peak_human:10.53G
used_memory_lua:95232
mem_fragmentation_ratio:1.39
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
如果我重新启动 Redis 服务并从 AOF 重新加载,mem_fragmentation_ratio 会回到可接受的水平 (1.06):
~$ redis-cli info memory
# Memory
used_memory:7493466968
used_memory_human:6.98G
used_memory_rss:7924920320
used_memory_peak:8279112992
used_memory_peak_human:7.71G
used_memory_lua:91136
mem_fragmentation_ratio:1.06
mem_allocator:jemalloc-3.6.0
Run Code Online (Sandbox Code Playgroud)
回收 Redis 正在影响我们的应用程序(即使我们在从服务器重启后使用 Sentinel 故障转移来执行此操作)。
是否有另一种方法可以减少 mem_fragmentation_ratio,例如我可以安排非高峰期的“碎片整理”过程?
我有一台 Debian 5 服务器,它的流量很大。现在服务器有 4 GB 的 RAM,没有交换内存。我在上面看到 Apache 进程每个消耗大约 180 MB 的虚拟内存 (VIRT) 和 16 MB 的实际 RAM (RES)。那么我可以同时运行多少个 Apache 线程呢?大约 4 GB / 180 MB = 22 或 4 GB / 16 MB = 256?
的输出pmap:
Address Kbytes RSS Dirty Mode Mapping
00000000006b4000 60 16 16 rw--- [ anon ]
Run Code Online (Sandbox Code Playgroud)
它在说什么?
我最初将其发布在/sf/ask/676563261/但被建议在此处发布。
当脚本内存不足时,这不是正常的致命错误,因为它没有给出文件名、行号或使用的内存量。每当我尝试在命令行上运行 php 时,它只是说“内存不足”,无论是当您传递一个脚本还是只是单独运行 php 时。即使尝试运行一个不存在的脚本也会给出相同的消息。
换句话说,我得到了这个:
dan@server [~]# php
Out of memory
dan@server [~]# php test.php
Out of memory
dan@server [~]# php doesntexist.php
Out of memory
dan@server [~]# php -v
Out of memory
Run Code Online (Sandbox Code Playgroud)
然而,通过 Apache 的 PHP 工作得非常好。我只是在 CLI 上收到此错误。
有问题的机器正在运行 CentOS 版本 5.7(最终版),它是 64 位和 PHP 5.3.10。它是一个专用服务器。
我尝试按照建议运行 ulimit -a as dan,这是输出:
core file size (blocks, -c) 200000
data seg size (kbytes, -d) 200000
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) …Run Code Online (Sandbox Code Playgroud) 在我们的一台 Debian 服务器上对 LVM 进行压力测试时,我遇到了这个问题,即内存会被大量填满,导致服务器内存不足,但没有进程会占用内存。有关htop 中使用的颜色的说明,请参见http://i.imgur.com/cLn5ZHS.png,并参见https://serverfault.com/a/449102/125894。
为什么会这样?
有什么方法可以查看正在使用内存的进程吗?
htop 被配置为不隐藏任何进程,那么 htop 缺少什么?
在这种特殊情况下,我可以肯定地说它是由 lvmcreate、lvmremove 或 dmsetup 直接或间接引起的,因为我正在对其进行压力测试。请注意,这个问题不是关于解决 LVM 问题,而是关于为什么任何进程都没有声明内存。停止所有 LVM 命令确实会将内存降低到 <600MB。
的输出free -m:
total used free shared buffers cached
Mem: 32153 31958 194 0 52 3830
-/+ buffers/cache: 28075 4077
Swap: 975 0 975
Run Code Online (Sandbox Code Playgroud)
由于它的长度,顶部的输出,在 pastebin 上:http : //pastebin.com/WchrpF7W
为什么 free 命令报告的内存使用量与 cgroup 的内存使用量有很大不同?
$ free -b
total used free shared buff/cache available
Mem: 2096914432 520863744 1112170496 35389440 463880192 1356828672
Swap: 2145382400 0 2145382400
$ cat /sys/fs/cgroup/memory/memory.usage_in_bytes
857239552
Run Code Online (Sandbox Code Playgroud)
cgroups 的文档说 memory.usage_in_bytes 是一个“模糊值”。我猜这只是意味着它报告的估计值接近实际值。即使这是一个估计,我认为也不应该相差这么远。
我在 VirutalBox 虚拟机中运行 Linux Mint 18.2。
我正在运行一个没有交换的 Linux 工作站,并且我已经安装了earlyoom守护进程,以便在 RAM 不足时自动终止一些进程。它earlyoom通过监视内核MemAvailable值来工作,如果可用内存变得足够低,它会杀死不太重要的进程。
这已经工作了很长一段时间,但突然间我遇到了MemAvailable与系统其他部分相比突然非常低的情况。例如:
$ grep -E '^(MemTotal|MemFree|MemAvailable|Buffers|Cached):' /proc/meminfo
MemTotal: 32362500 kB
MemFree: 5983300 kB
MemAvailable: 2141000 kB
Buffers: 665208 kB
Cached: 4228632 kB
Run Code Online (Sandbox Code Playgroud)
请注意 MemAvailable 远低于MemFree+ Buffers+ Cached。
我可以运行任何工具来进一步调查为什么会发生这种情况吗?我觉得系统性能比正常情况要差一些,我不得不停止该服务,因为除非稳定(即它正确地描述了用户模式进程的可用内存),earlyoom否则它的逻辑将无法工作。MemAvailable
根据https://superuser.com/a/980821/100154 MemAvailable 是对可用于启动新应用程序(无需交换)的内存量的估计。由于我没有交换,这是什么意思?这是否意味着在触发 OOM Killer 之前新进程可以获取的内存量(因为这在逻辑上会遇到“交换已满”的情况)?
我曾假设MemAvailable>=MemFree总是正确的。不在这里。
附加信息:
在互联网上搜索表明,原因可能是打开的文件不受文件系统支持,因此无法从内存中释放。该命令sudo lsof | wc -l输出653100所以我绝对无法手动浏览该列表。
顶部sudo slabtop说
Active / Total Objects (% used) …Run Code Online (Sandbox Code Playgroud) 这是该命令在Nginx反向代理后面free运行Spring Boot应用程序的服务器上报告的内容:
$ free -h
total used free shared buff/cache available
Mem: 1.9Gi 893Mi 164Mi 29Mi 919Mi 883Mi
Swap: 511Mi 481Mi 30Mi
Run Code Online (Sandbox Code Playgroud)
我应该如何解释高交换使用率?这是否表明我应该将服务器升级到更高的内存容量(例如 4 GiB)?
$ vmstat 1 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 493428 150620 95476 879668 0 1 8 28 1 0 3 1 95 0 1
0 0 493428 …Run Code Online (Sandbox Code Playgroud) memory-usage ×10
linux ×6
memory ×3
apache-2.2 ×2
ubuntu ×2
centos ×1
cgroup ×1
debian ×1
debugging ×1
httpd ×1
kernel ×1
lamp ×1
lvm ×1
memory-leak ×1
monitoring ×1
oom ×1
php ×1
redis ×1