The following study shows how to optimize the cost of a Kubernetes deployment considering also some JMV parameters in the optimization. Notice that, except for the JVM portion, the study is the same as the study in the example Optimizing a live K8s deployment.
name: Optimize Kubernetes Container + JVM
system: My Deployment + JVM
workflow: workflow
goal:
objective: minimize
function:
formula: cost_csv.cost
constraints:
absolute:
- name: adservice-response-time-slo
formula: adservice_istio.istio_incoming_response_time_90_ms <= 10
- name: adservice-restart-slo
formula: adservice_pod.k8s_pod_container_restarts:max == 0
- name: adservice-failures-slo
formula: adservice_istio.istio_incoming_failed_transactions / adservice_istio.istio_incoming_success_transactions <= 0.1
workloadsSelection:
- name: adservice_istio.istio_incoming_service_throughput
optimizerOptions:
onlineMode: RECOMMEND
experimentsWithBeta: 0
safetyFactor: 0.6
explorationFactor: 0.1
optimizerEngineVersion: 1.5.3rc5
windowing:
type: trim
trim: [1m, 0s]
task: Test
parametersSelection:
- name: adservice_jvm.jvm_inlineSmallCode
- name: adservice_jvm.jvm_maxInlineSize
domain: [1, 500]
- name: adservice_jvm.jvm_maxHeapFreeRatio
- name: adservice_jvm.jvm_minHeapFreeRatio
- name: adservice_jvm.jvm_gcType
- name: adservice_jvm.jvm_parallelGCThreads
domain: [1, 2]
- name: adservice_jvm.jvm_concurrentGCThreads
domain: [1, 2]
- name: adservice_jvm.jvm_maxTenuringThreshold
- name: adservice_jvm.jvm_compilationThreads
domain: [2, 4]
- name: adservice_jvm.jvm_newSize
domain: [16, 300]
- name: adservice_jvm.jvm_survivorRatio
- name: adservice_jvm.jvm_minHeapSize
domain: [16, 300]
- name: adservice_jvm.jvm_maxHeapSize
domain: [16, 300]
- name: adservice_jvm.jvm_alwaysPreTouch
- name: adservice_jvm.jvm_useTransparentHugePages
- name: adservice.cpu_request
domain: [10, 300]
- name: adservice.memory_request
domain: [64, 512]
parameterConstraints:
- name: concGC_below_parGC
formula: adservice_jvm.jvm_concurrentGCThreads <= adservice_jvm.jvm_parallelGCThreads
- name: newSize_10Of_maxHeap
formula: adservice_jvm.jvm_newSize >= 0.1 * adservice_jvm.jvm_maxHeapSize
- name: newSize_90Of_maxHeap
formula: adservice_jvm.jvm_newSize <= 0.9 * adservice_jvm.jvm_maxHeapSize
- name: minHeap_10Of_maxHeap
formula: adservice_jvm.jvm_minHeapSize >= 0.1 * adservice_jvm.jvm_maxHeapSize
- name: minHeap_below_maxHeap
formula: adservice_jvm.jvm_minHeapSize <= adservice_jvm.jvm_maxHeapSize
steps:
- name: baseline
type: baseline
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_gcType: "Parallel"
- name: in_domain_baseline
type: preset
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_gcType: "Parallel"
adservice_jvm.jvm_maxHeapSize: 96
adservice_jvm.jvm_minHeapSize: 16
adservice_jvm.jvm_inlineSmallCode: 2048
adservice_jvm.jvm_maxInlineSize: 35
adservice_jvm.jvm_maxHeapFreeRatio: 100
adservice_jvm.jvm_minHeapFreeRatio: 1
adservice_jvm.jvm_parallelGCThreads: 1
adservice_jvm.jvm_concurrentGCThreads: 1
adservice_jvm.jvm_maxTenuringThreshold: 15
adservice_jvm.jvm_compilationThreads: 2
adservice_jvm.jvm_newSize: 16
adservice_jvm.jvm_survivorRatio: 8
adservice_jvm.jvm_alwaysPreTouch: '-AlwaysPreTouch'
adservice_jvm.jvm_useTransparentHugePages: '-UseTransparentHugePages'
- name: optimize
type: optimize
numberOfTrials: 14
numberOfExperiments: 5
numberOfInitExperiments: 0
maxFailedExperiments: 1000
- name: serial_GC_pretouch_thp
type: preset
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_maxHeapSize: 96
adservice_jvm.jvm_minHeapSize: 16
adservice_jvm.jvm_inlineSmallCode: 2048
adservice_jvm.jvm_maxInlineSize: 35
adservice_jvm.jvm_maxHeapFreeRatio: 100
adservice_jvm.jvm_minHeapFreeRatio: 1
adservice_jvm.jvm_parallelGCThreads: 1
adservice_jvm.jvm_concurrentGCThreads: 1
adservice_jvm.jvm_maxTenuringThreshold: 15
adservice_jvm.jvm_compilationThreads: 2
adservice_jvm.jvm_newSize: 16
adservice_jvm.jvm_survivorRatio: 8
adservice_jvm.jvm_gcType: "Serial"
adservice_jvm.jvm_alwaysPreTouch: '+AlwaysPreTouch'
adservice_jvm.jvm_useTransparentHugePages: '+UseTransparentHugePages'
- name: optimize2
type: optimize
numberOfTrials: 14
numberOfExperiments: 5
numberOfInitExperiments: 0
maxFailedExperiments: 1000
- name: ConcMarkSweep_GC
type: preset
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_maxHeapSize: 96
adservice_jvm.jvm_minHeapSize: 16
adservice_jvm.jvm_inlineSmallCode: 2048
adservice_jvm.jvm_maxInlineSize: 35
adservice_jvm.jvm_maxHeapFreeRatio: 100
adservice_jvm.jvm_minHeapFreeRatio: 1
adservice_jvm.jvm_parallelGCThreads: 1
adservice_jvm.jvm_concurrentGCThreads: 1
adservice_jvm.jvm_maxTenuringThreshold: 15
adservice_jvm.jvm_compilationThreads: 2
adservice_jvm.jvm_newSize: 16
adservice_jvm.jvm_survivorRatio: 8
adservice_jvm.jvm_gcType: "ConcMarkSweep"
adservice_jvm.jvm_alwaysPreTouch: '+AlwaysPreTouch'
adservice_jvm.jvm_useTransparentHugePages: '+UseTransparentHugePages'
- name: optimize3
type: optimize
numberOfTrials: 14
numberOfExperiments: 5
numberOfInitExperiments: 0
maxFailedExperiments: 1000
- name: G1_GC
type: preset
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_maxHeapSize: 96
adservice_jvm.jvm_minHeapSize: 16
adservice_jvm.jvm_inlineSmallCode: 2048
adservice_jvm.jvm_maxInlineSize: 35
adservice_jvm.jvm_maxHeapFreeRatio: 100
adservice_jvm.jvm_minHeapFreeRatio: 1
adservice_jvm.jvm_parallelGCThreads: 1
adservice_jvm.jvm_concurrentGCThreads: 1
adservice_jvm.jvm_maxTenuringThreshold: 15
adservice_jvm.jvm_compilationThreads: 2
adservice_jvm.jvm_newSize: 16
adservice_jvm.jvm_survivorRatio: 8
adservice_jvm.jvm_gcType: "G1"
adservice_jvm.jvm_alwaysPreTouch: '+AlwaysPreTouch'
adservice_jvm.jvm_useTransparentHugePages: '+UseTransparentHugePages'
- name: optimize4
type: optimize
numberOfTrials: 14
numberOfExperiments: 5
numberOfInitExperiments: 0
maxFailedExperiments: 1000
- name: ParNew_GC
type: preset
numberOfTrials: 14
values:
adservice.cpu_request: 300
adservice.memory_request: 200
adservice_jvm.jvm_maxHeapSize: 96
adservice_jvm.jvm_minHeapSize: 16
adservice_jvm.jvm_inlineSmallCode: 2048
adservice_jvm.jvm_maxInlineSize: 35
adservice_jvm.jvm_maxHeapFreeRatio: 100
adservice_jvm.jvm_minHeapFreeRatio: 1
adservice_jvm.jvm_parallelGCThreads: 1
adservice_jvm.jvm_concurrentGCThreads: 1
adservice_jvm.jvm_maxTenuringThreshold: 15
adservice_jvm.jvm_compilationThreads: 2
adservice_jvm.jvm_newSize: 16
adservice_jvm.jvm_survivorRatio: 8
adservice_jvm.jvm_gcType: "ParNew"
adservice_jvm.jvm_alwaysPreTouch: '+AlwaysPreTouch'
adservice_jvm.jvm_useTransparentHugePages: '+UseTransparentHugePages'
- name: optimize5
type: optimize
numberOfTrials: 14
numberOfExperiments: 1000
numberOfInitExperiments: 0
maxFailedExperiments: 1000
Note that in this study a present step has been specified with the specific value (category) of categorical parameters, as otherwise, the optimizer would only consider a category that has already been seen in the configurations history. For more details, please refer to the Optimize step page of the reference guide.