Optimizing a live full-stack deployment (K8s + JVM)

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 this study includes a preset step with a specific value (category) of categorical parameters, since otherwise, the optimizer would only consider a category that has already been seen in the configuration history. For more details, please refer to the Optimize step page of the reference guide.

Last updated