mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-18 18:14:38 +02:00
8170888: [linux] Experimental support for cgroup memory limits in container (ie Docker) environments
Set apparent physical memory to cgroup memory limit when UseCGroupMemoryLimitForHeap is true Reviewed-by: acorn, kbarrett
This commit is contained in:
parent
c9a8dbfa25
commit
6fd85f1084
2 changed files with 31 additions and 1 deletions
|
@ -2038,10 +2038,36 @@ julong Arguments::limit_by_allocatable_memory(julong limit) {
|
||||||
static const size_t DefaultHeapBaseMinAddress = HeapBaseMinAddress;
|
static const size_t DefaultHeapBaseMinAddress = HeapBaseMinAddress;
|
||||||
|
|
||||||
void Arguments::set_heap_size() {
|
void Arguments::set_heap_size() {
|
||||||
const julong phys_mem =
|
julong phys_mem =
|
||||||
FLAG_IS_DEFAULT(MaxRAM) ? MIN2(os::physical_memory(), (julong)MaxRAM)
|
FLAG_IS_DEFAULT(MaxRAM) ? MIN2(os::physical_memory(), (julong)MaxRAM)
|
||||||
: (julong)MaxRAM;
|
: (julong)MaxRAM;
|
||||||
|
|
||||||
|
// Experimental support for CGroup memory limits
|
||||||
|
if (UseCGroupMemoryLimitForHeap) {
|
||||||
|
// This is a rough indicator that a CGroup limit may be in force
|
||||||
|
// for this process
|
||||||
|
const char* lim_file = "/sys/fs/cgroup/memory/memory.limit_in_bytes";
|
||||||
|
FILE *fp = fopen(lim_file, "r");
|
||||||
|
if (fp != NULL) {
|
||||||
|
julong cgroup_max = 0;
|
||||||
|
int ret = fscanf(fp, JULONG_FORMAT, &cgroup_max);
|
||||||
|
if (ret == 1 && cgroup_max > 0) {
|
||||||
|
// If unlimited, cgroup_max will be a very large, but unspecified
|
||||||
|
// value, so use initial phys_mem as a limit
|
||||||
|
log_info(gc, heap)("Setting phys_mem to the min of cgroup limit ("
|
||||||
|
JULONG_FORMAT "MB) and initial phys_mem ("
|
||||||
|
JULONG_FORMAT "MB)", cgroup_max/M, phys_mem/M);
|
||||||
|
phys_mem = MIN2(cgroup_max, phys_mem);
|
||||||
|
} else {
|
||||||
|
warning("Unable to read/parse cgroup memory limit from %s: %s",
|
||||||
|
lim_file, errno != 0 ? strerror(errno) : "unknown error");
|
||||||
|
}
|
||||||
|
fclose(fp);
|
||||||
|
} else {
|
||||||
|
warning("Unable to open cgroup memory limit file %s (%s)", lim_file, strerror(errno));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// If the maximum heap size has not been set with -Xmx,
|
// If the maximum heap size has not been set with -Xmx,
|
||||||
// then set it as fraction of the size of physical memory,
|
// then set it as fraction of the size of physical memory,
|
||||||
// respecting the maximum and minimum sizes of the heap.
|
// respecting the maximum and minimum sizes of the heap.
|
||||||
|
|
|
@ -2037,6 +2037,10 @@ public:
|
||||||
"MaxRAM / MaxRAMFraction") \
|
"MaxRAM / MaxRAMFraction") \
|
||||||
range(0, max_uintx) \
|
range(0, max_uintx) \
|
||||||
\
|
\
|
||||||
|
experimental(bool, UseCGroupMemoryLimitForHeap, false, \
|
||||||
|
"Use CGroup memory limit as physical memory limit for heap " \
|
||||||
|
"sizing") \
|
||||||
|
\
|
||||||
product(uintx, MaxRAMFraction, 4, \
|
product(uintx, MaxRAMFraction, 4, \
|
||||||
"Maximum fraction (1/n) of real memory used for maximum heap " \
|
"Maximum fraction (1/n) of real memory used for maximum heap " \
|
||||||
"size") \
|
"size") \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue