How to monitor I/O with iostat
How to Monitor I/O with iostat
Input/Output (I/O) monitoring is a critical aspect of system administration and performance optimization. The `iostat` command is one of the most powerful and widely-used tools for monitoring disk I/O statistics and system performance in Linux and Unix-like systems. This comprehensive guide will teach you everything you need to know about using `iostat` to effectively monitor and analyze your system's I/O performance.
Table of Contents
1. [Introduction to iostat](#introduction-to-iostat)
2. [Prerequisites and Installation](#prerequisites-and-installation)
3. [Basic iostat Usage](#basic-iostat-usage)
4. [Understanding iostat Output](#understanding-iostat-output)
5. [Advanced iostat Options](#advanced-iostat-options)
6. [Practical Examples and Use Cases](#practical-examples-and-use-cases)
7. [Analyzing I/O Performance](#analyzing-io-performance)
8. [Common Issues and Troubleshooting](#common-issues-and-troubleshooting)
9. [Best Practices](#best-practices)
10. [Integration with Other Tools](#integration-with-other-tools)
11. [Conclusion](#conclusion)
Introduction to iostat
The `iostat` (Input/Output Statistics) command is part of the sysstat package and provides detailed information about CPU utilization and I/O statistics for devices and partitions. It's an essential tool for system administrators, DevOps engineers, and anyone responsible for monitoring system performance.
Key benefits of using iostat include:
- Real-time I/O monitoring
- Historical performance analysis
- Bottleneck identification
- Capacity planning assistance
- Performance troubleshooting
Prerequisites and Installation
System Requirements
Before using iostat, ensure you have:
- Linux or Unix-like operating system
- Root or sudo privileges for installation
- Basic understanding of command-line interface
- Familiarity with file systems and storage concepts
Installation
On Ubuntu/Debian Systems:
```bash
sudo apt update
sudo apt install sysstat
```
On CentOS/RHEL/Fedora Systems:
```bash
CentOS/RHEL
sudo yum install sysstat
Fedora
sudo dnf install sysstat
```
On Arch Linux:
```bash
sudo pacman -S sysstat
```
Verification
Verify the installation by checking the version:
```bash
iostat -V
```
Basic iostat Usage
Simple iostat Command
The most basic usage of iostat displays current system statistics:
```bash
iostat
```
This command shows:
- CPU utilization statistics
- Device utilization statistics for all mounted devices
Continuous Monitoring
To monitor I/O continuously, specify an interval (in seconds):
```bash
iostat 2
```
This displays statistics every 2 seconds. To limit the number of reports:
```bash
iostat 2 5
```
This shows 5 reports with 2-second intervals.
Monitoring Specific Devices
Monitor specific devices or partitions:
```bash
iostat -d /dev/sda
iostat -d sda1 sda2
```
Understanding iostat Output
CPU Statistics Section
When iostat runs, it first displays CPU statistics:
```
avg-cpu: %user %nice %system %iowait %steal %idle
2.50 0.00 1.25 0.75 0.00 95.50
```
Key metrics explained:
- %user: Percentage of CPU time spent in user mode
- %nice: Percentage of CPU time spent running low-priority processes
- %system: Percentage of CPU time spent in kernel mode
- %iowait: Percentage of CPU time waiting for I/O operations
- %steal: Percentage of time spent waiting for virtual CPU (virtualized environments)
- %idle: Percentage of CPU time spent idle
Device Statistics Section
The device statistics section shows detailed I/O information:
```
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.50 12.25 45.75 1234 4567
sdb 0.25 2.15 1.35 215 135
```
Key metrics explained:
- Device: Device or partition name
- tps: Transfers per second (IOPS - Input/Output Operations Per Second)
- kB_read/s: Kilobytes read per second
- kB_wrtn/s: Kilobytes written per second
- kB_read: Total kilobytes read
- kB_wrtn: Total kilobytes written
Extended Statistics
Using the `-x` option provides extended statistics:
```bash
iostat -x
```
This displays additional metrics:
- rrqm/s: Read requests merged per second
- wrqm/s: Write requests merged per second
- r/s: Read requests per second
- w/s: Write requests per second
- rkB/s: Kilobytes read per second
- wkB/s: Kilobytes written per second
- avgrq-sz: Average size of requests (in sectors)
- avgqu-sz: Average queue length of requests
- await: Average time for I/O requests to be served (milliseconds)
- r_await: Average time for read requests
- w_await: Average time for write requests
- svctm: Average service time (deprecated in newer versions)
- %util: Percentage of CPU time during which I/O requests were issued
Advanced iostat Options
Display Options
Show Only Device Statistics
```bash
iostat -d
```
Show Only CPU Statistics
```bash
iostat -c
```
Display in Megabytes
```bash
iostat -m
```
Display Human-Readable Format
```bash
iostat -h
```
Show Network File System Statistics
```bash
iostat -n
```
Time and Date Options
Display Timestamps
```bash
iostat -t
```
Set Custom Date Format
```bash
iostat -t -o JSON
```
Filtering Options
Show Statistics for Specific Device Types
```bash
iostat -d -p sda
```
Exclude Certain Devices
```bash
iostat -d -x -z
```
The `-z` option omits devices with zero activity.
Practical Examples and Use Cases
Example 1: Basic System Monitoring
Monitor overall system I/O every 5 seconds for 12 iterations:
```bash
iostat -x 5 12
```
This is useful for:
- General system health checks
- Identifying I/O patterns
- Baseline performance measurement
Example 2: Database Server Monitoring
For database servers, focus on specific disks with detailed statistics:
```bash
iostat -x -d /dev/sdb /dev/sdc 2
```
Monitor key metrics:
- await: Should typically be under 10ms for good performance
- %util: High utilization (>80%) may indicate bottlenecks
- avgqu-sz: High queue sizes suggest I/O pressure
Example 3: Web Server Log Analysis
Monitor log partition performance:
```bash
iostat -x -p /dev/sda2 1
```
Watch for:
- High write activity during peak hours
- I/O wait times affecting response times
- Disk utilization patterns
Example 4: Storage Array Performance
Monitor multiple disks in a storage array:
```bash
iostat -x -d sda sdb sdc sdd 3 20 > io_analysis.txt
```
This creates a log file for later analysis of:
- Load distribution across disks
- Performance consistency
- Potential hardware issues
Example 5: Virtual Machine Monitoring
In virtualized environments, monitor with steal time awareness:
```bash
iostat -c -x 2
```
Pay attention to:
- %steal: High values indicate resource contention
- %iowait: May be inflated in virtual environments
- Overall I/O patterns vs. physical hardware
Analyzing I/O Performance
Identifying Bottlenecks
High I/O Wait
```bash
iostat -c 1
```
If `%iowait` is consistently high (>20%), investigate:
- Disk utilization with `iostat -x`
- Process-level I/O with `iotop`
- File system performance
Disk Saturation
```bash
iostat -x 1
```
Signs of disk saturation:
- %util approaching 100%
- await times increasing
- avgqu-sz consistently high
Unbalanced Load
```bash
iostat -x -d 2
```
Check for:
- Significant differences in %util between disks
- Uneven tps distribution
- One disk significantly busier than others
Performance Baselines
Establish performance baselines during different periods:
Off-Peak Hours
```bash
iostat -x 300 12 > baseline_offpeak.txt
```
Peak Hours
```bash
iostat -x 60 60 > baseline_peak.txt
```
Weekly Analysis
```bash
iostat -x 3600 168 > weekly_analysis.txt
```
Correlation Analysis
Combine iostat with other monitoring tools:
```bash
Terminal 1
iostat -x 1
Terminal 2
top -p $(pgrep -d',' mysql)
Terminal 3
sar -u 1
```
Common Issues and Troubleshooting
Issue 1: iostat Command Not Found
Problem: `bash: iostat: command not found`
Solution:
```bash
Install sysstat package
sudo apt install sysstat # Ubuntu/Debian
sudo yum install sysstat # CentOS/RHEL
```
Issue 2: No Device Statistics Displayed
Problem: Only CPU statistics shown, no device information
Possible Causes:
- Insufficient permissions
- Devices not mounted
- Kernel doesn't support statistics
Solutions:
```bash
Check mounted devices
df -h
Run with specific device
iostat -d /dev/sda
Check kernel support
cat /proc/diskstats
```
Issue 3: Misleading Statistics in Virtual Environments
Problem: I/O statistics don't reflect actual performance
Understanding:
- Virtual disks may show different patterns
- Host system I/O scheduling affects guest statistics
- Network-attached storage introduces additional latency
Best Practices:
```bash
Monitor both guest and host when possible
iostat -x -t 5
Focus on application-level metrics
Use additional tools like iotop for process-level analysis
```
Issue 4: High %iowait but Low Disk Utilization
Problem: High I/O wait but disks don't appear busy
Possible Causes:
- Network file systems (NFS, CIFS)
- Swap activity
- Memory pressure causing page faults
Investigation:
```bash
Check swap usage
swapon -s
free -m
Monitor network I/O
iostat -n 1
Check memory pressure
vmstat 1
```
Issue 5: Inconsistent Performance Readings
Problem: iostat shows varying performance without clear cause
Troubleshooting Steps:
1. Check for background processes:
```bash
iotop -o
```
2. Monitor file system cache:
```bash
echo 3 > /proc/sys/vm/drop_caches # Clear cache for testing
```
3. Verify hardware health:
```bash
smartctl -a /dev/sda
```
Best Practices
Monitoring Strategy
1. Establish Baselines
- Run iostat during different time periods
- Document normal operating ranges
- Create alerts based on baseline deviations
2. Use Appropriate Intervals
```bash
Real-time troubleshooting
iostat -x 1
Regular monitoring
iostat -x 5 12
Long-term analysis
iostat -x 300 288 # 24-hour monitoring
```
3. Focus on Key Metrics
Priority metrics for different scenarios:
General Performance:
- %iowait (CPU statistics)
- await (response time)
- %util (disk utilization)
Database Servers:
- await and r_await/w_await
- IOPS (tps)
- Queue depth (avgqu-sz)
File Servers:
- Throughput (rkB/s, wkB/s)
- %util across multiple disks
- Request patterns (r/s, w/s)
Automation and Scripting
Create Monitoring Scripts
Basic Monitoring Script:
```bash
#!/bin/bash
io_monitor.sh
LOGFILE="/var/log/iostat_$(date +%Y%m%d).log"
INTERVAL=300 # 5 minutes
COUNT=288 # 24 hours
iostat -x -t $INTERVAL $COUNT >> $LOGFILE 2>&1 &
echo "I/O monitoring started. PID: $!"
```
Alert Script:
```bash
#!/bin/bash
io_alert.sh
THRESHOLD=80
CURRENT_UTIL=$(iostat -x 1 2 | awk '/^sda/ {print $NF}' | tail -1 | cut -d. -f1)
if [ "$CURRENT_UTIL" -gt "$THRESHOLD" ]; then
echo "High disk utilization: ${CURRENT_UTIL}%" | mail -s "I/O Alert" admin@company.com
fi
```
Integration with System Monitoring
Cron Job Setup:
```bash
Add to crontab
/5 * /usr/local/bin/io_monitor.sh
0 /usr/local/bin/io_alert.sh
```
Performance Optimization Guidelines
1. Identify Bottlenecks Early
- Monitor trends, not just current values
- Set up automated alerting
- Correlate I/O patterns with application behavior
2. Optimize Based on Data
```bash
Before optimization
iostat -x 1 60 > before_optimization.txt
After optimization
iostat -x 1 60 > after_optimization.txt
Compare results
diff before_optimization.txt after_optimization.txt
```
3. Consider Workload Characteristics
- Read-heavy: Focus on read cache and read performance
- Write-heavy: Monitor write queues and sync operations
- Random I/O: Pay attention to IOPS and latency
- Sequential I/O: Focus on throughput metrics
Integration with Other Tools
Combining with System Monitoring Tools
1. With sar (System Activity Reporter)
```bash
Terminal 1: I/O monitoring
iostat -x 2
Terminal 2: CPU and memory
sar -u -r 2
```
2. With iotop (Process-level I/O)
```bash
Terminal 1: System-level
iostat -x 1
Terminal 2: Process-level
iotop -o
```
3. With dstat (Versatile Resource Statistics)
```bash
dstat -d -n 1
```
Log Analysis and Reporting
Generate Reports
```bash
#!/bin/bash
generate_io_report.sh
DATE=$(date +%Y-%m-%d)
REPORT_FILE="io_report_$DATE.txt"
echo "I/O Performance Report - $DATE" > $REPORT_FILE
echo "=================================" >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "Current I/O Statistics:" >> $REPORT_FILE
iostat -x >> $REPORT_FILE
echo "" >> $REPORT_FILE
echo "Top I/O Processes:" >> $REPORT_FILE
iotop -b -n 1 -o >> $REPORT_FILE
echo "Report generated: $REPORT_FILE"
```
Monitoring Stack Integration
1. Prometheus Integration
Export iostat metrics for Prometheus monitoring:
```bash
Use node_exporter or custom scripts
iostat -x 1 1 | awk 'script_to_format_for_prometheus'
```
2. Grafana Dashboards
Create visualizations using iostat data:
- Time-series graphs for IOPS and latency
- Heat maps for disk utilization
- Alert panels for threshold breaches
3. ELK Stack Integration
Send iostat logs to Elasticsearch:
```bash
iostat -x -t 5 | logstash -f iostat.conf
```
Advanced Use Cases
Capacity Planning
Historical Analysis
```bash
Collect data over time
iostat -x 3600 24 > daily_io_$(date +%Y%m%d).log
Analyze trends
grep "sda" daily_io_*.log | awk '{print $NF}' | sort -n
```
Growth Projection
```bash
#!/bin/bash
Calculate I/O growth trends
for file in daily_io_*.log; do
avg_util=$(awk '/sda/ {sum+=$NF; count++} END {print sum/count}' "$file")
echo "$(basename $file): $avg_util"
done
```
Performance Testing
Baseline Testing
```bash
Before performance test
iostat -x 1 > baseline_start.log &
IOSTAT_PID=$!
Run your performance test here
...
Stop monitoring
kill $IOSTAT_PID
```
A/B Testing
```bash
Test configuration A
iostat -x 1 300 > config_a_results.log &
Run test A
Test configuration B
iostat -x 1 300 > config_b_results.log &
Run test B
Compare results
```
Conclusion
The `iostat` command is an invaluable tool for monitoring and analyzing I/O performance in Linux systems. Throughout this comprehensive guide, we've covered everything from basic usage to advanced monitoring strategies and troubleshooting techniques.
Key Takeaways
1. Start Simple: Begin with basic `iostat` commands and gradually incorporate advanced options as needed
2. Establish Baselines: Regular monitoring helps identify normal patterns and detect anomalies
3. Focus on Relevant Metrics: Different workloads require attention to different statistics
4. Combine Tools: Use iostat alongside other monitoring tools for comprehensive system analysis
5. Automate Monitoring: Set up scripts and alerts for proactive system management
Next Steps
To further enhance your I/O monitoring capabilities:
1. Explore Related Tools: Learn complementary tools like `iotop`, `sar`, and `dstat`
2. Set Up Monitoring Infrastructure: Implement comprehensive monitoring with tools like Prometheus and Grafana
3. Develop Automation: Create scripts for automated monitoring and alerting
4. Study Performance Patterns: Analyze your specific workloads to understand normal behavior
5. Plan for Growth: Use historical data for capacity planning and performance optimization
Additional Resources
- Man Pages: `man iostat` for complete option reference
- Sysstat Documentation: Official documentation for the sysstat package
- Performance Tuning Guides: System-specific optimization resources
- Monitoring Best Practices: Industry standards for system monitoring
By mastering `iostat` and following the practices outlined in this guide, you'll be well-equipped to monitor, analyze, and optimize I/O performance in your Linux systems. Regular monitoring and proactive analysis will help ensure optimal system performance and prevent I/O-related bottlenecks before they impact your applications and users.
Remember that effective I/O monitoring is an ongoing process that requires consistent attention and continuous learning. As your systems evolve and grow, so too should your monitoring strategies and techniques.