Retrieve CPU usage and memory usage of a single process on Linux?
I want to get the CPU and memory usage of a single process on Linux — I know the PID. Hopefully, I can get it every second and write it to a CSV using the ‘watch’ command. What command can I use to get this info from the Linux command-line?
22 Answers 22
(You can leave off «cmd» but that might be helpful in debugging).
Note that this gives average CPU usage of the process over the time it has been running.
The assumption would be that if you care about a single processes’ memory usage enough to monitor it like this, it’s using a significant amount of memory so that the extra couple-of-megabytes due to shared mappings isn’t an issue.
Keep in mind that %cpu «is the CPU time used divided by the time the process has been running (cputime/realtime ratio), expressed as a percentage» (see manpage of ps ). This is not the real just in time CPU usage. It can also be very different from what top shows, for instance.
as said from Xebeche just above, ps -e -o pcpu,args will show the cpu average over the lifetime of the process, which is obviously not what you want if it is a long running process
This auto-refreshes the CPU usage so it’s good for monitoring.
@MatthiasBraun should be top -p $(pgrep -d’,’ process_name) please see stackoverflow.com/a/8710740/2402577
ps command (should not use):
Use top to get CPU usage in real time(current short interval):
top -b -n 2 -d 0.2 -p 6962 | tail -1 | awk »
- -b : Batch-mode
- -n 2 : Number-of-iterations, use 2 because: When you first run it, it has no previous sample to compare to, so these initial values are the percentages since boot.
- -d 0.2 : Delay-time(in second, here is 200ms)
- -p 6962 : Monitor-PIDs
- tail -1 : the last row
- awk » : the 9-th column(the cpu usage number)
This is the most accurate answer to get the current CPU usage, not an average over the lifetime of the process.
You can get the results by the name of the process using
the -C option allows you to use process name without knowing it’s pid.
e.g. to monitor these two process IDs (12345 and 11223) every 5 seconds use
$ pidstat -h -r -u -v -p 12345,11223 5
pidstat also gives a nice average. just a shame i have not found a more elegant way of pidstat -u 1 10 | grep ^Average | sort -r -n -b -k 8,8
Launch a program and monitor it
This form is useful if you want to benchmark an executable easily:
topp() ( if [ -n "$O" ]; then $* & else $* &>/dev/null & fi pid="$!" trap "kill $pid" SIGINT o='%cpu,%mem,vsz,rss' printf '%s\n' "$o" i=0 while s="$(ps --no-headers -o "$o" -p "$pid")"; do printf "$i $s\n" i=$(($i + 1)) sleep "$" done )
%cpu,%mem,vsz 0 0.0 0.0 177584 1 0.0 0.1 588024 2 0.0 0.1 607084 3 0.0 0.2 637248 4 0.0 0.2 641692 5 68.0 0.2 637904 6 80.0 0.2 642832
where vsz is the total memory usage in KiB, e.g. the above had about 600MiB usage.
If your program finishes, the loop stops and we exit topp .
Alternatively, if you git Ctrl + C, the program also stops due to the trap : How do I kill background processes / jobs when my shell script exits?
- T=0.5 topp ./myprog : change poll interval
- O=1 topp ./myprog : don’t hide program stdout/stderr. This can be useful to help correlate at which point memory usage bursts with stdout.
ps vs top on instantaneous CPU% usage
Note that the CPU usage given by ps above is not «instantaneous» (i.e. over the last N seconds), but rather the average over the processes’ entire lifetime as mentioned at: https://unix.stackexchange.com/questions/58539/top-and-ps-not-showing-the-same-cpu-result ps memory measures should be fine however.
That thread as well as: How can I determine the current CPU utilization from the shell? suggest that the Linux kernel does not store any more intermediate usage statistics, so the only way to do that would be to poll and calculate for the previous period, which is what top does.
We could therefore use top -n1 instead of ps if we wanted that:
toppp() ( $* &>/dev/null & pid="$!" trap exit SIGINT i=1 top -b n1 -d "$" -n1 -p "$pid" while true; do top -b n1 -d "$" -n1 -p "$pid" | tail -1; printf "$i "; i=$(($i + 1)); done )
as mentioned e.g. at: https://stackoverflow.com/a/62421136/895245 which produces output of type:
top - 17:36:59 up 9:25, 12 users, load average: 0.32, 1.75, 2.21 Tasks: 1 total, 1 running, 0 sleeping, 0 stopped, 0 zombie %Cpu(s): 13.4 us, 2.5 sy, 0.0 ni, 84.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st MiB Mem : 31893.7 total, 13904.3 free, 15139.8 used, 2849.7 buff/cache MiB Swap: 0.0 total, 0.0 free, 0.0 used. 16005.5 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 706287 ciro 20 0 590436 40352 20568 R 106.7 0.1 0:00.16 node 706287 ciro 20 0 607060 57172 21340 R 126.7 0.2 0:00.35 node 1 706287 ciro 20 0 642008 80276 21812 R 113.3 0.2 0:00.52 node 2 706287 ciro 20 0 641676 93108 21812 R 113.3 0.3 0:00.70 node 3 706287 ciro 20 0 647892 99956 21812 R 106.7 0.3 0:00.87 node 4 706287 ciro 20 0 655980 109564 21812 R 140.0 0.3 0:01.09 node
My only problems with this is that top is not as nice for interactive usage:
- Ctrl + C does not exit the above command, not sure why trap exit is not working as it does with ps . I have to kill the command Ctrl + \ , and then that does not kill the process itself which continues to run on the background, which means that if it is an infinite loop like a server, I have to ps aux and then kill it.
- the not exit automatically when the benchmarked program exits
Maybe someone more shell savvy than me can find a solution for those.
ps memory measurements should be the same as top however if you’re just after memory.
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:
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:
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:
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 ‘/9K/
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:
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:
Now make the file executable with the following command:
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:
Executing sysmon:
Thanks for reading this article.