- 你的经验是什么?你能证实我的实验结果吗?
- 我通常可以使用
total RAM - 600 MB
,或0.4 * total RAM
吗? - 还是总是不断反复试验,并希望它足够低?
背景:我正在尝试在 T3 实例上设置 jenkins,并尝试使用 Ubuntu Server 16.04 和 18.04。
我从一个t3.micro
实例(1 GB RAM)开始,但发现只要使用超过 ,OOM 终止程序就会终止我的 java 进程,-Xmx400m
这似乎有点低。我原本希望能够使用更多,例如-Xmx750m
。
这是否意味着 Ubuntu Server 需要大约 600 MB 才能运行?
问题是,即使我将 -Xms 和 -Xmx 都设置为非常高的值(例如),java 进程也会启动。700m
只有当我向网站发出第一个请求时,该进程才会被终止。
我现在尝试一个t3.small
实例(2 GB RAM),但仍然不确定要配置什么。
在 Windows 上,它有点确定性:我将-Xms
和设置-Xmx
为相同的值。如果服务无法启动,则该值太高。如果服务成功启动,则该值没问题,并且内存已为我的进程保留。
背景信息:
- https://plumbr.io/blog/memory-leaks/why-does-my-java-process-consume-more-memory-than-xmx
- https://support.cloudbees.com/hc/en-us/articles/115002718531-Memory-Problem-Process-killed-by-OOM-Killer
- 避免 Linux 内存不足导致应用程序崩溃
- 配置 vm.overcommit_memory 的效果
- PostgreSQL 似乎也有类似的问题:https://dba.stackexchange.com/questions/170596/permanently-disable-oom-killer-for-postgres(和https://www.postgresql.org/docs/current/kernel-resources.html#LINUX-MEMORY-OVERCOMMIT)
答案1
如果您想在资源有限的环境中在 Linux 上运行任何应用程序,则应确保了解 Linux 上的内存实际工作方式。听起来很刺耳,但这确实是了解幕后情况的唯一方法。
如果 OOM 终止程序被触发,则意味着您首先耗尽了内存。如果在 -Xmx400 的情况下发生这种情况,那么这是该特定应用程序在特定环境中执行其特定操作的限制。
在您考虑将 vm.overcommit_memory 设置为非默认值之前,请确保您真正了解分配和使用内存之间的区别(就 Linux 虚拟内存系统而言)。否则,您将永远无法有效地使用系统的内存。
话虽如此,但默认值通常适用于 80%-90% 的使用情况。对于 Jenkins,内核中的默认值实际上应该相当好用。您将希望内核过度使用可用内存(这是默认值),并在实际用完时触发 OOM(也是默认值)。
如果这不适用于您可用的内存,您将需要更多内存。此外,设置应用程序不需要的较大 -Xmx 值也被认为是有害的,但您问的是 Linux 内存,而不是 Java 内存 :)