Memory management is crucial for system performance and stability. When your Linux system runs low on physical RAM, it starts using swap space, which can significantly slow down operations. This guide shows you how to proactively monitor memory usage and detect when your system is about to start swapping.
Why Monitor Memory Before Swapping?
Swap space acts as overflow memory on your hard drive or SSD. While it prevents out-of-memory crashes, it's much slower than RAM:
- RAM access time: Nanoseconds
- SSD access time: Microseconds (1000x slower)
- HDD access time: Milliseconds (1,000,000x slower)
Detecting low memory early allows you to:
- Kill memory-hungry processes before performance degrades
- Prevent system slowdowns
- Plan memory upgrades
- Optimize application resource usage
Method 1: Using the free Command
The free command is the quickest way to check memory status:
free -h
Sample output:
total used free shared buff/cache available
Mem: 15Gi 8.2Gi 1.5Gi 234Mi 5.8Gi 6.9Gi
Swap: 2.0Gi 0B 2.0Gi
Key metrics to watch:
- available: This is the most important metric - it shows memory that can be allocated to applications
- Swap used: If this number is greater than 0, swapping has already started
-
Warning threshold: When
availabledrops below 10-15% of total memory
Method 2: Real-time Monitoring with top or htop
For continuous monitoring, use interactive tools:
Using top:
top
Look at the memory section (lines 3-4):
MiB Mem : 15869.2 total, 1543.7 free, 8421.5 used, 5903.9 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 7068.5 avail Mem
Using htop (more user-friendly):
htop
The memory bar at the top shows usage visually. Green indicates used memory, blue shows buffered memory, and yellow represents cache.
Method 3: Check Swap Activity with vmstat
The vmstat command shows if swapping is actively occurring:
vmstat 1 5
This displays statistics every 1 second for 5 iterations:
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1576832 185476 5903936 0 0 3 45 89 156 5 2 93 0 0
0 0 0 1576544 185476 5903968 0 0 0 0 892 1456 3 1 96 0 0
Critical columns:
- si (swap in): Memory being moved from swap to RAM
- so (swap out): Memory being moved from RAM to swap
If si or so show non-zero values, your system is actively swapping.
Method 4: Monitoring Available Memory Percentage
Create a simple script to check if available memory drops below a threshold:
#!/bin/bash
# Get available memory in MB
available=$(free -m | awk 'NR==2{print $7}')
total=$(free -m | awk 'NR==2{print $2}')
percentage=$((available * 100 / total))
echo "Available memory: ${percentage}%"
if [ $percentage -lt 15 ]; then
echo "WARNING: Low memory! Only ${percentage}% available"
echo "Top memory consumers:"
ps aux --sort=-%mem | head -n 6
fi
Save this as memory_check.sh, make it executable, and run it:
chmod +x memory_check.sh
./memory_check.sh
Method 5: Check Swap Configuration
Verify your swap setup:
# View active swap devices
swapon --show
# Check swap details in /proc
cat /proc/swaps
# View swappiness setting (how aggressively kernel uses swap)
cat /proc/sys/vm/swappiness
The swappiness value (0-100) controls swap usage:
- 0-10: Minimal swapping (suitable for high-RAM servers)
- 60: Default for most distributions
- 100: Aggressive swapping
To temporarily change swappiness:
sudo sysctl vm.swappiness=10
To make it permanent, add to /etc/sysctl.conf:
vm.swappiness=10
Method 6: Automated Monitoring with Memory Pressure Alerts
For production systems, set up automated alerts using systemd:
# Check memory pressure (requires systemd 240+)
systemctl show --property=MemoryHigh system.slice
You can also monitor memory pressure stall information:
cat /proc/pressure/memory
Output shows what percentage of time the system spent waiting for memory:
some avg10=0.00 avg60=0.00 avg300=0.15 total=142893
full avg10=0.00 avg60=0.00 avg300=0.00 total=0
Practical Warning Signs
Your system is likely to start swapping when:
- Available memory < 500 MB (for typical desktop/server)
- Available memory < 10% of total
- Buffer/cache being aggressively freed
- Applications becoming noticeably sluggish
- High I/O wait times in
top(wa column)
Best Practices
- Monitor regularly: Check memory weekly or set up automated alerts
- Know your baseline: Understand normal memory usage for your workload
- Identify memory leaks: Watch for processes with constantly growing memory usage
- Plan capacity: Keep 20-30% memory free for peaks
- Use swap wisely: Swap is a safety net, not a RAM replacement
Quick Reference Commands
# Quick memory check
free -h
# Continuous monitoring
watch -n 2 free -h
# Check if swapping is active
vmstat 1 5 | grep -v "0 0" | head -n 5
# View top memory consumers
ps aux --sort=-%mem | head -n 10
# Check memory pressure
cat /proc/pressure/memory
Conclusion
Proactive memory monitoring prevents performance degradation and system instability. By using tools like free, vmstat, and top, you can detect low memory conditions before swap usage begins.
The key is watching the available memory metric rather than just free memory, as Linux efficiently uses memory for caching. When available memory consistently drops below 15% of total, it's time to investigate memory usage or consider a RAM upgrade.
Remember: Swap is for emergencies, not for regular use. If your system regularly uses swap, you need more RAM or need to optimize your applications.
Top comments (1)
Thanks for this article, very helpful!