Recently we need to find RAM(aka Physical memory) used by a User.. I thought it’s bit easy to find RAM usage by using a group of commands and chaining them to get desired output. Let me explain what I did to get RAM usage of a user and came to know it’s blunder mistake to go in that way to find the RAM use by a user. Join me to dig in to this and which led to find real RAM used by a user with other command called smem
Commands used by me to find the user RAM utilization earlier are as follows..
1)pmap –To map all the RAM used by a process
2)pgrep –To grep/get all the process for a user/Application
3)grep –To filter some data
4)awk to filter some column
For example find the RAM utilised by a user, we used following command
pmap `pgrep -u 1000` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'
Let me explain the command
pgrep -u 1000 this command is to get all the process ID for the user whose UID is 1000
Example clipped output
pgrep -u 1000
1602
1621
1651
pmap `pgrep -u 1000` will display all the memory details for the process run
Example clipped output
pmap `pgrep -u 1000`
1602: /usr/bin/gnome-keyring-daemon --daemonize --login
0000000000400000 840K r-x-- /usr/bin/gnome-keyring-daemon
00000000006d2000 36K r---- /usr/bin/gnome-keyring-daemon
00000000006db000 12K rw--- /usr/bin/gnome-keyring-daemon
00000000006de000 8K rw--- [ anon ]
pmap `pgrep -u 1000` | grep total will grep "total" word from the pmap output.
Example clipped output
pmap `pgrep -u 1000` | grep total | more
total 84872K
total 237228K
total 0K
total 26308K
total 25560K
pmap `pgrep -u 1000` | grep total | awk '{print $2}' will display only total memory usage by each process
pmap `pgrep -u 1000` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}' To add all the RAM displayed by pmap command..
Example output
pmap `pgrep -u 1000` | grep total | awk '{print $2}' | awk '{s+=$1}END{print s}'
12954040
The above value is in KB, So my total RAM used by the user is 12.95GB. Which is blunder mistake as my Total RAM is just 3GB.
#free -m
total used free shared buffers cached
Mem: 2982 2951 30 0 146 1834
-/+ buffers/cache: 970 2011
Swap: 9535 0 9535
then where is this 12.95GB RAM came from?
This is because large portions of RAM shared between different Application using same libraries which will over-estimate the RSS(resident set size). If we need to see real RAM utilisation ie proportional set size (PSS) there is a command smem(Show MEMory) from kernel 2.6.27 to check actual RAM utilised by User.
How to get smem?
On ubuntu based machines:
#apt-get install smem
On Redhat based machines:
#yum install smem
how to use this command
#smem -u username
Example
smem -u surendra
User Count Swap USS PSS RSS
surendra 60 0 703132 730122 1051560
Note:The values are in KB
So real RAM utilised by user Surendra is 730MB(PSS value).
Even you can add USS, PSS, RSS which will give us total Memory used by user here it’s 12.95GB which we get in our chained commands.
Please share your thoughts on this, if you have other means to check RAM used by a user/application.
Latest posts by Surendra Anne (see all)
- Docker: How to copy files to/from docker container - June 30, 2020
- Anisble: ERROR! unexpected parameter type in action:
Fix - June 29, 2020 - FREE: JOIN OUR DEVOPS TELEGRAM GROUPS - August 2, 2019
- Review: Whizlabs Practice Tests for AWS Certified Solutions Architect Professional (CSAP) - August 27, 2018
- How to use ohai/chef-shell to get node attributes - July 19, 2018