Pod JVM memory stress
Last updated on
Pod JVM memory stress injects JVM memory stress for a Java process executing in a Kubernetes pod by consuming excessive memory resources of the JVM. This sometimes results in an OOM kill (Out-of-memory).
tip
JVM chaos faults use the Byteman utility to inject chaos faults into the JVM.
Use cases
Pod JVM memory stress:
- Tests the system's ability to handle high payloads.
- Evaluates the application's behavior in high-stress cases.
- Induces memory consumption and exhaustion on the target Java process JVM executing in a K8s pod.
- Simulates a lack of memory for processes running on the application, which degrades their performance.
- Simulates application slowness due to memory starvation, and noisy neighbour problems due to excessive consumption of memory.
Permissions required
Below is a sample Kubernetes role that defines the permissions required to execute the fault.
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: hce
name: pod-jvm-memory-stress
spec:
definition:
scope: Namespaced
permissions:
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "delete", "get", "list", "patch", "deletecollection", "update"]
- apiGroups: [""]
resources: ["events"]
verbs: ["create", "get", "list", "patch", "update"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["deployments", "statefulsets"]
verbs: ["get", "list"]
- apiGroups: ["batch"]
resources: ["jobs"]
verbs: ["create", "delete", "get", "list", "deletecollection"]
Java requirements
This fault requires the following Java-specific prerequisites:
- The Java process must allow agent attachment (Attach API must be available).
- Utilities like
ps,pgrep, andbashmust be available in the target container. - File permissions must allow the JVM to read and execute agent files.
- Agent attachment must not be restricted by user or security context configurations.
- The target container image must not use a restricted/minimal Java runtime that removes attach-related modules.
Supported environments
| Platform | Support Status |
|---|---|
| GKE (Google Kubernetes Engine) | ✅ Supported |
| EKS (Amazon Elastic Kubernetes Service) | ✅ Supported |
| AKS (Azure Kubernetes Service) | ✅ Supported |
| GKE Autopilot | ✅ Supported |
| Self-managed Kubernetes | ✅ Supported |
Optional tunables
| Tunable | Description | Notes |
|---|---|---|
| MEMORY_TYPE | The type of JVM memory region to stress. | Default: heap. Choose between heap and stack. |
| TOTAL_CHAOS_DURATION | Duration through which chaos is injected into the target resource. Should be provided in [numeric-hours]h[numeric-minutes]m[numeric-seconds]s format. | Default: 30s. Examples: 1m25s, 1h3m2s, 1h3s. For more information, go to duration of the chaos. |
| POD_AFFECTED_PERCENTAGE | Percentage of total pods to target. Provide numeric values. | Default: 0 (corresponds to 1 replica). For more information, go to pods affected percentage |
| JAVA_HOME | Path to the Java installation directory. | For example, /tmp/dir/jdk. |
| BYTEMAN_PORT | Port used by the Byteman agent. | Default: 9091. |
| CONTAINER_RUNTIME | Container runtime interface for the cluster | Default: containerd. Support values: docker, containerd and crio. For more information, go to container runtime. |
| SOCKET_PATH | Path of the containerd or crio or docker socket file. | Default: /run/containerd/containerd.sock. For more information, go to socket path. |
| RAMP_TIME | Period to wait before and after injecting chaos. Should be provided in [numeric-hours]h[numeric-minutes]m[numeric-seconds]s format. | Default: 0s. Examples: 1m25s, 1h3m2s, 1h3s. For more information, go to ramp time. |
| SEQUENCE | Sequence of chaos execution for multiple target pods. | Default: parallel. Supports serial and parallel. For more information, go to sequence of chaos execution. |
| TARGET_CONTAINER | Name of the target container subject to chaos. | None. For more information, go to target specific container |
| TARGET_PODS | Comma-separated list of application pod names subject to pod JVM memory stress. | If not provided, the fault selects target pods randomly based on provided appLabels. For more information, go to target specific pods. |
| NODE_LABEL | Node label used to filter the target node if TARGET_NODE environment variable is not set. | It is mutually exclusive with the TARGET_NODE environment variable. If both are provided, the fault uses TARGET_NODE. For more information, go to node label. |
| LIB_IMAGE | Image used to inject chaos. | Default: harness/chaos-go-runner:main-latest. For more information, go to image used by the helper pod. |
Memory type
The type of memory that is consumed in excess by the JVM; choose between heap and stack memory.
The following YAML snippet illustrates the use of this input variable.
apiVersion: litmuschaos.io/v1alpha1
kind: KubernetesChaosExperiment
metadata:
name: pod-jvm-memory-stress
namespace: hce
spec:
tasks:
- definition:
chaos:
env:
# type of memory to stress: heap or stack
- name: MEMORY_TYPE
value: "heap"
- name: TOTAL_CHAOS_DURATION
value: "60"
Parameters
The following YAML snippet illustrates the use of these tunables.
apiVersion: litmuschaos.io/v1alpha1
kind: KubernetesChaosExperiment
metadata:
name: pod-jvm-memory-stress
namespace: hce
spec:
tasks:
- definition:
chaos:
env:
- name: TOTAL_CHAOS_DURATION
value: "60"
- name: POD_AFFECTED_PERCENTAGE
value: ""
- name: BYTEMAN_PORT
value: "9091"
- name: JAVA_HOME
value: ""
- name: MEMORY_TYPE
value: "heap"
- name: CONTAINER_RUNTIME
value: containerd
- name: SOCKET_PATH
value: /run/containerd/containerd.sock
- name: LIB_IMAGE
value: docker.io/harness/chaos-ddcr-faults:1.49.2
- name: RAMP_TIME
value: ""
- name: SEQUENCE
value: parallel
- name: TARGET_CONTAINER
value: ""
- name: TARGET_PODS
value: ""
- name: NODE_LABEL
value: ""