Linux Commands

How to Check Memory Usage Per Process on Linux

These days, a computer can run many programs at once. The CPU has no problem handling all these programs because CPUs has multiple cores to handle multi-tasking.

Each of these programs runs as one or more processes. Every process allocates some amount of RAM or memory for itself. It is essential for the process to function correctly. If a process fails to allocate enough RAM or memory, then the process can’t be created and the program won’t be able to start.

So, one of the basic task you do on your computer is to check how much memory or RAM (Random Access Memory) each of the process is using. Because, RAM or memory of your computer is limited.

Imagine a case, where you want to run some program and it fails because you don’t have enough memory. May be some of the processes are using a lot of memory that you don’t need right now. You can kill or stop these processes to free up RAM or memory, so that you can start your important programs.

In this article, I will show you how to check memory usage of each of the processes running on your Linux machine. I will be using Debian 9 Stretch for all the demonstration in this article. But it should work on any modern Linux distributions. Let’s get started.

Checking Memory Usage Using ps Command:

You can use the ps command to check memory usage of all the processes on Linux. There is one problem with this procedure. ps don’t really show you how much memory a process uses in KB or MB format, but it will show you how much memory is being used in percentage.

You can check memory usage (in percentage) of all the process running on your Linux operating system with the following command:

$ ps -o pid,user,%mem,command ax | sort -b -k3 -r

As you can see, all the processes with memory usage in percentage is listed in descending order (The processes using most of the memory is listed first).

Checking Memory Usage of Processes with pmap:

You can check memory of a process or a set of processes in human readable format (in KB or kilobytes) with pmap command. All you need is the PID of the processes you want to check memory usage of.

Let’s say, you want to check how much memory the process with PID 917 is using. To do that, run pmap as follows:

$ sudo pmap 917

As you can see, the total memory used by the process 917 is 516104 KB or kilobytes. You can also see how much memory the libraries and other files required to run the process with PID 917 is using as well here.

If you don’t care about how much memory the libraries or other dependent files are using, then run pmap as follows:

$ sudo pmap 917 | tail -n 1

As you can see, only the total memory used by the process with PID 917 is printed on the screen.

If you want, you can further filter this with awk and get only the size in KB or kilobytes. To do that, run pmap as follows:

$ sudo pmap 917 | tail -n 1 | awk '/[0-9]K/{print $2}'

As you can see, only the memory usage in KB or kilobytes is printed.

Now you can also list how much memory is used by multiple processes using their PIDs with pmap as follows:

$ sudo pmap 917 531 | grep total

NOTE: Here 917 and 531 are process IDs or PIDs. You can put as many PIDs as you want this way.

Using pmap to List Memory Usage of All the Processes in Kilobytes:

In this section, I will show you how to write your own shell script to list memory usage of all the processes running on your Linux operating system in human readable format (kilobytes or KB).

First make a new file sysmon in your current working directory with the following command:

$ touch sysmon

Now make the file executable with the following command:

$ chmod +x sysmon

sysmon is the shell script that will display all the running processes PID, OWNER, MEMORY (in KB in descending order) and COMMAND. Let’s start.

Open the sysmon script with your favorite text editor, I am going to use Kate.

Now, the first command I am going to run will give me the PID, OWNER and COMMAND of all the running processes separated by colon (:) symbol and store it in the RAWIN variable. Then loop through the output and print it on the screen.

As you can see, I am getting the correct output.

Now it’s time to process each line, store the colon delimited information in separate variables. That’s what I did on line 7, 8 and 9.

As you can see, I can print PID, OWNER and COMMAND in my own format now.

Now it’s time to fetch memory usage of each PID. Line 10 does just that.

As you can see, everything is working perfectly. Now I can print memory usage of each process in kilobytes (KB) as well.

Now all that is left to do is format the output to look nice. I prefer table format. Line 5 prints the header of each column of the table.

Finally, I printed PID, OWNER, MEMORY (in KB) and COMMAND of each processes in a tabular format using line 14.

As you can see, it’s working kinda well. There is a little bit of problem though, the processes are not correctly sorted in descending order by memory usage.

To fix that, I removed sort -bnr -k3 from line 3 and wrapped everything in a shell function sysmon_main(). Then left the job of sorting to the sort command.

The final shell script looks something like this:

As you can see, it works great.

Now you can move it to somewhere like /usr/bin and execute it just like other commands as follows:

$ sudo mv -v sysmon /usr/bin

Executing sysmon:

Thanks for reading this article.

About the author

Shahriar Shovon

Freelancer & Linux System Administrator. Also loves Web API development with Node.js and JavaScript. I was born in Bangladesh. I am currently studying Electronics and Communication Engineering at Khulna University of Engineering & Technology (KUET), one of the demanding public engineering universities of Bangladesh.