How to display I/O statistics → iostat
How to Display I/O Statistics → iostat
Table of Contents
1. [Introduction](#introduction)
2. [Prerequisites](#prerequisites)
3. [Understanding iostat Basics](#understanding-iostat-basics)
4. [Installing iostat](#installing-iostat)
5. [Basic iostat Usage](#basic-iostat-usage)
6. [Advanced iostat Options](#advanced-iostat-options)
7. [Interpreting iostat Output](#interpreting-iostat-output)
8. [Practical Examples and Use Cases](#practical-examples-and-use-cases)
9. [Monitoring Strategies](#monitoring-strategies)
10. [Common Issues and Troubleshooting](#common-issues-and-troubleshooting)
11. [Best Practices](#best-practices)
12. [Integration with Other Tools](#integration-with-other-tools)
13. [Conclusion](#conclusion)
Introduction
The `iostat` command is an essential system monitoring tool that provides detailed input/output (I/O) statistics for storage devices and system performance metrics. Understanding how to effectively use iostat is crucial for system administrators, DevOps engineers, and performance analysts who need to monitor disk activity, identify bottlenecks, and optimize system performance.
This comprehensive guide will teach you everything you need to know about using iostat, from basic command execution to advanced monitoring strategies. You'll learn how to interpret the various metrics, identify performance issues, and implement effective monitoring solutions for your systems.
Whether you're troubleshooting slow disk performance, monitoring server health, or conducting capacity planning, iostat provides the insights needed to make informed decisions about your storage infrastructure.
Prerequisites
Before diving into iostat usage, ensure you have:
- Operating System: Linux, Unix, or macOS system with terminal access
- User Permissions: Root or sudo access for comprehensive monitoring
- Basic Knowledge: Familiarity with command-line interface and basic system administration
- Storage Understanding: Basic knowledge of disk drives, file systems, and I/O concepts
System Requirements
Most modern Linux distributions include iostat as part of the `sysstat` package. The tool works on:
- Red Hat Enterprise Linux (RHEL) and derivatives
- Ubuntu and Debian systems
- SUSE Linux Enterprise
- macOS (with some variations in output format)
- Other Unix-like systems
Understanding iostat Basics
What is iostat?
The `iostat` command reports CPU statistics and input/output statistics for devices and partitions. It's part of the sysstat package and provides real-time monitoring capabilities for:
- Disk I/O Performance: Read/write operations, transfer rates, and utilization
- CPU Utilization: User, system, and idle time statistics
- Device-Specific Metrics: Per-device performance characteristics
- Historical Data: Time-series performance monitoring
Key Metrics Explained
Understanding the core metrics is essential for effective monitoring:
I/O Metrics:
- IOPS: Input/Output Operations Per Second
- Throughput: Data transfer rate (KB/s, MB/s)
- Utilization: Percentage of time the device is busy
- Queue Depth: Average number of pending I/O requests
- Response Time: Average time for I/O operations to complete
CPU Metrics:
- %user: Time spent in user mode
- %system: Time spent in system mode
- %idle: Idle time percentage
- %iowait: Time waiting for I/O operations
Installing iostat
Linux Installation
Red Hat/CentOS/Fedora
```bash
Install sysstat package
sudo yum install sysstat
For newer versions using dnf
sudo dnf install sysstat
Enable and start sysstat service
sudo systemctl enable sysstat
sudo systemctl start sysstat
```
Ubuntu/Debian
```bash
Update package repository
sudo apt update
Install sysstat package
sudo apt install sysstat
Enable data collection
sudo systemctl enable sysstat
sudo systemctl start sysstat
```
SUSE Linux
```bash
Install sysstat package
sudo zypper install sysstat
Enable service
sudo systemctl enable sysstat
sudo systemctl start sysstat
```
Verification
Verify the installation:
```bash
Check iostat version
iostat -V
Test basic functionality
iostat 1 1
```
Basic iostat Usage
Simple Command Execution
The most basic iostat command displays current statistics:
```bash
Display current I/O statistics
iostat
```
Sample Output:
```
Linux 5.4.0-74-generic (server01) 12/15/2023 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
2.45 0.00 1.23 0.15 0.00 96.17
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 1.85 8.45 12.34 123456 180234
sdb 0.23 1.12 0.89 16789 13456
```
Continuous Monitoring
For real-time monitoring, specify intervals:
```bash
Update every 2 seconds
iostat 2
Update every 5 seconds, show 10 iterations
iostat 5 10
Monitor specific device every second
iostat -d sda 1
```
Device-Specific Monitoring
Focus on specific devices or device types:
```bash
Monitor only disk devices
iostat -d
Monitor specific device
iostat -d sda
Monitor multiple devices
iostat -d sda sdb sdc
```
Advanced iostat Options
Extended Statistics
The `-x` option provides extended statistics with additional metrics:
```bash
Extended statistics
iostat -x
Extended stats with 2-second intervals
iostat -x 2
Extended stats for specific device
iostat -x -d sda 1
```
Extended Output Explanation:
```
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm
sda 1.23 4.56 15.67 89.12 0.12 2.34 8.89 33.91
r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
12.34 45.67 0.23 12.73 19.54 8.91 1.23
```
Human-Readable Format
Use `-h` for human-readable output:
```bash
Human-readable format
iostat -h
Combined with extended stats
iostat -x -h 2
```
JSON Output Format
For programmatic processing, use JSON format:
```bash
JSON output (newer versions)
iostat -o JSON
JSON with extended stats
iostat -x -o JSON 2 3
```
Network File System Statistics
Monitor NFS statistics:
```bash
NFS statistics
iostat -n
Combined NFS and device stats
iostat -n -d 2
```
Interpreting iostat Output
CPU Statistics Section
Understanding CPU metrics helps identify system-wide performance issues:
```
avg-cpu: %user %nice %system %iowait %steal %idle
15.23 0.12 8.45 2.34 0.00 73.86
```
Metric Interpretations:
- %user: High values indicate CPU-intensive applications
- %system: High values suggest kernel-level processing or system calls
- %iowait: High values indicate I/O bottlenecks
- %steal: Relevant in virtualized environments; indicates CPU stolen by hypervisor
- %idle: Low values indicate high CPU utilization
Device Statistics Section
Basic Device Stats
```
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 8.45 45.67 123.45 456789 1234567
```
Key Metrics:
- tps: Transactions per second (IOPS)
- kB_read/s: Kilobytes read per second
- kB_wrtn/s: Kilobytes written per second
- kB_read/kB_wrtn: Total data transferred since boot
Extended Device Stats
```
Device r/s w/s rkB/s wkB/s rrqm/s wrqm/s %rrqm %wrqm
sda 2.34 6.78 23.45 67.89 0.23 1.45 9.01 17.62
r_await w_await aqu-sz rareq-sz wareq-sz svctm %util
15.67 23.89 0.45 10.02 10.01 4.56 3.21
```
Advanced Metrics:
- r/s, w/s: Read/write operations per second
- rrqm/s, wrqm/s: Merged read/write requests per second
- %rrqm, %wrqm: Percentage of merged requests
- r_await, w_await: Average response time for read/write operations
- aqu-sz: Average queue size
- rareq-sz, wareq-sz: Average request size
- svctm: Average service time (deprecated in newer versions)
- %util: Device utilization percentage
Performance Indicators
Identifying Bottlenecks
High I/O Wait:
```bash
Monitor for high iowait
iostat -c 1
```
If `%iowait` > 20%, investigate disk performance.
High Utilization:
```bash
Check device utilization
iostat -x 1
```
If `%util` > 80%, the device may be saturated.
Long Response Times:
```bash
Monitor response times
iostat -x 1
```
If `r_await` or `w_await` > 20ms for SSDs or > 50ms for HDDs, performance may be degraded.
Practical Examples and Use Cases
Example 1: Basic System Health Check
```bash
Quick system overview
iostat -c -d 1 3
```
This command provides CPU and device statistics for 3 iterations, helping identify immediate performance issues.
Example 2: Detailed Disk Analysis
```bash
Comprehensive disk analysis
iostat -x -d -h 2 10
```
Use Case: Investigating reported slow application performance
Analysis Focus: Look for high `%util`, elevated `r_await/w_await`, and low throughput
Example 3: Monitoring During Load Testing
```bash
Continuous monitoring with timestamps
iostat -x -t 5
```
Use Case: Performance testing validation
Key Metrics: Track `%util`, `aqu-sz`, and response times under load
Example 4: Specific Device Deep Dive
```bash
Focus on problematic device
iostat -x -d /dev/sda 1 60
```
Use Case: Troubleshooting specific disk issues
Duration: Monitor for 60 seconds with 1-second intervals
Example 5: NFS Performance Monitoring
```bash
Monitor NFS and local disk performance
iostat -n -x -d 2
```
Use Case: Hybrid storage environment monitoring
Focus: Compare local vs. network storage performance
Example 6: Automated Monitoring Script
```bash
#!/bin/bash
Performance monitoring script
LOG_FILE="/var/log/iostat_monitor.log"
THRESHOLD_UTIL=80
THRESHOLD_AWAIT=50
while true; do
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
OUTPUT=$(iostat -x -d 1 1 | tail -n +4)
echo "[$TIMESTAMP]" >> $LOG_FILE
echo "$OUTPUT" >> $LOG_FILE
# Check for high utilization
HIGH_UTIL=$(echo "$OUTPUT" | awk -v thresh=$THRESHOLD_UTIL '$NF > thresh {print $1 ": " $NF "%"}')
if [ ! -z "$HIGH_UTIL" ]; then
echo "HIGH UTILIZATION ALERT: $HIGH_UTIL" >> $LOG_FILE
fi
sleep 60
done
```
Monitoring Strategies
Real-Time Monitoring
For immediate issue detection:
```bash
Real-time dashboard
watch -n 2 'iostat -x -h'
Alert on high utilization
iostat -x 1 | awk '$NF > 80 {print "High utilization on " $1 ": " $NF "%"}'
```
Historical Analysis
Combine with system logging for trend analysis:
```bash
Log iostat data with timestamps
iostat -x -t 300 >> /var/log/iostat_daily.log
Rotate logs daily
logrotate /etc/logrotate.d/iostat
```
Threshold-Based Monitoring
Implement alerting based on performance thresholds:
```bash
Create monitoring function
monitor_disk_performance() {
local device=$1
local util_threshold=${2:-80}
local await_threshold=${3:-50}
iostat -x -d $device 1 1 | tail -n 1 | while read line; do
util=$(echo $line | awk '{print $NF}' | sed 's/%//')
await=$(echo $line | awk '{print $(NF-2)}')
if (( $(echo "$util > $util_threshold" | bc -l) )); then
echo "ALERT: High utilization on $device: ${util}%"
fi
if (( $(echo "$await > $await_threshold" | bc -l) )); then
echo "ALERT: High response time on $device: ${await}ms"
fi
done
}
```
Common Issues and Troubleshooting
Issue 1: Command Not Found
Problem: `iostat: command not found`
Solution:
```bash
Install sysstat package
sudo apt install sysstat # Ubuntu/Debian
sudo yum install sysstat # RHEL/CentOS
```
Issue 2: No Statistics Available
Problem: iostat shows no device statistics
Diagnosis:
```bash
Check if sysstat is collecting data
sudo systemctl status sysstat
Verify data collection configuration
cat /etc/default/sysstat
```
Solution:
```bash
Enable data collection
sudo sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
sudo systemctl restart sysstat
```
Issue 3: Permission Denied
Problem: Cannot access device statistics
Solution:
```bash
Run with appropriate permissions
sudo iostat -x
Add user to disk group (if applicable)
sudo usermod -a -G disk $USER
```
Issue 4: Inconsistent Data
Problem: iostat shows unexpected values
Diagnosis:
```bash
Compare with other tools
iotop -a
vmstat 1 5
```
Solution:
- Ensure sufficient sampling interval (avoid 1-second intervals for averages)
- Cross-reference with multiple monitoring tools
- Check for system clock issues
Issue 5: High CPU Usage from Monitoring
Problem: Frequent iostat execution impacts performance
Solution:
```bash
Use appropriate intervals
iostat 5 # Instead of iostat 1
Limit monitoring scope
iostat -d sda 10 # Monitor specific devices only
```
Issue 6: Output Format Variations
Problem: Output format differs between systems
Solution:
```bash
Use standardized options
iostat -x -k # Explicit kilobyte format
Check iostat version
iostat -V
Use JSON format for consistency (newer versions)
iostat -o JSON
```
Best Practices
Monitoring Frequency
Guidelines for Sampling Intervals:
- Real-time troubleshooting: 1-2 seconds
- Regular monitoring: 5-10 seconds
- Trend analysis: 1-5 minutes
- Historical logging: 10-30 minutes
```bash
Appropriate monitoring frequencies
iostat 1 60 # 1-minute real-time analysis
iostat 5 # Continuous 5-second monitoring
iostat 300 # 5-minute trend monitoring
```
Resource Management
Minimize Monitoring Overhead:
```bash
Efficient monitoring approach
iostat -d -x 10 # Device-only stats every 10 seconds
Avoid excessive CPU monitoring
iostat -d # Skip CPU stats when not needed
```
Data Collection Strategy
Structured Logging:
```bash
Timestamped logging
iostat -x -t 60 | while read line; do
echo "$(date '+%Y-%m-%d %H:%M:%S') $line" >> /var/log/iostat.log
done
Compressed historical storage
gzip /var/log/iostat.log.$(date +%Y%m%d)
```
Alert Thresholds
Recommended Thresholds:
| Metric | SSD Threshold | HDD Threshold | Action |
|--------|---------------|---------------|---------|
| %util | > 80% | > 70% | Investigate load |
| r_await | > 20ms | > 50ms | Check disk health |
| w_await | > 30ms | > 100ms | Analyze write patterns |
| %iowait | > 20% | > 30% | Review I/O subsystem |
Integration Patterns
Combining with Other Tools:
```bash
Comprehensive monitoring
{
echo "=== CPU and I/O ==="
iostat -c -d 1 1
echo "=== Memory ==="
free -h
echo "=== Processes ==="
ps aux --sort=-%cpu | head -10
} > system_snapshot.txt
```
Integration with Other Tools
Combining with vmstat
```bash
Parallel monitoring
iostat 5 & vmstat 5 &
```
Integration with sar
```bash
Historical analysis with sar
sar -d 1 60 & # Disk stats
iostat -x 1 60 # Real-time iostat
```
Grafana Dashboard Integration
```bash
Export iostat data for Grafana
iostat -x -o JSON 10 | jq '.sysstat.hosts[0].statistics[0]."disk-device"[]' \
| curl -X POST -H "Content-Type: application/json" \
-d @- http://grafana-server:3000/api/metrics
```
Log Analysis with ELK Stack
```bash
Format iostat output for Elasticsearch
iostat -x -t 60 | awk '
/^[0-9]/ {
timestamp=$1" "$2
}
/^[a-z]/ && NF>10 {
print "{"
print "\"timestamp\":\"" timestamp "\","
print "\"device\":\"" $1 "\","
print "\"reads_per_sec\":" $4 ","
print "\"writes_per_sec\":" $5 ","
print "\"utilization\":" $NF
print "}"
}'
```
Automated Alerting
```bash
Nagios plugin integration
#!/bin/bash
DEVICE=$1
WARN_UTIL=${2:-70}
CRIT_UTIL=${3:-90}
UTIL=$(iostat -x -d $DEVICE 1 1 | tail -1 | awk '{print $NF}' | sed 's/%//')
if (( $(echo "$UTIL >= $CRIT_UTIL" | bc -l) )); then
echo "CRITICAL: $DEVICE utilization at ${UTIL}%"
exit 2
elif (( $(echo "$UTIL >= $WARN_UTIL" | bc -l) )); then
echo "WARNING: $DEVICE utilization at ${UTIL}%"
exit 1
else
echo "OK: $DEVICE utilization at ${UTIL}%"
exit 0
fi
```
Advanced Use Cases
Performance Baseline Creation
```bash
Create performance baseline
#!/bin/bash
BASELINE_DIR="/var/lib/iostat/baseline"
mkdir -p $BASELINE_DIR
Collect baseline during normal operations
iostat -x -t 300 720 > $BASELINE_DIR/baseline_$(date +%Y%m%d).log
Generate baseline summary
awk '/^[a-z]/ && NF>10 {
device=$1; util+=$NF; await+=$(NF-2); count++
}
END {
print "Average utilization: " util/count "%"
print "Average response time: " await/count "ms"
}' $BASELINE_DIR/baseline_$(date +%Y%m%d).log
```
Capacity Planning Analysis
```bash
Trend analysis for capacity planning
#!/bin/bash
analyze_trends() {
local device=$1
local days=${2:-30}
echo "Analyzing $device trends over $days days..."
find /var/log/iostat -name "*.log" -mtime -$days -exec cat {} \; | \
grep $device | awk '{
util+=$NF;
tps+=$4+$5;
count++
} END {
avg_util=util/count
avg_tps=tps/count
print "Average utilization: " avg_util "%"
print "Average TPS: " avg_tps
print "Projected 80% utilization at: " (avg_tps * 80 / avg_util) " TPS"
}'
}
```
Multi-Server Monitoring
```bash
Distributed monitoring script
#!/bin/bash
SERVERS="server1 server2 server3"
THRESHOLD=80
for server in $SERVERS; do
echo "=== $server ==="
ssh $server "iostat -x 1 1" | tail -n +4 | while read line; do
device=$(echo $line | awk '{print $1}')
util=$(echo $line | awk '{print $NF}' | sed 's/%//')
if [ ! -z "$util" ] && (( $(echo "$util > $THRESHOLD" | bc -l) )); then
echo "ALERT: $server:$device utilization: ${util}%"
fi
done
done
```
Conclusion
The `iostat` command is an indispensable tool for system monitoring and performance analysis. Through this comprehensive guide, you've learned how to effectively use iostat for various monitoring scenarios, from basic system health checks to advanced performance analysis and automated alerting.
Key Takeaways
1. Understanding Metrics: Proper interpretation of iostat output is crucial for effective monitoring
2. Appropriate Intervals: Choose sampling frequencies that balance accuracy with system overhead
3. Threshold Management: Establish meaningful alert thresholds based on your hardware and workload characteristics
4. Integration Strategy: Combine iostat with other monitoring tools for comprehensive system visibility
5. Automation Benefits: Implement automated monitoring and alerting for proactive issue detection
Next Steps
To further enhance your system monitoring capabilities:
1. Implement Monitoring Automation: Create scripts for continuous monitoring and alerting
2. Establish Baselines: Document normal performance patterns for your systems
3. Integrate with Monitoring Platforms: Connect iostat data to centralized monitoring solutions
4. Develop Response Procedures: Create runbooks for common performance issues identified through iostat
5. Regular Review: Periodically review and adjust monitoring thresholds based on changing workloads
Additional Resources
For continued learning and advanced usage:
- Study the sysstat package documentation for additional tools like `sar` and `pidstat`
- Explore integration with modern monitoring platforms like Prometheus and Grafana
- Learn about storage subsystem architecture to better interpret iostat metrics
- Practice with different storage technologies (NVMe, SAN, NFS) to understand their specific characteristics
By mastering iostat usage, you've gained a powerful tool for maintaining optimal system performance and quickly identifying storage-related bottlenecks. Remember that effective monitoring is an ongoing process that requires regular attention and continuous refinement of your monitoring strategies.