像top和ps这样的工具可以为我提供当前分配给进程的内存量,但我感兴趣的是测量自创建以来或在给定时间间隔内分配给进程的最大内存量.有关如何找出的任何建议?
解决方法
您可以在以下位置获取某个进程的峰值内存使用情况:
grep VmPeak /proc/$PID/status
(将$PID更改为您正在寻找的实际进程ID).
VmPeak是进程自启动以来使用的最大内存量.
为了跟踪进程的内存使用情况,您可以使用名为munin的工具进行跟踪,并向您显示内存使用情况随时间变化的精确图表.
Munin附带了许多用于跟踪系统资源的默认插件,但它没有附带跟踪Peak内存使用的插件 – 幸运的是,它非常容易为它编写插件.
这是一个munin插件的示例,用于跟踪apache进程的VmPeak,VmRSS和VmSize内存使用情况.您可以根据需要进行更改(只需指向正确的PID文件并根据需要更改组件名称).
它输出的图形看起来像这样(VmPeak和VmSize在这个例子中是相同的,所以你只看到其中一个):
注意:这仅监视主apache进程,并且不显示其子进程的内存使用情况.
#!/bin/bash # # Parameters: # # config (required) # autoconf (optional - used by munin-config) # COMPONENT_NAME="Apache" COMPONENT_PID_FILE="/var/run/apache2.pid" if [ "$1" = "autoconf" ]; then if [ -r /proc/stat ]; then echo yes exit 0 else echo "no (/proc/stat not readable)" exit 1 fi fi if [ "$1" = "config" ]; then echo "graph_title $COMPONENT_NAME memory usage" echo 'graph_vlabel' echo "graph_category Processes" echo "graph_info This graph shows the amount of memory used by the $COMPONENT_NAME processes" echo "${COMPONENT_NAME}_vmpeak.label $COMPONENT_NAME VmPeak" echo "${COMPONENT_NAME}_vmsize.label $COMPONENT_NAME VmSize" echo "${COMPONENT_NAME}_vmRSS.label $COMPONENT_NAME VmRSS" echo 'graph_args --base 1024' exit 0 fi check_memory () # $1 - PID location # $2 - process_label { pid_location=$1 process_label=$2 read pid < $pid_location procpath="/proc/$pid/status" if [ ! -e $procpath ] || [ -z $pid ] then echo "${process_label}_vmpeak.value 0" echo "${process_label}_vmsize.value 0" echo "${process_label}_vmRSS.value 0" exit 0 fi VmPeak=`grep VmPeak /proc/$pid/status|awk '{print $2}'` VmSize=`grep VmSize /proc/$pid/status|awk '{print $2}'` VmRSS=`grep VmRSS /proc/$pid/status|awk '{print $2}'` echo "${process_label}_vmpeak.value $(( $VmPeak * 1024 ))" echo "${process_label}_vmsize.value $(( $VmSize * 1024 ))" echo "${process_label}_vmRSS.value $(( $VmRSS * 1024 ))" } check_memory $COMPONENT_PID_FILE $COMPONENT_NAME