类似的工具顶部和附言可以告诉我当前分配给进程的内存量,但我感兴趣的是测量自进程创建以来或在给定时间间隔内分配给进程的最大内存量。关于如何找出答案,有什么建议吗?
答案1
您可以在以下位置获取特定进程的峰值内存使用情况:
grep VmPeak /proc/$PID/status
(将 $PID 更改为您正在寻找的实际进程 ID)。
VmPeak 是该进程自启动以来使用的最大内存量。
为了跟踪进程随时间变化的内存使用情况,您可以使用一个名为穆宁进行跟踪,并向您展示随时间推移的内存使用情况的漂亮图表。
Munin 带有许多默认插件来跟踪系统资源,但是它没有带有用于跟踪峰值内存使用情况的插件 - 幸运的是,为它编写一个插件非常容易。
这是用于跟踪 apache 进程的 VmPeak、VmRSS 和 VmSize 内存使用情况的 munin 插件示例。您可以根据需要进行更改(只需指向正确的 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
答案2
启动某个进程时,可以使用一些工具,这些工具会在进程结束后为您提供内存使用情况的摘要:
GNU 时间还会显示使用 -v 选项执行时的峰值内存使用情况。请注意,bash 还有一个名为 time 的内置命令,因此在调用它时可能需要指定 GNU time 的完整路径,例如,/usr/bin/time -v 命令。此外,请注意旧版本的 GNU 时间有一个错误,结果会错误地乘以 4,例如,检查以下链接:https://bugzilla.redhat.com/show_bug.cgi?id=702826
答案3
如果你能应对经济放缓,你可能会发现valgrind
的地块工具为此目的,因为它可以--pages-as-heap=yes
随时间推移分析堆(以及使用时的一般内存)的分配。