# 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](https://docs.akamas.io/akamas-docs/3.1.2/knowledge-base/optimizing-a-live-k8s-deployment).

{% code lineNumbers="true" %}

```yaml
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
```

{% endcode %}

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](https://docs.akamas.io/akamas-docs/3.1.2/akamas-reference/construct-templates/study-template/steps/optimize-step) page of the reference guide.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.akamas.io/akamas-docs/3.1.2/knowledge-base/optimizing-a-live-full-stack-deployment-k8s-+-jvm.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
