我有一个在 Linux 服务器上运行的 Java 应用程序,其物理内存(RAM)分配为 12GB,我会看到一段时间内的正常使用情况,如下所示。
sys> free -h
total used free shared buff/cache available
Mem: 11G 7.8G 1.6G 9.0M 2.2G 3.5G
Swap: 0B 0B 0B
最近,在增加应用程序的负载时,我发现 RAM 利用率几乎已满,可用空间非常少,我可能会遇到一些速度缓慢的情况,但应用程序仍然可以正常工作。
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 134M 17M 411M 240M
Swap: 0B 0B 0B
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 145M 25M 373M 204M
Swap: 0B 0B 0B
我提到https://www.linuxatemyram.com/其中提出了以下观点。
警告标志您可能需要调查的真正内存不足情况:
- 可用内存(或“空闲内存 + 缓冲区/缓存”)接近于零
- 使用的掉期增加或波动。
- dmesg | grep oom-killer 显示 OutOfMemory-killer 正在工作
从以上几点来看,我没有看到应用程序级别的任何 OOM 问题,交换也已禁用。因此忽略了这两点。有一点让我感到困扰,那就是可用内存小于零,我需要澄清一下
问题:
- 如果可用性接近于 0,是否会导致系统崩溃?
- 当可用内存变少时,是否意味着我需要升级 RAM?
- 应基于什么来分配/增加 RAM 内存?
- 对于 RAM 内存分配,我们是否有任何需要遵循的官方建议/指南?
答案1
能够得到我的一个问题的答案
如果可用性接近于 0,是否会导致系统崩溃?
在我的其中一台服务器上进行测试时,我加载的内存几乎已满,如下所示
sys> free -h
total used free shared buff/cache available
Mem: 11G 11G 135M 25M 187M 45M
Swap: 0B 0B 0B
能够看到我的应用程序(消耗更多内存)被内存不足杀手杀死,可以在内核日志中参考
dmesg-e 命令
[355623.918401] [21805] 553000 21805 69 21 2 0 0 rm
[355623.921381] Out of memory: Kill process 11465 (java) score 205 or sacrifice child
[355623.925379] Killed process 11465 (java), UID 553000, total-vm:6372028kB, anon-rss:2485580kB, file-rss:0kB, shmem-rss:0kB
https://www.kernel.org/doc/gorman/html/understand/understand016.html
内存不足杀手或 OOM 杀手是 Linux 内核在系统内存严重不足时使用的一个进程。这种情况发生的原因是 Linux 内核为其进程分配了过多的内存。... 这意味着正在运行的进程需要的内存多于物理可用内存。