Your VPS feels slow. Here's how to find out why and fix it.
The Diagnostic Flow
| Symptom | First Check | Tool | |---------|------------|------| | Everything slow | CPU and memory | htop | | Website slow | Disk I/O | iotop | | Connection drops | Network | ss, nethogs | | Out of memory | Memory usage | free -h | | Disk full | Disk space | df -h |
htop: Your Primary Tool
sudo apt install htop
htop
Reading htop
| Section | What to Look For | |---------|-----------------| | CPU bars | All cores near 100% = CPU bottleneck | | Memory bar | Over 90% = memory pressure | | Swap bar | Any usage = memory shortage | | Load average | Above CPU count = overloaded | | Process list | Which process uses the most CPU/RAM |
Load Average Guide
| Load Average vs CPU Cores | Status | |--------------------------|--------| | Load < cores | Healthy | | Load = cores | Fully utilized | | Load > cores | Overloaded | | Load > 2x cores | Severely overloaded |
Example: 2-core VPS with load 1.5 is busy but healthy. Load 4.0 is overloaded.
CPU Troubleshooting
Finding the Culprit
# Top CPU processes
ps aux --sort=-%cpu | head -10
Common CPU Hogs
| Process | Cause | Solution | |---------|-------|----------| | mysql/mariadb | Unoptimized queries | Add indexes, optimize queries | | php-fpm | Heavy PHP processing | Enable OPcache, add caching | | node | Unoptimized code or memory leak | Profile and fix code | | apache2 | Too many concurrent connections | Tune MaxClients | | python | Data processing task | Optimize or schedule off-peak |
Memory Troubleshooting
# Memory overview
free -h
# Per-process memory
ps aux --sort=-%mem | head -10
When Memory is Low
| Action | Impact | |--------|--------| | Restart PHP-FPM | Clears memory leaks | | Reduce MySQL buffer pool | Frees memory | | Kill unused processes | Immediate relief | | Add swap | Temporary fix | | Upgrade VPS | Permanent fix |
MySQL Memory Optimization
MySQL often uses the most memory:
# /etc/mysql/mariadb.conf.d/50-server.cnf
innodb_buffer_pool_size = 256M # Reduce if too high
key_buffer_size = 32M
max_connections = 50 # Reduce from default 151
Disk I/O Troubleshooting
# Install iotop
sudo apt install iotop
sudo iotop
Disk Space
# Filesystem usage
df -h
# Find large directories
du -sh /var/* | sort -rh | head -10
# Find large files
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null
Common Disk Space Fixes
| Culprit | Location | Solution |
|---------|----------|----------|
| Log files | /var/log/ | Configure logrotate, clean old logs |
| Old backups | /var/backups/ | Delete old backups |
| Package cache | /var/cache/apt/ | sudo apt clean |
| Old kernels | /boot/ | sudo apt autoremove |
Network Troubleshooting
# Active connections
ss -tuln
# Bandwidth per process
sudo apt install nethogs
sudo nethogs
# Network statistics
sudo apt install vnstat
vnstat
Quick Diagnostic Script
#!/bin/bash
echo "=== System Overview ==="
uptime
echo ""
echo "=== Memory ==="
free -h
echo ""
echo "=== Disk ==="
df -h /
echo ""
echo "=== Top CPU Processes ==="
ps aux --sort=-%cpu | head -5
echo ""
echo "=== Top Memory Processes ==="
ps aux --sort=-%mem | head -5
echo ""
echo "=== Network Connections ==="
ss -tuln | grep LISTEN
Save as diagnose.sh and run when something feels off.
When to Upgrade
| Sign | Current Plan Issue | |------|-------------------| | Consistent load > cores | Need more CPU | | OOM kills in logs | Need more RAM | | Disk constantly > 80% | Need more storage | | Bandwidth limits hit | Need more bandwidth |
Space-Node's VPS plans scale from small to large. Start with what you need and upgrade when monitoring tells you it's time, not before.
