Skip to content

Operating System Tuning for Cassandra

Optimize your Linux operating system for Cassandra performance.

Disk I/O Settings

Scheduler

# Check current scheduler
cat /sys/block/sda/queue/scheduler

# Set to deadline or noop for SSDs
echo deadline > /sys/block/sda/queue/scheduler
# Or for NVMe
echo none > /sys/block/nvme0n1/queue/scheduler

Read-Ahead

# Set read-ahead (8KB for SSDs, 64KB for HDDs)
blockdev --setra 8 /dev/sda

# Verify
blockdev --getra /dev/sda

Persistent Configuration

# /etc/udev/rules.d/60-cassandra.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/scheduler}="deadline"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/read_ahead_kb}="8"
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"

Memory Settings

Swap

# Disable swap (recommended)
swapoff -a

# Or set swappiness to minimum
echo 0 > /proc/sys/vm/swappiness

# Persistent
echo "vm.swappiness = 0" >> /etc/sysctl.conf

Zone Reclaim

# Disable zone reclaim for NUMA
echo 0 > /proc/sys/vm/zone_reclaim_mode

Dirty Pages

# /etc/sysctl.conf
vm.dirty_background_ratio = 5
vm.dirty_ratio = 80

Network Tuning

TCP Settings

# /etc/sysctl.conf

# Increase socket buffer sizes
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 16777216
net.core.wmem_default = 16777216
net.core.optmem_max = 40960

# TCP buffers
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# Connection handling
net.core.netdev_max_backlog = 50000
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 30000

# Timeouts
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 60
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 10

Apply Changes

sysctl -p

File Descriptors

Limits

# /etc/security/limits.conf
cassandra soft nofile 100000
cassandra hard nofile 100000
cassandra soft nproc 32768
cassandra hard nproc 32768
cassandra soft memlock unlimited
cassandra hard memlock unlimited
cassandra soft as unlimited
cassandra hard as unlimited

Verify

# As cassandra user
ulimit -n   # File descriptors
ulimit -u   # Processes
ulimit -l   # Memory lock

Transparent Huge Pages

Disable THP - causes latency spikes with Cassandra.

# Check current status
cat /sys/kernel/mm/transparent_hugepage/enabled
cat /sys/kernel/mm/transparent_hugepage/defrag

# Disable
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

Persistent Disable

# /etc/rc.local or systemd service
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

CPU Settings

CPU Governor

# Set to performance
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
    echo performance > $cpu
done

# Verify
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

NUMA

# Verify NUMA topology
numactl --hardware

# Run Cassandra with NUMA awareness
numactl --interleave=all cassandra

Filesystem

# Mount options
/dev/sdb1 /var/lib/cassandra xfs defaults,noatime,nodiratime 0 2

ext4

# Mount options
/dev/sdb1 /var/lib/cassandra ext4 defaults,noatime,nodiratime,data=writeback,barrier=0,nobh 0 2

Complete Configuration Script

#!/bin/bash
# cassandra-os-tuning.sh

# Disable swap
swapoff -a

# Disable THP
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

# Set swappiness
sysctl -w vm.swappiness=0

# Disk scheduler (adjust device names)
echo deadline > /sys/block/sda/queue/scheduler

# Apply sysctl settings
sysctl -p

echo "OS tuning applied"

Next Steps