When a VPS feels slow, the cause is almost always one of four things: CPU, memory, disk or network. Linux already ships the tools to tell which one, and a few small extras make them easier to read. This guide shows the commands to run on your own VPS, how to read their output, and how to set up a simple alert before a full disk or a memory leak takes your site down.
Start with uptime (load compared with your vCPU count), free -h (the available column), df -h (disk space) and htop (which process is busy). For history, install sysstat and use sar; for disk and network detail, use iostat -x, iotop and nload. A Domain India VPS is self-managed and the client area has no VPS graphs, so the monitoring you run inside the server, plus an outside uptime check, is your view of its health.
These commands run on a VPS or server where you have root access. On Domain India shared hosting (cPanel, DirectAdmin, Webuzo) you can't install tools or see the whole server; use your control panel's resource usage page instead, as described in how to check your hosting resource usage.
1. A thirty-second health check
Log in over SSH and run these four commands:
uptime # load averages for the last 1, 5 and 15 minutes
free -h # memory and swap
df -h # disk space per filesystem
nproc # number of vCPUs, to compare with the loadIf the 5- and 15-minute load is well below your vCPU count, memory available is comfortable, and every filesystem is under about 80%, the server is not short of resources and the problem is more likely in your application.
2. CPU and load
The load average counts processes running or waiting to run. Compare it with your vCPU count: a load of 2.0 on a 2-vCPU VPS means fully busy; a load that stays above the vCPU count means work is queuing.
For a live view, use top (built in) or htop (friendlier):
sudo apt install htop # Ubuntu or Debian
sudo dnf install htop # AlmaLinux or Rocky Linux (enable EPEL first if it is not found)
htopIn top, press 1 for per-core usage, P to sort by CPU and M to sort by memory. The CPU line matters more than the load figure:
| Field in top | Meaning | High value suggests |
|---|---|---|
| us | Time spent in your applications | Busy PHP, Node.js or database queries |
| sy | Time spent in the kernel | Heavy networking or many small file operations |
| wa | Waiting for disk | A storage bottleneck, even if CPU looks idle |
| st | Time taken by the hypervisor (steal) | The host is busy; note the times and tell support if it stays high |
| id | Idle | Nothing wrong |
3. Memory and swap
free -hRead the available column, not free. Linux uses spare memory as file cache (buff/cache) and hands it back when an application needs it, so low "free" memory is normal. Low "available" memory is not.
To find what is using memory, and to see whether the kernel has had to kill anything:
ps aux --sort=-%mem | head -n 11 # top 10 processes by memory
sudo journalctl -k | grep -i "out of memory"An "Out of memory: Killed process" line means the server ran out of RAM and the kernel stopped a process, often your database. Either reduce memory use (fewer PHP-FPM workers, a smaller database buffer) or move to a plan with more RAM.
Watch swap activity rather than swap size:
vmstat 2 5The si and so columns show memory moving to and from swap. Occasional small numbers are fine; steady non-zero values mean the server is short of RAM.
4. Disk space and disk speed
Space first:
df -h # space per filesystem
df -i # inodes: a disk can be "full" of small files
sudo du -xh / --max-depth=1 | sort -hr | head -15The usual culprits are logs in /var/log, old backups, database files and Docker images (docker system df shows those). A database or mail server stops working when the disk fills, so act at 80% and treat 90% as urgent.
Then speed. Install sysstat for iostat and iotop for per-process disk use:
sudo apt install sysstat iotop # or: sudo dnf install sysstat iotop
iostat -x 2 5
sudo iotop -oIn iostat, %util near 100 with a high r_await or w_await means the disk is the bottleneck. iotop -o shows only the processes doing disk work right now.
5. Network and connections
sudo apt install nload iftop # or install them with dnf (EPEL)
nload # live bandwidth in and out
sudo iftop -i eth0 # traffic per connection; check your interface name with: ip -br link
ss -s # connection totals
ss -tan state established | wc -l # open TCP connectionsA sudden jump in connections from a few IP addresses can be a bot or an attack rather than real visitors. Your web server logs and a firewall with rate limits help there; see the SSH security hardening checklist for the basics.
6. History with sysstat, and pressure stall information
The commands above show the present. sysstat also records history, so you can see what happened at 3 a.m.:
sudo systemctl enable --now sysstat # start collecting (Ubuntu/Debian may also need ENABLED="true" in /etc/default/sysstat)
sar -u # CPU today
sar -r # memory today
sar -d # disks todayModern kernels also report pressure stall information, which tells you how much time work was delayed waiting for CPU, memory or disk:
cat /proc/pressure/cpu /proc/pressure/memory /proc/pressure/iosome avg10=0.00 means nothing was waiting in the last ten seconds. Values that stay in double figures point straight at the resource you are short of.
For an all-in-one screen, glances combines CPU, memory, disk, network and processes. For dashboards and alerting across servers, see Linux server monitoring software compared.
7. A simple alert script
This script checks disk, memory and load, and posts a message to a webhook URL of your choice, such as a Slack, Discord or Telegram bot endpoint. It needs only curl.
sudo nano /usr/local/bin/resource-alert.sh#!/bin/sh
WEBHOOK="https://example.com/your-webhook" # replace with your own endpoint
HOST=$(hostname)
DISK=$(df --output=pcent / | tail -1 | tr -dc '0-9')
AVAIL_MB=$(free -m | awk '/^Mem:/ {print $7}')
LOAD=$(cut -d ' ' -f2 /proc/loadavg) # 5-minute load
CPUS=$(nproc)
MSG=""
[ "$DISK" -gt 85 ] && MSG="$MSG Disk / at ${DISK}%."
[ "$AVAIL_MB" -lt 200 ] && MSG="$MSG Only ${AVAIL_MB} MB memory available."
awk -v l="$LOAD" -v c="$CPUS" 'BEGIN { exit !(l > c) }' && MSG="$MSG Load $LOAD on $CPUS vCPU."
[ -n "$MSG" ] && curl -fsS -m 10 -H 'Content-Type: application/json' \
-d "{\"text\":\"$HOST:$MSG\"}" "$WEBHOOK" >/dev/nullsudo chmod 700 /usr/local/bin/resource-alert.sh
sudo crontab -e
# add this line to run it every 5 minutes:
*/5 * * * * /usr/local/bin/resource-alert.shAdjust the thresholds to your server. If you would rather receive email, send it through an external mail service; whether outbound mail on port 25 works from your VPS is something to confirm with support first.
If the VPS itself stops, this script stops too. Add an external uptime check that watches your website from outside, such as a hosted uptime service or Uptime Kuma on another machine.
8. When to upgrade, and how
Tune before you upgrade: a slow database query, too many PHP-FPM workers or an unrotated log often explains the numbers. Consider a bigger plan when, over several days of normal traffic:
- the 15-minute load stays above your vCPU count;
- memory available stays under about 10% of RAM, or the kernel kills processes;
- steady swap activity shows in
vmstat; - disk use keeps climbing past 80% after clean-up.
To move to a bigger plan, open a ticket naming the VPS and the plan you want; support confirms the price difference first. Cloning and resizing your VPS explains what happens and how to grow the disk afterwards.
9. Domain India VPS plans
A Domain India VPS is self-managed: you get root access and look after the operating system, security updates, monitoring and backups yourself. There is no VPS page with graphs in the client area, so the tools in this guide are how you watch your server. Start, stop, force restart or anything you can't do from inside the server goes through a ticket; to reboot, use sudo reboot over SSH, never poweroff, which leaves the VPS switched off. See managing your VPS.
Domain India list prices on 19 September 2026, excluding 18% GST, per month: VPS Starter ₹553 (1 vCPU, 2 GB RAM, 64 GB NVMe), VPS Basic ₹1,105 (2 vCPU, 4 GB RAM, 128 GB NVMe), VPS Standard ₹2,211 (4 vCPU, 8 GB RAM, 256 GB NVMe), VPS Pro ₹3,869 (6 vCPU, 16 GB RAM, 512 GB NVMe) and VPS Enterprise ₹6,632 (8 vCPU, 32 GB RAM, 1 TB NVMe). VPS plans are non-refundable once provisioned.
- 1 vCPU
- 2 GB DDR4 RAM
- 64 GB NVMe SSD Storage
- 2 TB Monthly Bandwidth
- 2 vCPU
- 4 GB DDR4 RAM
- 128 GB NVMe SSD Storage
- 3 TB Monthly Bandwidth
Frequently asked questions
How do I check CPU and memory usage on a Linux VPS?
Run uptime to see the load average and compare it with the vCPU count from nproc, free -h to see available memory, and htop or top to see which processes are using CPU and memory right now.
Why does free -h show almost no free memory?
Linux uses spare memory as file cache and releases it when applications need it. Look at the available column instead: that is the memory genuinely available for new work.
What is a good load average for my VPS?
Compare it with your vCPU count. A 15-minute load below the number of vCPUs means the server keeps up; a load that stays above it means work is waiting for CPU time.
Can I see my VPS resource graphs in the Domain India client area?
No. There is no VPS page with graphs in the client area. Use the commands in this guide, sysstat for history, or a monitoring tool such as Netdata or Prometheus on the VPS itself.
How do I find what is filling my VPS disk?
Run df -h to find the full filesystem, then sudo du -xh / --max-depth=1 | sort -hr | head to find the biggest folders. Logs, old backups, database files and Docker images are the usual causes.
How do I upgrade my Domain India VPS?
Open a support ticket naming the VPS and the plan you want. Support confirms the price difference before making the change. You may need to grow the partition and filesystem afterwards to use new disk space.
Ready for more room, or a server of your own? Compare VPS plans, read VPS vs shared hosting, or open a ticket to ask about an upgrade.
KVM VPS plans with NVMe storage and full root access, from one vCPU upwards.
See VPS plans