How to log memory and cpu usage of an application?
Similar to question How to log CPU load?, I would like to log memory of a process.
The process I want to log, is killed on a remote server, and I want to find out the CPU load and the memory usage just before it was killed.
[update]
Both Stefano Palazzo's neat little python script and
Michał's one line output values that are smaller than in top
for CPU and Mem. Do you have an idea why?
output top:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2312 schXX 20 0 1241m 328m 58m S 100 0.3 11:56.68 MATLAB
output Stefano Palazzo's python script:
python memlogger.py 2312
%CPU %MEM
76.00 0.20
76.00 0.20
You can create one-liner in shell:
logpid() { while sleep 1; do ps -p $1 -o pcpu= -o pmem= ; done; }
to log process with pid=123 just:
logpid 123
or to see and write log to file:
logpid $$ | tee /tmp/pid.log
If you want other data to be logged, modify -o {this}
options. See man ps
section "STANDARD FORMAT SPECIFIERS" for available parameters to use. If you want different time resolution, change sleep {this}
in function logpid()
.
If you are precisely after the top
statistics you could run top
in batch mode specifying the pid of the process that you are after. Taking the example from this page (http://www.dedoimedo.com/computers/linux-cool-hacks.html) if you typed
top -b -d 10 -n 3 >> top-file
You would "have top running in batch mode (-b). It's going to refresh every 10 seconds, as specified by the delay (-d) flag, for a total count of 3 iterations (-n). The output will be sent to a file." Including -p
you can specify the pid
of the process that you are after. This will of course return more than purely cpu and ram but it will contain thos fields. In my case for example I would get the following when monitoring pid 9189 using top -b -d 10 -n 3 -p 9189 >> ~/top-file
:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9189 pmj27 20 0 1617016 808112 27916 S 0.0 0.3 1:36.63 gedit
This simple python script should do what you want:
import time
import string
import sys
import commands
def get_cpumem(pid):
d = [i for i in commands.getoutput("ps aux").split("\n")
if i.split()[1] == str(pid)]
return (float(d[0].split()[2]), float(d[0].split()[3])) if d else None
if __name__ == '__main__':
if not len(sys.argv) == 2 or not all(i in string.digits for i in sys.argv[1]):
print("usage: %s PID" % sys.argv[0])
exit(2)
print("%CPU\t%MEM")
try:
while True:
x,y = get_cpumem(sys.argv[1])
if not x:
print("no such process")
exit(1)
print("%.2f\t%.2f" % (x,y))
time.sleep(0.5)
except KeyboardInterrupt:
print
exit(0)
You first need to find out the process id of the program you want to monitor, then you can run the script with the PID as an argument:
python log.py 3912
It will print the cpu usage and ram usage in per cent two times a second:
%CPU %MEM
0.90 0.40
1.43 0.40
8.21 0.40
...
You can then redirect its output to a file in order to import it into a spreadsheet later (python log.py 9391 > firefox_log.txt
) and import the data into a spreadsheet selecting Tab
as your separator.
The program quits when you hit Ctrl+C or when the process is killed.