ScyllaDB University Live | Free Virtual Training Event
Learn more
ScyllaDB Documentation Logo Documentation
  • Deployments
    • Cloud
    • Server
  • Tools
    • ScyllaDB Manager
    • ScyllaDB Monitoring Stack
    • ScyllaDB Operator
  • Drivers
    • CQL Drivers
    • DynamoDB Drivers
    • Supported Driver Versions
  • Resources
    • ScyllaDB University
    • Community Forum
    • Tutorials
Install
Search Ask AI
ScyllaDB Docs ScyllaDB Operator Deploy ScyllaDB Before you deploy Configure CPU pinning

Configure CPU pinning¶

CPU pinning ensures that ScyllaDB threads are bound to specific CPU cores, eliminating context-switch overhead and improving tail latency.

Why CPU pinning matters¶

ScyllaDB is a shard-per-core database — it assigns each CPU core a dedicated share of data and I/O. When the kernel schedules other processes or handles interrupts on those same cores, it disrupts ScyllaDB’s per-core processing and causes latency spikes. CPU pinning ensures:

  • The kubelet assigns exclusive CPU cores to the ScyllaDB container.

  • The perftune.py tuning script configures IRQ affinity so that network and disk interrupts are handled by CPUs not assigned to ScyllaDB.

  • ScyllaDB starts with --overprovisioned=0, telling it to assume dedicated cores and optimize accordingly.

Prerequisites¶

CPU pinning requires three things to work together:

Requirement

Who configures it

Kubelet static CPU manager policy

Platform administrator (node pool configuration)

Guaranteed QoS class on the ScyllaDB Pod

ScyllaCluster author

Performance tuning enabled in NodeConfig

NodeConfig author (enabled by default)

If any of these is missing, CPU pinning silently does not apply.

Enable the static CPU manager policy¶

The kubelet on each dedicated ScyllaDB node must be started with cpuManagerPolicy: static. This tells the kubelet to assign exclusive CPUs to containers that request integer CPU amounts in Pods with Guaranteed QoS class.

How you configure this depends on your platform:

Pass a systemconfig.yaml file when creating the node pool:

cat > systemconfig.yaml <<EOF
kubeletConfig:
  cpuManagerPolicy: static
EOF
gcloud container node-pools create scylladb-pool \
  --system-config-from-file='systemconfig.yaml' \
  ...

See the GKE cluster setup guide for a complete example.

Set kubeletExtraConfig in the eksctl cluster configuration:

nodeGroups:
- name: scylla-pool
  kubeletExtraConfig:
    cpuManagerPolicy: static

See the EKS cluster setup guide for a complete example.

Use a Cloud-Init script that writes a kubelet configuration override before the node joins the cluster. The OKE cluster setup guide applies this automatically.

Create a KubeletConfig resource targeting the MachineConfigPool dedicated to your ScyllaDB nodes. See Setting up CPU Manager in the Red Hat OpenShift documentation for detailed steps.

Warning

Changing the CPU manager policy on a running node requires draining the node, stopping the kubelet, removing the CPU manager state file (/var/lib/kubelet/cpu_manager_state), and restarting the kubelet. It is much simpler to set the policy at node creation time.

Set the Guaranteed QoS class¶

A Pod receives Guaranteed QoS class when every container has CPU and memory requests equal to its limits. For ScyllaDB Pods, this means both the ScyllaDB container (resources) and the ScyllaDB Manager Agent sidecar (agentResources) must have matching requests and limits.

Caution

The default agentResources has only requests (50m CPU, 10Mi memory) and no limits. If you set resources with matching requests and limits but forget to also set agentResources limits, the Pod will be Burstable QoS and CPU pinning will silently not work.

Example:

spec:
  datacenter:
    racks:
    - name: us-east-1a
      resources:
        requests:
          cpu: 4
          memory: 32Gi
        limits:
          cpu: 4
          memory: 32Gi
      agentResources:
        requests:
          cpu: 50m
          memory: 10Mi
        limits:
          cpu: 50m
          memory: 10Mi

Note

Use integer CPU values (e.g., 4, not 4000m) for the ScyllaDB container. The kubelet only assigns exclusive cores for integer CPU requests. Millicpu values result in a shared CPU pool.

Verify¶

To verify CPU pinning is active and troubleshoot common issues, see Troubleshoot performance.

Was this page helpful?

PREVIOUS
Set up dedicated node pools
NEXT
Configure nodes
  • Create an issue
  • Edit this page

