Linux System Performance Tuning: Optimizing CPU, Memory, and Disk

on March 4, 2025
Linux System Performance Tuning: Optimizing CPU, Memory, and Disk

Introduction

Linux is a powerful and flexible operating system, widely used in servers, embedded systems, and even personal computers. However, even the best-configured systems can face performance bottlenecks over time. Performance tuning is essential for ensuring that a Linux system runs efficiently, utilizing available resources optimally while avoiding unnecessary slowdowns.

This guide provides an approach to Linux performance tuning, focusing on three key areas: CPU, memory, and disk optimization. Whether you're a system administrator, DevOps engineer, or just a Linux enthusiast, understanding and implementing these optimizations will help you enhance system responsiveness, reduce resource wastage, and ensure smooth operation.

Understanding System Performance Metrics

Before diving into optimization, it's crucial to understand system performance metrics. Monitoring these metrics allows us to diagnose performance issues and make informed tuning decisions.

Key Performance Indicators (KPIs)
  • CPU Usage: Percentage of CPU time spent on processes.
  • Load Average: Number of processes waiting for CPU time.
  • Memory Usage: Amount of used and free RAM.
  • Disk I/O Wait: Time processes spend waiting for disk access.
  • Swap Usage: How much virtual memory is in use.
  • Context Switches: Number of process switches per second.
  • Disk Throughput: Read/write speeds and latency.
Tools for Monitoring Performance

Linux provides a variety of tools to measure these metrics:

  • CPU & Memory Monitoring: top, htop, mpstat
  • Disk Performance Analysis: iostat, iotop, dstat
  • System-Wide Monitoring: vmstat, sar
  • Profiling and Tracing: perf, strace
  • Process and Resource Management: nice, ulimit, cgroups

CPU Performance Tuning

CPU bottlenecks can occur due to high process loads, inefficient scheduling, or contention for CPU resources. Here's how to optimize CPU performance.

Identifying CPU Bottlenecks

Use the following commands to diagnose CPU issues:

top htop mpstat -P ALL 1 sar -u 5

  • High load average with low CPU usage suggests I/O wait issues.
  • High CPU usage indicates CPU-bound processes.
Optimizing Process Scheduling

Linux uses the Completely Fair Scheduler (CFS) to allocate CPU time. You can manually adjust process priorities using:

nice -n 10 process_name renice -n -5 -p PID

Use taskset to pin processes to specific CPUs:

taskset -c 0,1 process_name

Limiting CPU Usage

To prevent a process from consuming too much CPU, use cpulimit:

cpulimit -l 50 -p PID

For containerized environments, use cgroups:

cgcreate -g cpu:/limitedgroup echo 50000 > /sys/fs/cgroup/cpu/limitedgroup/cpu.cfs_quota_us cgexec -g cpu:limitedgroup process_name

Kernel Parameter Tuning

Adjusting kernel parameters can improve CPU efficiency:

sysctl -w kernel.sched_min_granularity_ns=10000000 sysctl -w kernel.sched_wakeup_granularity_ns=15000000

Memory Performance Optimization

Memory issues can significantly slow down a system, leading to excessive swapping and high latency.

Diagnosing Memory Usage

Use these tools to check memory statistics:

free -m vmstat 5 smem

Look for high swap usage (si and so in vmstat), which indicates memory pressure.

Optimizing Swap Usage
  • Check swap performance:

swapon -s

  • Adjust swap tendency:

sysctl -w vm.swappiness=10

  • Use compressed swap with zswap or zram:

modprobe zram echo 1 > /sys/block/zram0/reset

Managing Cache and Buffers

To free up memory, clear unused caches:

sync; echo 3 > /proc/sys/vm/drop_caches

Adjust kernel buffer behavior:

sysctl -w vm.dirty_ratio=20 sysctl -w vm.dirty_background_ratio=5

Huge Pages Optimization

For applications like databases, enable Huge Pages:

echo 1024 > /proc/sys/vm/nr_hugepages

Disk I/O Performance Tuning

Disk performance is critical for databases, file servers, and applications that handle large amounts of data.

Measuring Disk Performance
  • Check I/O activity:

iostat -x 5 iotop

  • Benchmark disk performance:

fio --name=seqwrite --rw=write --bs=128k --size=1G --numjobs=4 --runtime=60

Filesystem Optimization
  • Use an optimized filesystem (ext4, XFS, btrfs).
  • Enable journaling only if needed:

tune2fs -O has_journal /dev/sdX

  • Use noatime and nodiratime mount options:

mount -o remount,noatime,nodiratime /dev/sdX /mnt

Disk Scheduler Optimization

Change the I/O scheduler for SSDs:

echo noop > /sys/block/sda/queue/scheduler

For HDDs:

echo cfq > /sys/block/sda/queue/scheduler

RAID and LVM Optimization
  • Use RAID 10 for better read/write performance.
  • Optimize LVM striping:

lvcreate -i 2 -I 256 -L 10G -n lv_name vg_name

SSD Optimization
  • Enable TRIM:

fstrim -v /

  • Optimize mount settings:

mount -o discard,defaults /dev/sdX /mnt

General System Optimization Strategies

  • Tune kernel parameters:

sysctl -w net.core.somaxconn=1024 sysctl -w fs.file-max=100000

  • Use ulimit to prevent resource exhaustion:

ulimit -n 100000

  • Disable unnecessary services:

systemctl disable service_name

Performance Tuning Case Studies

High CPU Load on Web Server
  • Identified high php-fpm CPU usage.
  • Used taskset to distribute load.
  • Implemented caching, reducing CPU usage by 40%.
Excessive Disk I/O on Database Server
  • Moved logs to a separate disk.
  • Optimized PostgreSQL shared_buffers and work_mem.
  • Switched to SSDs, improving query times by 60%.

Conclusion

Performance tuning is an ongoing process that involves monitoring, analysis, and optimization. By following the best practices outlined in this guide, you can ensure your Linux system runs smoothly and efficiently.

George Whittaker is the editor of Linux Journal, and also a regular contributor. George has been writing about technology for two decades, and has been a Linux user for over 15 years. In his free time he enjoys programming, reading, and gaming.

Load Disqus comments Our discussions are powered by Disqus, which require JavaScript.

Recent Articles