Get chrome's total memory usage

Given that google killed chrome://memory in March 2016, I am now using smem:

# detailed output, in kB apparently
smem -t -P chrom
# just the total PSS, with automatic unit:
smem -t -k -c pss -P chrom | tail -n 1
  • to be more accurate replace chrom by full path e.g. /opt/google/chrome or /usr/lib64/chromium-browser
  • this works the same for multiprocess firefox (e10s) with -P firefox
  • be careful, smem reports itself in the output, an additional ~10-20M on my system.
  • unlike top it needs root access to accurately monitor root processes -- use sudo smem for that.
  • see this SO answer for more details on why smem is a good tool and how to read the output.

I'm sure that it's not the best solution, still it works for me:

#!/bin/sh
ps aux | grep "[/]opt/google/chrome/chrome" | awk '{print $5}' | awk '{sum += $1 } END { print sum }' 
ps aux | grep "[/]opt/google/chrome/chrome" | awk '{print $6}' | awk '{sum += $1 } END { print sum }' 

Note: change the [/]opt/google/chrome/chrome to something appropriate for your system, e.g. if you're on Mac OS X (simply grep "chrome" will work).


Running this:

perl -e '$a="x"x1000000000;sleep(10);print"done\n"'

takes up 1.8GB RAM. So you would expect running this:

perl -e '$a="x"x1000000000;fork;fork;fork;fork;sleep(10);print"done\n"'

would take up 16 times as much. But it does not.

This is due to the Linux kernel's intelligent copy-on-write: Because the contents of '$a' does not change, then the memory of '$a' can be shared. But it will only remain shared until '$a' is changed. When that happens, the changed section will be copied and start to take up RAM.

Whether you can measure how much memory is copy-on-write over-committed I do not know. But at least this explains your over-counting.