Table of Contents
- Understanding Key Performance Metrics
- CPU Metrics
- Memory Metrics
- Disk I/O Metrics
- Network Metrics
- System-Level Metrics
- Identifying Performance Bottlenecks
- The Bottleneck Hypothesis
- Tools for Deep-Dive Analysis
- Common Bottleneck Scenarios
- Hands-On Tuning Techniques
- CPU Tuning
- Memory Tuning
- Disk I/O Tuning
- Network Tuning
- Kernel Parameter Tuning
- Monitoring and Validation
- Real-Time Monitoring Tools
- Benchmarking Tools
- Long-Term Performance Tracking
- Best Practices for Sustainable Tuning
- Conclusion
- References
1. Understanding Key Performance Metrics
Before tuning, you need to know what to measure. Performance metrics act as your “system health dashboard,” revealing where resources are being used (or wasted). Let’s break down the critical metrics for each subsystem:
CPU Metrics
The CPU is the “brain” of the system, responsible for executing instructions. Key metrics include:
- User Time (
%us): CPU time spent on user-space processes (e.g., Apache, MySQL). High values indicate applications are CPU-bound. - System Time (
%sy): CPU time spent on kernel-space operations (e.g., I/O, process scheduling). Excess%sy(e.g., >20%) may signal inefficient kernel calls or driver issues. - I/O Wait (
%wa): CPU time idle waiting for disk/network I/O. High%wa(e.g., >10%) often points to slow storage. - Steal Time (
%st): CPU time “stolen” by the hypervisor (relevant for VMs). High%st(>5%) means the VM is starved for CPU. - Load Average: The number of processes waiting for CPU (1/5/15-minute averages). A load > CPU core count indicates saturation.
How to Measure: Use top (interactive) or mpstat (detailed per-CPU stats):
# View per-CPU usage (update every 2 seconds)
mpstat -P ALL 2
Memory Metrics
Memory (RAM) is where active data is stored for fast access. Key metrics:
- Total/Used/Free RAM: Use
free -hto check overall memory utilization. - Cached Memory (
cached): RAM used for disk caching (temporarily stored data). High cache is normal (Linux uses unused RAM for caching). - Swap Usage: Disk space used when RAM is full. Frequent swapping (thrashing) cripples performance.
- Page Faults: Soft faults (data in cache) are harmless; hard faults (data read from disk) indicate insufficient RAM.
How to Measure:
# Human-readable memory stats
free -h
# Page fault statistics (update every 2 seconds)
vmstat 2
Disk I/O Metrics
Slow storage can bottleneck even fast CPUs. Key metrics:
- Throughput: Data transferred per second (
kB_read/s,kB_wrtn/s). - IOPS (I/O Operations Per Second): Critical for databases (random I/O) or fileservers (sequential I/O).
- Latency: Time per I/O operation (
avgqu-sz= queue length,await= average time per request). - Utilization (
%util): Percentage of time the disk is busy. >80% utilization often causes latency spikes.
How to Measure: Use iostat (disk stats) or iotop (per-process I/O):
# Disk I/O stats (update every 2 seconds)
iostat -x 2
# Identify I/O-heavy processes
iotop
Network Metrics
Network bottlenecks manifest as slow transfers or dropped packets. Key metrics:
- Bandwidth Usage: Incoming (
rx) and outgoing (tx) traffic (ifconfig,ip -s link). - Packet Loss: Dropped packets due to congestion or misconfiguration.
- Latency (
ping/traceroute): Round-trip time (RTT) between hosts. - TCP Retransmissions: Failed packet deliveries (indicates network instability).
How to Measure:
# Network traffic per interface (update every 2 seconds)
ifstat 2
# TCP retransmissions
ss -ti 'state established' | grep retrans
System-Level Metrics
Holistic indicators of system health:
- Uptime: System uptime and load average (from
uptime). - Process Count: Total running processes (
ps aux | wc -l). Too many processes strain CPU/memory. - Interrupts: Hardware/software signals (e.g., network cards, disks). Spikes in interrupts (
/proc/interrupts) can overload the CPU.
2. Identifying Performance Bottlenecks
Tuning without identifying the root cause is guesswork. The bottleneck hypothesis states: A system’s performance is limited by its slowest component (CPU, memory, disk, or network). Your goal: Find that component.
The Bottleneck Workflow
- Monitor Metrics: Use tools like
top,iostat, andvmstatto spot anomalies (e.g., high%wa, swap thrashing). - Narrow Down:
- High
%usor load average → CPU bottleneck. - High swap usage + hard page faults → Memory bottleneck.
- High
%utilorawait→ Disk I/O bottleneck. - High retransmissions or bandwidth saturation → Network bottleneck.
- High
- Deep Dive: Use specialized tools to confirm (e.g.,
perffor CPU,stracefor syscalls).
Tools for Deep-Dive Analysis
perf: Linux’s powerful profiling tool (CPU usage, function calls, etc.):# Record CPU usage for 10 seconds, then analyze perf record -g sleep 10 perf report # Interactive report of CPU-hungry functionsstrace: Trace system calls of a process to identify inefficiencies (e.g., excessiveopen()/read()calls):# Trace syscalls for process ID 1234 strace -p 1234lsof: List open files by a process (finds file descriptor leaks):# Show all files opened by nginx lsof -p $(pgrep nginx)
Common Bottleneck Scenarios
- Example 1: A web server with
%wa=30%andiostatshowing%util=95%on/dev/sda→ Disk I/O bottleneck. - Example 2: A database server with
vmstatshowingsi=1000 kB/s(swap in) andso=800 kB/s(swap out) → Memory bottleneck.
3. Hands-On Tuning Techniques
Now that you can identify bottlenecks, let’s tune each subsystem with practical steps.
CPU Tuning
Goal: Maximize CPU utilization and minimize idle time.
1. Optimize Process Scheduling
nice/renice: Adjust process priority (range: -20 [highest] to 19 [lowest]).# Start a process with high priority (e.g., a database) nice -n -5 mysqld # Lower priority of a background task (e.g., backup) renice +10 -p 1234 # 1234 = process IDcgroups: Limit CPU for resource-heavy processes (e.g., containers):# Create a cgroup limiting CPU to 50% sudo cgcreate -g cpu:limited sudo cgset -r cpu.cfs_quota_us=50000 limited # 50000 = 50% of 1s sudo cgexec -g cpu:limited /path/to/process
2. Reduce Interrupt Overhead
irqbalance: Distribute hardware interrupts across CPU cores (install viasudo apt install irqbalance).- Isolate Cores: For latency-sensitive workloads (e.g., real-time apps), reserve cores for critical processes:
# Edit GRUB to isolate cores 2-3 (add to GRUB_CMDLINE_LINUX) sudo nano /etc/default/grub GRUB_CMDLINE_LINUX="isolcpus=2,3" sudo update-grub && reboot
3. CPU Scaling Governors
Laptops/servers often use power-saving governors by default. Switch to performance mode for maximum throughput:
# List available governors (e.g., powersave, performance)
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
# Set all cores to performance mode
sudo cpupower frequency-set -g performance
Memory Tuning
Goal: Minimize swapping and maximize efficient RAM usage.
1. Adjust Swappiness
swappiness (0-100) controls how aggressively Linux swaps. Lower values reduce swapping:
# Check current swappiness (default: 60)
cat /proc/sys/vm/swappiness
# Temporarily set to 10 (better for servers)
sudo sysctl vm.swappiness=10
# Persist across reboots (add to /etc/sysctl.conf)
echo "vm.swappiness=10" | sudo tee -a /etc/sysctl.conf
2. Disable Overcommit (For Critical Apps)
Linux默认允许过度提交内存(进程请求的内存超过可用RAM),这可能导致OOM(内存不足)崩溃。对数据库等关键应用禁用过度提交:
# 临时禁用内存过度提交
sudo sysctl vm.overcommit_memory=2
# 永久生效
echo "vm.overcommit_memory=2" | sudo tee -a /etc/sysctl.conf
3. Use HugePages (For Databases)
大页面(2MB/1GB)减少内存寻址开销,提升数据库(如MySQL/PostgreSQL)性能:
# 检查大页面支持
grep HugePages_Total /proc/meminfo
# 分配1024个2MB大页面(临时)
sudo sysctl vm.nr_hugepages=1024
# 永久分配(编辑/etc/sysctl.conf)
echo "vm.nr_hugepages=1024" | sudo tee -a /etc/sysctl.conf
Disk I/O Tuning
Goal: Reduce latency and maximize throughput.
1. Choose the Right Filesystem
- XFS: Better for large files (e.g., media servers) and high concurrency.
- ext4: More stable for small files (e.g., web servers).
- btrfs: Advanced features (snapshots, RAID) but higher overhead.
2. Optimize Mount Options
Add these to /etc/fstab for faster disk access:
# Example: Mount /dev/sda1 with noatime (disable access time logging)
UUID=... / ext4 defaults,noatime,nodiratime 0 1
noatime: Disable recording file access times (reduces writes).nodiratime: Disable directory access time logging.discard: Enable TRIM for SSDs (automatically free unused blocks).
3. Tune I/O Schedulers
Match the scheduler to your workload:
deadline: Best for databases (prioritizes read latency).cfq: Default for desktop (fair sharing).noop: Ideal for SSDs/RAID (minimal overhead).
# Check current scheduler for sda
cat /sys/block/sda/queue/scheduler
# Temporarily set to deadline
echo deadline | sudo tee /sys/block/sda/queue/scheduler
# Persist via udev rule (create /etc/udev/rules.d/60-scheduler.rules)
ACTION=="add|change", KERNEL=="sda", ATTR{queue/scheduler}="deadline"
Network Tuning
Goal: Reduce latency and maximize throughput.
1. Increase TCP Buffer Sizes
Larger buffers improve performance for high-latency networks (e.g., cloud servers):
# Temporarily set TCP buffer limits
sudo sysctl -w net.core.rmem_max=16777216 # 16MB read buffer
sudo sysctl -w net.core.wmem_max=16777216 # 16MB write buffer
# Persist in /etc/sysctl.conf
echo "net.core.rmem_max=16777216" | sudo tee -a /etc/sysctl.conf
echo "net.core.wmem_max=16777216" | sudo tee -a /etc/sysctl.conf
2. Optimize TCP Congestion Control
For high-throughput networks, use bbr (Bottleneck Bandwidth and RTT) instead of the default cubic:
# Enable BBR (requires Linux 4.9+)
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
3. Disable Unnecessary Services
Stop unused network daemons (e.g., cups, bluetooth) to free resources:
sudo systemctl disable --now cups bluetooth
Kernel Parameter Tuning
Fine-tune kernel behavior via /etc/sysctl.conf:
vm.max_map_count: Increase for Java apps (default 65530 → 262144).net.ipv4.tcp_fin_timeout: Reduce from 60s to 30s to free sockets faster.fs.file-max: Increase open file limit for high-concurrency apps (e.g., Nginx).
4. Monitoring and Validation
Tuning isn’t complete until you validate improvements. Always compare pre- and post-tuning metrics.
Real-Time Monitoring
htop: Interactive process viewer with CPU/memory/disk stats.dstat: All-in-one tool for CPU, memory, disk, and network:dstat -tcmnd --top-cpu --top-mem # Show top CPU/memory processes
Benchmarking Tools
- CPU:
sysbench cpu --cpu-max-prime=20000 run(higher primes = longer test). - Memory:
sysbench memory --memory-block-size=1M --memory-total-size=10G run. - Disk:
fio --name=randwrite --rw=randwrite --bs=4k --size=1G --runtime=60(random write test). - Network:
iperf3 -c server_ip(measure bandwidth between two hosts).
Long-Term Tracking
For production systems, use Prometheus + Grafana to monitor trends:
- Install Prometheus (collects metrics).
- Add node-exporter (exposes Linux metrics).
- Visualize with Grafana dashboards (e.g., Node Exporter Full).
5. Best Practices for Sustainable Tuning
- Start with Monitoring: Tune based on data, not assumptions.
- Document Changes: Log every tweak (e.g., “Changed swappiness from 60 to 10 on 2024-05-20”).
- Test in Staging: Never tune production directly—replicate issues in a test environment first.
- Tune Incrementally: Change one parameter at a time and validate before moving on.
- Backup First: Save
sysctl.conf,fstab, and GRUB configs before editing.
6. Conclusion
Linux performance tuning isn’t about memorizing kernel parameters—it’s about understanding your system, identifying bottlenecks, and applying targeted optimizations. By following the hands-on approach outlined here, you can transform a sluggish system into a high-performance machine.
Remember: Performance is a journey, not a destination. Regular monitoring and iterative tuning will ensure your Linux system stays optimized as workloads evolve.
7. References
- Linux Performance by Brendan Gregg (the ultimate resource).
- Red Hat Performance Tuning Guide.
- sysctl Documentation.
- fio (Flexible I/O Tester).
- Node Exporter (Prometheus metrics for Linux).