Soluzione 1:
Puoi ottenere il picco di utilizzo della memoria di un determinato processo, su:
grep VmPeak /proc/$PID/status
(Cambia $PID con l'ID del processo effettivo che stai cercando).
VmPeak è la quantità massima di memoria utilizzata dal processo da quando è stato avviato.
Per tenere traccia dell'utilizzo della memoria di un processo nel tempo, puoi utilizzare uno strumento chiamato munin per monitorare e mostrarti un bel grafico dell'utilizzo della memoria nel tempo.
Munin viene fornito con molti plug-in predefiniti per tenere traccia delle risorse di sistema, tuttavia non viene fornito con un plug-in per tenere traccia dell'utilizzo massimo della memoria:fortunatamente, è estremamente facile scrivere un plug-in per questo.
Ecco un esempio di un plug-in munin per tenere traccia dell'utilizzo della memoria di VmPeak, VmRSS e VmSize, per il processo Apache. Puoi modificarlo in base alle tue esigenze (basta puntare al file PID corretto e modificare il nome del componente secondo necessità).
Il grafico che genera ha questo aspetto (VmPeak e VmSize sono gli stessi in questo esempio, quindi ne vedi solo uno):
Nota: questo monitora solo il processo principale di apache e non mostra l'utilizzo della memoria dei suoi processi figli.
#!/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
Soluzione 2:
Esistono strumenti che puoi utilizzare all'avvio di un processo che ti forniscono un riepilogo dell'utilizzo della memoria al termine del processo:
- memtime
- tstime
Tempo GNU fornisce anche il picco di utilizzo della memoria quando eseguito con l'opzione -v. Nota che bash ha anche un comando integrato chiamato time, quindi potresti dover specificare il percorso completo di GNU time quando lo invochi, ad esempio /usr/bin/time -v command . Inoltre, fai attenzione che le versioni precedenti di GNU time hanno un bug in cui i risultati vengono erroneamente moltiplicati per 4, ad esempio controlla il seguente link:https://bugzilla.redhat.com/show_bug.cgi?id=702826