Your Linux or macOS computer is using virtual memory. Discover how it’s affecting your system’s use of physical memory, CPU, and hard disk resources.
What Is Virtual Memory?
Your computer is fitted with a finite amount of physical memory called random access memory (RAM). This RAM needs to be managed by the kernel and shared between the operating system and whatever applications happen to be running. If these combined demands are asking for more memory than is physically installed in your computer, what can the kernel do?
Linux and Unix-like operating systems such as macOS can use space on your hard disk to help them manage memory demands. A reserved area of hard drive space called “swap space” can be used as though it were an extension of RAM. This is virtual memory.
The Linux kernel can write the contents of a block of memory into swap space, and free up that region of RAM for use by another process. The swapped out—also called “paged” out—memory can be retrieved from the swap space and restored to RAM when it is required.
Of course, the speed of access for paged out memory is slower than that of memory held in RAM. And that’s not the only trade-off. Whilst virtual memory does provide a way for Linux to manage its memory demands, using virtual memory places increased burdens elsewhere on the computer.
Your hard drive must perform more reads and writes. The kernel—and hence, the CPU—must do more work as it swaps memory out, swaps memory in, and keeps all the plates spinning to satisfy the memory needs of the different processes.
Linux provides a way for you to monitor all of this activity in the shape of the
vmstatcommand, which reports on virtual memory statistics.
The vmstat Command
If you type
vmstat as a command with no parameters, it will show you a set of values. These values are the averages for each of the statistics since your computer was last rebooted. These figures are not a snapshot of the values “right now.”
A short table of values is displayed.
There are columns headed Procs, Memory, Swap, IO, System, and CPU. The final column (most right-hand column) contains the data relating to the CPU.
Here is a list of the data items in each column.
- r: The number of runnable processes. These are processes that have been launched and are either running or are waiting for their next time-sliced burst of CPU cycles.
- b: The number of processes in uninterruptible sleep. The process isn’t sleeping, it is performing a blocking system call, and it cannot be interrupted until it has completed its current action. Typically the process is a device driver waiting for some resource to come free. Any queued interrupts for that process are handled when the process resumes its usual activity.
- swpd: the amount of virtual memory used. In other words, how much memory has been swapped out.,
- free: the amount of idle (currently unused) memory.
- buff: the amount of memory used as buffers.
- cache: the amount of memory used as cache.
- si: Amount of virtual memory swapped in from swap space.
- so: Amount of virtual memory swapped out to swap space.
- bi: Blocks received from a block device. The number of data blocks used to swap virtual memory back into RAM.
- bo: Blocks sent to a block device. The number of data blocks used to swap virtual memory out of RAM and into swap space.
- in: The number of interrupts per second, including the clock.
- cs: The number of context switches per second. A context switch is when the kernel swaps from system mode processing into user mode processing.
These values are all percentages of the total CPU time.
- us: Time spent running non-kernel code. That is, how much time is spent in user time processing and in nice time processing.
- sy: Time spent running kernel code.
- id: Time spent idle.
- wa: Time spent waiting for input or output.
- st: Time stolen from a virtual machine. This is the time a virtual machine has to wait for the hypervisor to finish servicing other virtual machines before it can come back and attend to this virtual machine.
Using a Time Interval
We can have
vmstat provide regular updates to these figures by using a
delay value. The
delay value is provided in seconds. To have the statistics updated every five seconds, we’d use the following command:
Every five seconds
vmstat will add another line of data to the table. You’ll need to hit Ctrl+C to stop this.
Using a Count Value
Using too low a
delay value will put additional strain on your system. If you need to have rapid updates to try to diagnose a problem, it is recommended that you use a
count value as well as a
count value tells
vmstat how many updates to perform before it exits and returns you to the command prompt. If you do not provide a
vmstat will run until it is stopped by Ctrl+C.
vmstat provide an update every five seconds—but only for four updates—use the following command:
vmstat 5 4
After four updates
vmstat stops of its own accord.
Changing the Units
You can choose to have the memory and swap statistics displayed in kilobytes or megabytes using the
-S (unit-character) option. This must be followed by one of
M. These represent:
- k:1000 bytes
- K: 1024 bytes
- m: 1000000 bytes
- M: 1048576 bytes
To have the statistics updated every 10 seconds with the memory and swap statistics displayed in megabytes, use the following command:
vmstat 10 -S M
The memory and swap statistics are now shown in megabytes. Note that the
-S option does not affect the IO block statistics. These are always displayed in blocks.
Active and Inactive Memory
If you use the
-a (active) option the buff and cache memory columns are replaced by the “inact” and “active” columns. As they would suggest, these show the amount of inactive and active memory.
To see these two columns instead of the buff and cache columns, include the
-a option, as shown:
vmstat 5 -a -S M
The inact and active columns are affected by the -S (unit-character) option.
-f switch displays the number of forks that have happened since the computer was booted up.
In other words, this shows the number of tasks that have been launched (and, for the bulk of them, closed again) since the system was booted. Every process launched from the command line would increase this figure. Each time a task or process spawns or clones a new task, this figure will increase.
The forks display does not update.
The kernel has its own memory management to worry about as well as the memory management for the operating system and all of the applications.
As you might imagine the kernel is allocating and deallocating memory over and over for the many different types of data object that it must handle. To make this as efficient as possible, it uses a system called slabs. This is a form of caching.
Memory allocated, used, and no longer required for a specific type of kernel data object can be re-used for another data object of the same type without the memory being deallocated and reallocated. Think of slabs as pre-allocated, made to measure, segments of RAM for the kernel’s own needs.
To see the statistics for the slabs, use the
-m (slabs) option. You will need to use
sudo, and you will be prompted for your password. As the output can be quite lengthy, we are piping it through
sudo vmstat -m | less
The output has five columns. These are:
- Cache: Name of the cache.
- num: The number of currently active objects in this cache.
- total: The total number of available objects in this cache.
- size: The size of each object in the cache.
- pages: The total number of memory pages that have (at least) one object currently associated with this cache.
q to leave
Displaying Event Counters and Memory Statistics
To display a page of event counters and memory statistics, use the
-s (stats) option. Note that’s a lowercase “s.”
Although the statistics that are reported are largely the same as the information that makes up the default
vmstat output, some of them are split out in more detail.
For example, the default output combines both the nice and the non-nice user CPU time into the “us” column. The -s (stats) display lists these statistics separately.
Displaying Disk Statistics
You can obtain a similar listing of disk statistics using the
-d (disk) option.
vmstat -d | less
For each disk, three columns are displayed, these are Reads, Writes, and IO.
IO is the rightmost column. Note that the sec column in IO is measured in seconds but the time-based statistics in the read and write columns are measured in milliseconds.
This is what the columns mean:
- total: The total count of disk reads.
- merged: The total count of grouped reads.
- sectors: The total count of sectors that have been read in.
- ms: Total count of time in milliseconds that were used reading data from the disk.
- total: The total count of disk writes.
- merged: The total count of grouped writes.
- sectors: The total count of sectors written to.
- ms = Total count of time in milliseconds that were used writing data to the disk.
- cur: Number of current disk reads or writes.
- sec: Time spent in seconds for any in-progress reads or writes.
Displaying Summary Disk Statistics
To see a quick display of summary statistics for your disk activity, use the
-D (disk-sum) option. Note the uppercase “D.”
The number of disks might look abnormally high. The computer used to research this article is running Ubuntu. With Ubuntu, each time you install an application from a Snap, a
squashfspseudo-filesystem is created which is attached to a /dev/loop device.
Annoyingly these device entries are counted as hard drive devices by many of the Linux commands and utilities.
Displaying Partition Statistics
To see statistics related to a specific partition, use the
-p (partition) option and provide the partition identifier as a command line parameter.
Here we are going to look at the partition
sda1. The digit one indicates this is the first partition on device
sda, which is the main hard drive for this computer.
vmstat -p sda1
The information returned shows the total count of disk reads and disk writes to and from that partition, and the number of sectors included in disk read and disk write actions.
A Peek Under The Hood
It’s always good to know how to lift the hood and see what’s going on underneath. Sometimes you’ll be trying to problem solve, sometimes it’ll be out of interest because you want to know how your computer ticks.
vmstat can provide you with a ton of useful information. Now you know how to access it and what it means. And forewarned is forearmed—when you do need to roll your sleeves up and do some diagnostics, you’ll know you’ve got
vmstat on your side.