| name | performance-tuning |
| description | Optimize Linux system performance. Configure kernel parameters, analyze bottlenecks, and tune resources. Use when improving system performance. |
| license | MIT |
| metadata | {"author":"devops-skills","version":"1.0"} |
Performance Tuning
Optimize Linux system performance through kernel parameter tuning, I/O scheduler selection, memory management, CPU governor configuration, and benchmarking. Covers methodology, real sysctl settings, and tool-based validation.
When to Use
- Server experiencing high latency, throughput bottlenecks, or resource exhaustion
- Preparing infrastructure for high-traffic events or load tests
- Tuning a database server, web server, or application host for production
- Diagnosing whether a bottleneck is CPU, memory, disk I/O, or network
- Establishing baseline performance metrics before and after changes
- Configuring kernel parameters for containers, VMs, or bare-metal hosts
Prerequisites
- Root or sudo access on the target system
sysstat package installed (provides sar, iostat, mpstat)
linux-tools or perf package for CPU profiling
- Benchmarking tools:
fio (disk), sysbench (CPU/memory), iperf3 (network)
- Baseline metrics collected before making any changes
Performance Analysis Methodology
Always follow this order:
- Collect baseline -- measure current performance with tools
- Identify bottleneck -- determine if CPU, memory, I/O, or network
- Change one parameter -- apply a single tuning change
- Measure impact -- re-run the same benchmark
- Document -- record the change and its effect
- Iterate or revert -- keep the change if beneficial, revert if not
System Monitoring Tools
top
htop
mpstat -P ALL 2
pidstat -u 2
free -h
vmstat 2
iostat -xz 2
iotop -oP
sar -n DEV 2
ss -s
nstat
perf top
perf stat -a sleep 10
perf record -g -a sleep 30
perf report
echo "=== CPU ===" && mpstat 1 1 && echo "=== MEM ===" && free -h && echo "=== DISK ===" && iostat -x 1 1 && echo "=== NET ===" && ss -s
Sysctl Kernel Parameter Tuning
Network Tuning
net.core.rmem_max = 134217728
net.core.wmem_max = 134217728
net.core.rmem_default = 1048576
net.core.wmem_default = 1048576
net.ipv4.tcp_rmem = 4096 1048576 134217728
net.ipv4.tcp_wmem = 4096 1048576 134217728
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_fastopen = 3
net.ipv4.tcp_tw_reuse = 1
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_keepalive_time = 120
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_slow_start_after_idle = 0
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
Memory Tuning
vm.swappiness = 10
vm.dirty_ratio = 20
vm.dirty_background_ratio = 5
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 1024
fs.file-max = 2097152
vm.overcommit_memory = 0
Applying Sysctl Changes
sysctl --system
sysctl -p /etc/sysctl.d/60-network-performance.conf
sysctl -w vm.swappiness=10
sysctl vm.swappiness
sysctl net.ipv4.tcp_congestion_control
I/O Scheduler Configuration
cat /sys/block/sda/queue/scheduler
echo mq-deadline > /sys/block/sda/queue/scheduler
echo none > /sys/block/nvme0n1/queue/scheduler
echo bfq > /sys/block/sda/queue/scheduler
cat <<'EOF' > /etc/udev/rules.d/60-io-scheduler.rules
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
ACTION=="add|change", KERNEL=="nvme[0-9]*", ATTR{queue/scheduler}="none"
EOF
udevadm control --reload-rules
blockdev --setrahead 4096 /dev/sda
systemctl enable --now fstrim.timer
fstrim -av
CPU Governor Configuration
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
for cpu in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do
echo performance > "$cpu"
done
cpupower frequency-set -g performance
cat <<'EOF' > /etc/systemd/system/cpu-governor.service
[Unit]
Description=Set CPU governor to performance
[Service]
Type=oneshot
ExecStart=/usr/bin/cpupower frequency-set -g performance
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl enable --now cpu-governor
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
Benchmarking Tools
fio -- Disk I/O Benchmarking
apt install -y fio
dnf install -y fio
fio --name=seq-read --ioengine=libaio --direct=1 --rw=read \
--bs=1M --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting
fio --name=seq-write --ioengine=libaio --direct=1 --rw=write \
--bs=1M --numjobs=4 --size=1G --runtime=60 --time_based --group_reporting
fio --name=rand-read --ioengine=libaio --direct=1 --rw=randread \
--bs=4k --numjobs=16 --iodepth=64 --size=1G --runtime=60 --time_based --group_reporting
fio --name=rand-write --ioengine=libaio --direct=1 --rw=randwrite \
--bs=4k --numjobs=16 --iodepth=64 --size=1G --runtime=60 --time_based --group_reporting
fio --name=mixed --ioengine=libaio --direct=1 --rw=randrw --rwmixread=70 \
--bs=4k --numjobs=8 --iodepth=32 --size=1G --runtime=60 --time_based --group_reporting
sysbench -- CPU and Memory Benchmarking
sysbench cpu --threads=4 --time=30 run
sysbench memory --threads=4 --time=30 --memory-block-size=1K --memory-total-size=100G run
iperf3 -- Network Benchmarking
apt install -y iperf3
iperf3 -s
iperf3 -c <server-ip> -t 30 -P 4
iperf3 -c <server-ip> -u -b 1G -t 30
iperf3 -c <server-ip> -R -t 30
Quick-Reference Tuning Profiles
Web Server (nginx/Apache)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fastopen = 3
net.ipv4.ip_local_port_range = 1024 65535
net.core.default_qdisc = fq
net.ipv4.tcp_congestion_control = bbr
fs.file-max = 2097152
vm.swappiness = 10
Database Server (PostgreSQL/MySQL)
vm.swappiness = 1
vm.dirty_ratio = 15
vm.dirty_background_ratio = 3
vm.overcommit_memory = 2
vm.overcommit_ratio = 80
net.core.somaxconn = 4096
fs.file-max = 2097152
Troubleshooting
| Symptom | Diagnostic Command | Common Fix |
|---|
| High CPU, no obvious process | perf top, mpstat -P ALL 2 | Check for kernel-level issues: softirqs, interrupts |
| High load avg, low CPU usage | vmstat 2 (check b column) | I/O bottleneck: tune scheduler, check disk health |
| System swapping heavily | free -h, vmstat 2 (check si/so) | Reduce vm.swappiness, add RAM, find memory leak |
| Disk latency spikes | iostat -x 2 (check await) | Switch I/O scheduler, reduce dirty ratio, add SSD |
| "Too many open files" error | cat /proc/sys/fs/file-nr | Increase fs.file-max and LimitNOFILE |
| Network throughput low | iperf3 -c <server>, ethtool | Increase buffer sizes, enable BBR, check MTU |
| Application timeout under load | ss -s, sysctl net.core.somaxconn | Increase somaxconn and tcp_max_syn_backlog |
| Inconsistent latency | Check CPU governor | Set governor to performance, disable turbo boost |
Related Skills
linux-administration -- General system monitoring and management
systemd-services -- Resource limits via cgroups in unit files
block-storage -- Storage-level performance (LVM, RAID, filesystems)
nfs-storage -- NFS-specific performance tuning