Metrics with pg_proctab
pg_proctab is a set of stored functions installed as a Postgres extension that
will let you access operating system statistics from the underlying server, such
as I/O, processor load, and memory usage.
You can enable pg_proctab for Crunchy Bridge by running:
CREATE EXTENSION pg_proctab;
Once you've enable the extension you have access to new functions to monitor system metrics.
System load
You can query load using pg_proctab by running:
SELECT * FROM pg_loadavg()
pg_proctab will provide you with:
load1— load average of last minuteload5— load average of last 5 minutesload15— load average of last 15 minuteslast_pid— last PID running
Load is going to give you a number relative to the number of CPUs you have, so you’ll need to know the total number of cores/virtual CPUs available. As the load numbers get closer to the number of CPUs you have, you are running on the high end of load. On a single-core machine, you want the number below 1.0. Or for example, if you have 4 cores, you want the number to be below 4.0.
The below query will give you your percentage of load if you have a 4-core setup.
SELECT load15/4*100
FROM pg_loadavg();
Memory usage
To query memory usage you can run:
SELECT *
FROM pg_memusage();
The above will return:
memusedmemfreememsharedmembuffersmemcachedswapusedswapfreeswapcached
Memory usage will show memory used, free memory, memory shared, swap used and free. If you start regularly seeing swap used, it's time to look at getting a provision with additional memory.
Here’s an easy one to check the free memory
SELECT pg_size_pretty(memfree*1024)
FROM pg_memusage();
CPU time and I/O
To monitor CPU and I/O you can run:
SELECT *
FROM pg_cputime();
This is going to get you:
- user nice
- system idle
- iowait
User will give you all the non-system programs using cpu, system is the other system/kernel cpu process, and idle is the idle/free processes. So you can get pretty close to getting CPU usage by totaling idle, user, and system and diving by idle. The below example gives a sample of that:
SELECT idle/(idle + "user" + system)*100
FROM pg_cputime();