Gọi và theo dõi việc sử dụng bộ nhớ của một tiến trình


14

Tôi muốn chạy một chương trình tiêu thụ bộ nhớ và theo dõi việc sử dụng bộ nhớ theo thời gian. Chương trình kết thúc sau vài giây sau khi được gọi.

Câu hỏi trước đây đề nghị gói sysstat . Mặc dù pidstattiện ích của nó một phần thực hiện những gì tôi muốn, nhưng nó không đáp ứng được 2 nhu cầu của tôi:

  • Nó chấp nhận một khoảng tối thiểu 1s, nhưng tôi muốn đo ở mức độ chi tiết ngắn hơn. ( 0.1ssẽ ổn thôi)
  • Nó chỉ theo dõi một quy trình hiện có, trong khi tôi không thể luôn có mặt để sao chép và dán pid.

Có một số tập lệnh / tiện ích thay thế để thực hiện công việc gọi và đo lường tốt hơn không?


1
Âm thanh như bạn nên tự viết lên một tập lệnh Python hoặc Bash nhỏ đơn giản để kết xuất việc sử dụng bộ nhớ của quá trình (bạn chỉ có thể xem số nguyên đầu tiên trong /proc/$PID/statm), sau đó ngủ trong 100ms và lặp lại. Tại sao không thể bạn chỉ cần giữ ném của PID liên quan statmthông qua cat, có thể sử dụng một số regex để lọc ra khỏi tắm / giá trị không cần thiết, và chỉ cần làm một sleep 0.01? Một số hệ điều hành sẽ không cho phép các sleepgiá trị phụ thứ hai , vì vậy, trong trường hợp đó, bạn phải đi theo tuyến Python (và sử dụng timethư viện tích hợp của Python để ngủ).
Đột phá

có nhiều cách
munish

Câu trả lời:


11

Điều này sẽ làm những gì bạn cần. Nó nhận thông tin từ /proc/$PID/statmvà in (từ man procfs):

              size       total program size
                         (same as VmSize in /proc/[pid]/status)
              resident   resident set size
                         (same as VmRSS in /proc/[pid]/status)
              share      shared pages (from shared mappings)
              data       data + stack

Kịch bản:

#!/usr/bin/env bash 

## Print header
 echo -e "Size\tResid.\tShared\tData\t%"
 while [ 1 ]; do
    ## Get the PID of the process name given as argument 1
     pidno=`pgrep $1`
    ## If the process is running, print the memory usage
     if [ -e /proc/$pidno/statm ]; then
     ## Get the memory info
      m=`awk '{OFS="\t";print $1,$2,$3,$6}' /proc/$pidno/statm`
     ## Get the memory percentage
      perc=`top -bd .10 -p $pidno -n 1  | grep $pidno | gawk '{print \$10}'`
     ## print the results
      echo -e "$m\t$perc";
    ## If the process is not running
     else
      echo "$1 is not running";
     fi
 done

Sau đó, bạn có thể gọi tập lệnh, đặt tên cho quy trình làm đầu vào. Ví dụ:

$ memusage.sh firefox
Size    Resid.  Shared  Data    %
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  261902  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517193  262100  9546    400715  12.8
517209  261899  9546    400731  12.8
517209  261899  9546    400731  12.8

GHI CHÚ:

  • Điều này giả định rằng chỉ có một quy trình chạy duy nhất với tên được chỉ định.

@ bjornen cảm ơn bạn đã chỉnh sửa. Bạn hoàn toàn đúng, tôi đã sai manở đó, tôi không biết tại sao chỉnh sửa của bạn bị từ chối.
terdon

1

Sau nhiều năm, tôi thấy rằng valgrind (cũng) có một công cụ cho việc này:

# record memory usage

$ valgrind --tool=massif bash -c "sleep 5; echo hey";
==5281== Massif, a heap profiler
==5281== Copyright (C) 2003-2015, and GNU GPL'd, by Nicholas Nethercote
==5281== Using Valgrind-3.12.0 and LibVEX; rerun with -h for copyright info
==5281== Command: bash -c sleep\ 5;\ echo\ hey
==5281==
hey
==5281==

# print the usage (5281 was the pid of bash, your filename will be different)
$ ms_print massif.out.4682

Lưu ý: valgrind không chỉ quan sát: nó cần phải tiêm một số mã và chụp ảnh bộ nhớ. Điều này có thể gây hại cho độ chính xác của số liệu thống kê.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.