Câu trả lời:
Bạn có thể có được mức sử dụng bộ nhớ cao nhất của một quy trình nhất định, tại:
grep VmPeak /proc/$PID/status
(Thay đổi $ PID thành id quá trình thực tế mà bạn đang tìm kiếm).
VmPeak là dung lượng bộ nhớ tối đa mà quá trình đã sử dụng kể từ khi nó được bắt đầu.
Để theo dõi việc sử dụng bộ nhớ của một quá trình theo thời gian, bạn có thể sử dụng một công cụ có tên là munin để theo dõi và hiển thị cho bạn một biểu đồ đẹp về việc sử dụng bộ nhớ theo thời gian.
Munin đi kèm với nhiều plugin mặc định để theo dõi tài nguyên hệ thống, tuy nhiên, nó không đi kèm với một plugin để theo dõi việc sử dụng bộ nhớ Đỉnh - thật may mắn, việc viết một plugin cho nó cực kỳ dễ dàng.
Dưới đây là ví dụ về plugin munin để theo dõi việc sử dụng bộ nhớ VmPeak, VmRSS và VmSize, cho quá trình apache. Bạn có thể thay đổi điều này cho phù hợp với nhu cầu của bạn (chỉ cần trỏ đến đúng tệp PID và thay đổi tên thành phần nếu cần).
Biểu đồ mà nó xuất ra trông như thế này (VmPeak và VmSize giống nhau trong ví dụ này, vì vậy bạn chỉ nhìn thấy một trong số chúng):
Lưu ý: điều này chỉ giám sát quá trình apache chính và không hiển thị mức sử dụng bộ nhớ của các tiến trình con đó.
#!/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
Có những công cụ bạn có thể sử dụng khi bắt đầu một quy trình cung cấp cho bạn bản tóm tắt về việc sử dụng bộ nhớ sau khi quá trình kết thúc:
Thời gian GNU cũng cung cấp mức sử dụng bộ nhớ cao nhất khi được thực hiện với tùy chọn -v. Lưu ý rằng bash cũng có một lệnh tích hợp được gọi là thời gian, vì vậy bạn có thể cần chỉ định đường dẫn đầy đủ đến thời gian GNU khi gọi nó, ví dụ: lệnh / usr / bin / time -v . Hơn nữa, hãy cẩn thận rằng các phiên bản cũ hơn của thời gian GNU có lỗi trong đó các kết quả được nhân không chính xác với 4, ví dụ: kiểm tra liên kết sau: https://bugzilla.redhat.com/show_orms.cgi?id=702826
Nếu bạn có thể đối phó với sự chậm lại, bạn có thể tìm thấy valgrind
công cụ massif cho mục đích này vì nó có thể cấu hình --pages-as-heap=yes
phân bổ heap (và bộ nhớ chung khi sử dụng ) theo thời gian.