From 9a14699ef22e89866f04093e849e875665e684ac Mon Sep 17 00:00:00 2001 From: Chuansheng Lu Date: Tue, 31 Mar 2020 23:21:52 +0800 Subject: [PATCH] [MultiTenant] Added -XX:+TenantCpuThrottling -XX:+TenantCpuAccounting Summary: added two new options to support tenant cpu controlling Test Plan: jdk/test/multi-tenant Reviewed-by: yuleil, superajun-wsj Issue: https://github.com/alibaba/dragonwell8/issues/84 --- src/share/vm/classfile/vmSymbols.hpp | 1 + src/share/vm/prims/tenantenv.cpp | 10 ++++++++++ src/share/vm/runtime/globals_ext.hpp | 8 +++++++- src/share/vm/runtime/thread.cpp | 16 ++++++++++++++++ 4 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/share/vm/classfile/vmSymbols.hpp b/src/share/vm/classfile/vmSymbols.hpp index c69898f24..b6a7e0d6c 100644 --- a/src/share/vm/classfile/vmSymbols.hpp +++ b/src/share/vm/classfile/vmSymbols.hpp @@ -351,6 +351,7 @@ template(type_name, "type") \ template(findNative_name, "findNative") \ template(initializeTenantContainerClass_name, "initializeTenantContainerClass") \ + template(initializeJGroupClass_name, "initializeJGroupClass") \ template(deadChild_name, "deadChild") \ template(addClass_name, "addClass") \ template(throwIllegalAccessError_name, "throwIllegalAccessError") \ diff --git a/src/share/vm/prims/tenantenv.cpp b/src/share/vm/prims/tenantenv.cpp index ffa7802f1..fa8b10ce2 100644 --- a/src/share/vm/prims/tenantenv.cpp +++ b/src/share/vm/prims/tenantenv.cpp @@ -29,6 +29,8 @@ #define TENANT_FLAG_MULTI_TENANT_ENABLED (0x1) // bit 0 to indicate if the tenant feature is enabled. #define TENANT_FLAG_HEAP_THROTTLING_ENABLED (0x2) // bit 1 to indicate if heap throttling feature is enabled. +#define TENANT_FLAG_CPU_THROTTLING_ENABLED (0x4) // bit 2 to indicate if cpu throttling feature is enabled. +#define TENANT_FLAG_CPU_ACCOUNTING_ENABLED (0x40) // bit 6 to indicate if cpu accounting feature is enabled. #define TENANT_FLAG_HEAP_ISOLATION_ENABLED (0x80) // bit 7 to indicate if heap isolation feature is enabled. static jint tenant_GetTenantFlags(TenantEnv *env, jclass cls); @@ -59,5 +61,13 @@ tenant_GetTenantFlags(TenantEnv *env, jclass cls) result |= TENANT_FLAG_HEAP_ISOLATION_ENABLED; } + if (TenantCpuThrottling) { + result |= TENANT_FLAG_CPU_THROTTLING_ENABLED; + } + + if (TenantCpuAccounting) { + result |= TENANT_FLAG_CPU_ACCOUNTING_ENABLED; + } + return result; } diff --git a/src/share/vm/runtime/globals_ext.hpp b/src/share/vm/runtime/globals_ext.hpp index 6d49fd628..a9deb712a 100644 --- a/src/share/vm/runtime/globals_ext.hpp +++ b/src/share/vm/runtime/globals_ext.hpp @@ -104,7 +104,13 @@ "Mutator may maintain multiple TLABs for each of the tenants") \ \ product(bool, TenantHeapThrottling, false, \ - "Enable heap throttling per tenant") \ + "Enable heap throttling per tenant") \ + \ + product(bool, TenantCpuThrottling, false, \ + "Enable cpu throttling per tenant") \ + \ + product(bool, TenantCpuAccounting, false, \ + "Enable cpu accounting per tenant") \ //add new AJVM specific flags here diff --git a/src/share/vm/runtime/thread.cpp b/src/share/vm/runtime/thread.cpp index 5a3389475..1b5f4473b 100644 --- a/src/share/vm/runtime/thread.cpp +++ b/src/share/vm/runtime/thread.cpp @@ -1078,6 +1078,16 @@ static void call_initializeTenantContainerClass(TRAPS) { vmSymbols::void_method_signature(), CHECK); } +static void call_initializeJGroupClass(TRAPS) { + assert(TenantCpuThrottling || TenantCpuAccounting, "TenantCpuThrottling or TenantCpuAccounting disabled"); + Klass* k = SystemDictionary::resolve_or_fail(vmSymbols::com_alibaba_tenant_JGroup(), true, CHECK); + instanceKlassHandle klass (THREAD, k); + + JavaValue result(T_VOID); + JavaCalls::call_static(&result, klass, vmSymbols::initializeJGroupClass_name(), + vmSymbols::void_method_signature(), CHECK); +} + char java_runtime_name[128] = ""; char java_runtime_version[128] = ""; @@ -3964,6 +3974,12 @@ jint Threads::create_vm(JavaVMInitArgs* args, bool* canTryAgain) { } } + if (MultiTenant && (TenantCpuThrottling || TenantCpuAccounting)) { + // JGroup initialization may involve complex steps + // have to do that after full JVM initialization + call_initializeJGroupClass(CHECK_0); + } + create_vm_timer.end(); #ifdef ASSERT _vm_complete = true; -- GitLab