Searching a process' memory on Linux
I've developed some code for the requested functionality.
The module memutil provides process memory region iteration, and python or C memory reading with assistance from the ptrace module, and readmem executable.
If there is any questions, or requests for standalone tools, just ask.
Reading living process memory without interrupting it
For process 1234 you can get its memory map by reading sequentially /proc/1234/maps
(a textual pseudo-file) and read the virtual memory by e.g. read(2)-ing or mmap(2)-ing appropriate segments of the /proc/1234/mem
sparse pseudo-file.
However, I believe you cannot avoid some kind of synchronization (perhaps with ptrace(2), as gdb
does), since the process 1234 can (and does) alter its address space at any time (with mmap
& related syscalls).
The situation is different if the monitored process 1234 is not arbitrary, but if you could improve it to communicate somehow with the monitoring process.
I'm not sure to understand why do you ask this. And gdb
is able to watch
some location without stopping the process.
How can I measure the actual memory usage of an application or process?
With ps
or similar tools you will only get the amount of memory pages allocated by that process. This number is correct, but:
does not reflect the actual amount of memory used by the application, only the amount of memory reserved for it
can be misleading if pages are shared, for example by several threads or by using dynamically linked libraries
If you really want to know what amount of memory your application actually uses, you need to run it within a profiler. For example, Valgrind can give you insights about the amount of memory used, and, more importantly, about possible memory leaks in your program. The heap profiler tool of Valgrind is called 'massif':
Massif is a heap profiler. It performs detailed heap profiling by taking regular snapshots of a program's heap. It produces a graph showing heap usage over time, including information about which parts of the program are responsible for the most memory allocations. The graph is supplemented by a text or HTML file that includes more information for determining where the most memory is being allocated. Massif runs programs about 20x slower than normal.
As explained in the Valgrind documentation, you need to run the program through Valgrind:
valgrind --tool=massif <executable> <arguments>
Massif writes a dump of memory usage snapshots (e.g. massif.out.12345
). These provide, (1) a timeline of memory usage, (2) for each snapshot, a record of where in your program memory was allocated. A great graphical tool for analyzing these files is massif-visualizer. But I found ms_print
, a simple text-based tool shipped with Valgrind, to be of great help already.
To find memory leaks, use the (default) memcheck
tool of valgrind.
In Linux, how to tell how much memory processes are using?
Getting right memory usage is trickier than one may think. The best way I could find is:
echo 0 $(awk '/TYPE/ {print "+", $2}' /proc/`pidof PROCESS`/smaps) | bc
Where "PROCESS" is the name of the process you want to inspect and "TYPE" is one of:
Rss
: resident memory usage, all memory the process uses, including all memory this process shares with other processes. It does not include swap;Shared
: memory that this process shares with other processes;Private
: private memory used by this process, you can look for memory leaks here;Swap
: swap memory used by the process;Pss
: Proportional Set Size, a good overall memory indicator. It is the Rss adjusted for sharing: if a process has 1MiB private and 20MiB shared between other 10 processes, Pss is 1 + 20/10 = 3MiB
Other valid values are Size
(i.e. virtual size, which is almost meaningless) and Referenced
(the amount of memory currently marked as referenced or accessed).
You can use watch
or some other bash-script-fu to keep an eye on those values for processes that you want to monitor.
For more informations about smaps
: http://www.kernel.org/doc/Documentation/filesystems/proc.txt.
How to find the memory consumption of a particular process in linux for every 5 seconds
you may use SNMP to get the memory and cpu usage of a process in a particular device in network :)
Requirements:
- the device running the process should have snmp installed and running
- snmp should be configured to accept requests from where you will run the script below(it may be configured in snmpd.conf)
- you should know the process id(pid) of the process you want to monitor
Notes:
HOST-RESOURCES-MIB::hrSWRunPerfCPU is the number of centi-seconds of the total system's CPU resources consumed by this process. Note that on a multi-processor system, this value may increment by more than one centi-second in one centi-second of real (wall clock) time.
HOST-RESOURCES-MIB::hrSWRunPerfMem is the total amount of real system memory allocated to this process.
**
Process monitoring script:
**
echo "IP: "
read ip
echo "specfiy pid: "
read pid
echo "interval in seconds:"
read interval
while [ 1 ]
do
date
snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfCPU.$pid
snmpget -v2c -c public $ip HOST-RESOURCES-MIB::hrSWRunPerfMem.$pid
sleep $interval;
done
How to check the (absolute) memory usage of a process?
To convert Nate Eldredge's comments to an answer, firstly, the 0.3
output is a percentage, so 0.3% of 64 GB is 192 MB.
Secondly, the rss
output should give the resident set size:
rss RSS resident set size, the non-swapped physical
memory that a task has used (in kilobytes).
(alias rssize, rsz).
Running this command gives
> ps -p 24257 -o %mem,rss
%MEM RSS
0.3 209908
The output of ~21 Mb agrees pretty well with the estimate of ~19 Gb derived from the %MEM
output.
Related Topics
Execute Command Line and Return Command Output
Linux:How to Set Default Route from C
Cannot Use Wildcard in Kernel Module Makefile
Rename Files and Directories (Add Prefix)
Can You Attach Amazon Ebs to Multiple Instances
Show Special Characters in Unix While Using 'Less' Command
Determine Target Isa Extensions of Binary File in Linux (Library or Executable)
Equivalent of Ctrl C in Command to Cancel a Program
What Is the Use of Various Qt Platform Plugins
How to Fix "Go Not Root Owned"
How to Set a Variable Used in a Perl Script as Environment Variable
Extending a Script to Loop Over Multiple Files and Generate Output Names
Signals and Interrupts a Comparison
How to Convert an Image to Grayscale via the Command Line
How to Install SQL * Plus Client in Linux
Permission Denied When Trying to Append a File to a Root Owned File with Sudo