📊 Understanding AWS EC2 Volume Monitoring

If your Laravel application hosted on an EC2 instance (e.g., t3.small
) is slowing down or crashing occasionally, this guide will help you understand how to monitor and troubleshoot it using EBS Volume Metrics.
Here’s a simple, analogy-driven explanation of each CloudWatch Volume Monitoring metric, along with thresholds and remediation steps.
🔧 1. Stalled I/O Check
What it means: Checks if the disk was ever stuck or frozen while reading/writing.
Analogy: Like trying to open a jammed drawer that refuses to move.
✅ Healthy:
0
🚨 Critical:
> 0
🛠️ Action: Check EBS health. Restart may help temporarily, but consider switching to a more reliable volume (e.g., gp3).
📈 2. Average Read Latency (ms/op)
What it means: Time it takes to complete each read.
Analogy: Like waiting for someone to hand you a file from a cabinet.
✅ Healthy:
< 1 ms
⚠️ Warning:
1 – 5 ms
🚨 Critical:
> 5 ms
🛠️ Action: Optimize DB queries, increase instance type or move to faster EBS type (e.g., io2).
📝 3. Average Write Latency (ms/op)
What it means: Time it takes to save data.
Analogy: Like writing to a notepad and needing a second to flip pages.
✅ Healthy:
< 1 ms
⚠️ Warning:
1 – 5 ms
🚨 Critical:
> 5 ms
🛠️ Action: Optimize Laravel logging, queues, and DB writes.
📤 4. Read Throughput (KiB/s)
What it means: Volume of data being read per second.
Analogy: Like the speed at which you're reading pages in a book.
📊 Normal: Depends on app usage
🚨 Spikes > 1000 KiB/s: Review app/database access patterns
🛠️ Action: Check for traffic spikes or bots hitting endpoints.
📥 5. Write Throughput (KiB/s)
What it means: Volume of data being written per second.
Analogy: Like how fast you can write into a journal continuously.
📊 Normal: < 500 KiB/s
🚨 Spikes > 1000 KiB/s: Could be batch jobs, error logs
🛠️ Action: Check Laravel log files, scheduled jobs, DB writes.
🔁 6. Read/Write Operations (Ops/s)
What it means: Number of I/O operations per second.
Analogy: Like how many items you can put into or pull out from a box every second.
📊 Normal: < 100 Ops/s
🚨 Spikes: May mean loops, high traffic
🛠️ Action: Inspect logs for loops, Laravel jobs, or queue bursts.
🧮 7. Average Queue Length (Operations)
What it means: Number of operations waiting to be processed.
Analogy: Like a line of people waiting to use one computer.
✅ Healthy: < 1
🚨 Critical: > 2
🛠️ Action: Consider upgrading to faster EBS or scaling EC2 instance.
⏳ 8. Time Spent Idle (%)
What it means: Time the disk is doing nothing.
Analogy: Like how long your assistant waits around between tasks.
✅ Healthy: > 80%
⚠️ Warning: < 30%
🛠️ Action: Indicates your server is constantly busy—review traffic patterns or background jobs.
🔍 9. Average Read/Write Size (KiB/op)
What it means: Size of each I/O operation.
Analogy: Like sending a tweet vs sending a novel by mail.
📊 Normal: <= 64 KiB
🚨 Warning: > 128 KiB
🛠️ Action: Optimize large file reads/writes, check backup or export scripts.
🪫 10. Burst Balance (%)
What it means: Available performance credits for burstable volume types.
Analogy: Like using battery boosters when your regular power isn’t enough.
✅ Healthy: 100%
⚠️ Warning: < 30%
🚨 Critical: < 10%
🛠️ Action: Switch to provisioned IOPS (io1/io2) or gp3 for sustained workloads.
🧠 Pro Tips for Laravel on EC2
📦 Optimize Laravel Queues: Use
redis
orsqs
, and process withhorizon
or supervisor.🗂️ Limit Logging: Set
LOG_LEVEL=error
to reduce write load.🔄 Use CloudWatch Alarms: Set thresholds above and get alerts.
🔍 Monitor Memory & CPU too: Use EC2 instance metrics for a full picture.
🔐 Enable Fail2Ban / WAF: If you suspect bot or brute-force attacks.
By monitoring these metrics regularly and acting on threshold breaches, you can keep your Laravel application stable and performance.
Subscribe to my newsletter
Read articles from Trushang Suthar directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by

Trushang Suthar
Trushang Suthar
Code is like a puzzle—sometimes you just need to step back, take a breath, and the solution clicks.