On this page

  • Configure CPU pinning
    • Why CPU pinning matters
    • Prerequisites
    • Enable the static CPU manager policy
    • Set the Guaranteed QoS class
    • Verify
ScyllaDB Operator
Search Ask AI
  • v1.21
    • master
    • v1.21
    • v1.20
    • v1.19
    • v1.18
  • Get Started
    • What Is ScyllaDB Operator?
    • ScyllaDB Concepts on Kubernetes
  • Install Operator
    • Provision infrastructure
      • Set up a GKE cluster for ScyllaDB
      • Set up an EKS cluster for ScyllaDB
      • Set up an OKE cluster for ScyllaDB
      • Set up an OpenShift cluster for ScyllaDB
    • Install with GitOps
    • Install with Helm
    • Install on OpenShift
  • Deploy ScyllaDB
    • Before you deploy
      • Set up dedicated node pools
      • Configure CPU pinning
      • Configure nodes
      • Configure ScyllaDB Operator
    • Deploy your first cluster
    • Reference deployments
      • Reference deployment: GKE
      • Reference deployment: EKS
      • Reference deployment: OKE
      • Reference deployment: OpenShift
    • Install ScyllaDB Manager
    • Set up networking
      • Configure external access
      • IPv6 networking
        • Getting started with IPv6 networking
        • Configure dual-stack networking
        • Configure IPv6-only networking
        • Migrate clusters to IPv6
        • Troubleshoot IPv6 networking issues
        • IPv6 networking concepts
    • Set up monitoring
      • Set up ScyllaDB Monitoring
      • Set up ScyllaDB Monitoring on OpenShift
      • Expose Grafana
    • Production checklist
  • Connect Your App
    • Connect via CQL
    • Alternator (DynamoDB API)
    • Discovery endpoint
  • Understand
    • Storage
    • Tuning
    • ScyllaDB Manager
    • Networking
    • ScyllaDB Monitoring overview
    • Bootstrap synchronisation
    • Automatic data cleanup
    • Sidecar and pod anatomy
    • Ignition
    • Pod disruption budgets
    • Security
    • StatefulSets and racks
  • Operate
    • Scale, add, remove racks
    • Replace nodes
    • Expand storage volumes
    • Use maintenance mode
    • Back up and restore
    • Restore from backup
    • Perform a rolling restart
    • Migrate a rack to a new node pool
    • Pass additional ScyllaDB arguments
    • Configure precomputed IO properties
  • Upgrade
    • Upgrading ScyllaDB Operator
    • Upgrading ScyllaDB clusters
  • Troubleshoot
    • Investigate pod restarts
    • Change log level on a live cluster
    • Recover from a failed node replace
    • Troubleshoot performance
    • Collect debugging information
      • Collect data with must-gather
      • must-gather contents
      • Query system tables for debugging
    • Collect core dumps
  • Reference
    • API Reference
      • scylla.scylladb.com
        • NodeConfig (scylla.scylladb.com/v1alpha1)
        • RemoteKubernetesCluster (scylla.scylladb.com/v1alpha1)
        • RemoteOwner (scylla.scylladb.com/v1alpha1)
        • ScyllaCluster (scylla.scylladb.com/v1)
        • ScyllaDBCluster (scylla.scylladb.com/v1alpha1)
        • ScyllaDBDatacenterNodesStatusReport (scylla.scylladb.com/v1alpha1)
        • ScyllaDBDatacenter (scylla.scylladb.com/v1alpha1)
        • ScyllaDBManagerClusterRegistration (scylla.scylladb.com/v1alpha1)
        • ScyllaDBManagerTask (scylla.scylladb.com/v1alpha1)
        • ScyllaDBMonitoring (scylla.scylladb.com/v1alpha1)
        • ScyllaOperatorConfig (scylla.scylladb.com/v1alpha1)
    • Feature gates
    • IPv6 configuration reference
    • Releases
    • Known issues
    • Conditions reference
    • nodetool alternatives
  • Contributing to ScyllaDB Operator
Docs Tutorials University Contact Us About Us
© 2026, ScyllaDB. All rights reserved. | Terms of Service | Privacy Policy | ScyllaDB, and ScyllaDB Cloud, are registered trademarks of ScyllaDB, Inc.
Last updated on 22 May 2026.
Powered by Sphinx 9.1.0 & ScyllaDB Theme 1.9.2