New FAMILUG

The PyMiers

Wednesday 20 November 2013

Tìm xem một process dùng bao nhiêu RAM

NOTE: kết quả của ps, pmap, top về memory chỉ nên dùng cho mục đích monitoring, để debug chính xác xem chương trình của bạn thực tế dùng bao nhiêu RAM, hãy dùng các chương trình profiler (ví dụ Valgrind)
Lệnh `top` `ps` có thể  chỉ trả về phần trăm hay tổng cộng lượng RAM mà một process sử dụng (hoặc trả về nhiều phần để bạn tự tính ra KB), sử dụng lệnh `pmap` (nằm trong package procps ) để tìm xem chi tiết lượng RAM đó được dùng vào đâu:

 $ whatis pmap
pmap (1)             - report memory map of a process

$ pmap --help | grep Usage -A1
Usage:
 pmap [options] pid [pid ...]

vậy `pmap` nhận args là pid (hoặc nhiều pid).

xem memory map của một lệnh `top` đang chạy:

$ pmap `pgrep top`
787:   top
0000000000400000     92K r-x-- top
0000000000616000      4K r---- top
0000000000617000      8K rw--- top
0000000000619000    156K rw---   [ anon ]
00000000011e8000    672K rw---   [ anon ]
00007f85193e4000     44K r-x-- libnss_files-2.18.so
00007f85193ef000   2048K ----- libnss_files-2.18.so
00007f85195ef000      4K r---- libnss_files-2.18.so
00007f85195f0000      4K rw--- libnss_files-2.18.so
00007f85195f1000     40K r-x-- libnuma.so.1
00007f85195fb000   2044K ----- libnuma.so.1
00007f85197fa000      4K r---- libnuma.so.1
00007f85197fb000      4K rw--- libnuma.so.1
00007f85197fc000   1668K r-x-- libc-2.18.so
00007f851999d000   2044K ----- libc-2.18.so
00007f8519b9c000     16K r---- libc-2.18.so
00007f8519ba0000      8K rw--- libc-2.18.so
00007f8519ba2000     16K rw---   [ anon ]
00007f8519ba6000     12K r-x-- libdl-2.18.so
00007f8519ba9000   2044K ----- libdl-2.18.so
00007f8519da8000      4K r---- libdl-2.18.so
00007f8519da9000      4K rw--- libdl-2.18.so
00007f8519daa000    360K r-x-- libncursesw.so.5.9
00007f8519e04000   2044K ----- libncursesw.so.5.9
00007f851a003000     16K r---- libncursesw.so.5.9
00007f851a007000      8K rw--- libncursesw.so.5.9
00007f851a009000     64K r-x-- libprocps.so.1.1.2
00007f851a019000   2048K ----- libprocps.so.1.1.2
00007f851a219000      4K r---- libprocps.so.1.1.2
00007f851a21a000      4K rw--- libprocps.so.1.1.2
00007f851a21b000     72K rw---   [ anon ]
00007f851a22d000    128K r-x-- ld-2.18.so
00007f851a281000    132K rw---   [ anon ]
00007f851a2a2000   1572K r---- locale-archive
00007f851a42b000     20K rw---   [ anon ]
00007f851a44b000      4K rw---   [ anon ]
00007f851a44c000      4K r---- ld-2.18.so
00007f851a44d000      4K rw--- ld-2.18.so
00007f851a44e000      4K rw---   [ anon ]
00007fff98aa9000    132K rw---   [ stack ]
00007fff98b24000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total            17572K

Con số ở dòng total cũng chính bằng giá trị ở cột VIRT khi xem bằng `top` (verified by +Hiep Nguyen Van ).

Theo `man top`, VIRT là:
VIRT -- Virtual Image (kb)
The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped
out and pages that have been mapped but not used.

Check xem `firefox` dùng tổng cộng bao nhiêu RAM

hvn@archhvn: ~ () $ pmap `ps -C firefox -opid=` | grep total
 total          1369772K # ~ 1.3G
hoặc (suggested by +Hiep Nguyen Van )
$ pmap `pgrep firefox` | grep total
 total          1678416
Check xem 2 process `tmux` riêng biệt dùng bao nhiêu RAM
hvn@archhvn: ~ () $ pmap `ps -C tmux -opid=` | grep total
 total            20024K
 total            15820K
Option -x khiến `pmap` in ra kết quả ở dạng "extend" chi tiết hơn nhiều lần:
pmap -x <process  pid>

11 comments:

  1. Đính chính là TOP cũng xem đc ram mà 1 process dùng nhé. Cái cột Res (Resident Memory Size)

    ReplyDelete
    Replies
    1. 2 cách tính khác nhau, cái này phải viết hẳn một bài so sánh.

      Delete
    2. Khác nhau à, thử so sánh với cái VIRT trong top xem có giống ko, VIRT là virtual memory size.

      Delete
    3. nói cái RES khác chứ không phải cái VIRT
      o: VIRT -- Virtual Image (kb)
      The total amount of virtual memory used by the task. It includes all code, data and shared libraries plus pages that have been swapped
      out and pages that have been mapped but not used.

      q: RES -- Resident size (kb)
      The non-swapped physical memory a task has used.

      btw, nội dung bài viết đã sửa lại "top" -> ps

      Delete
    4. Đã test, pmap 'total' là kích thước lớn nhất mà program đc load vào memory (virtual memory) còn cột RES của lệnh top cho biết kích thước thật của program đc load vào memory.

      Delete
  2. Thêm nữa, dùng lệnh 'pgrep firefox' trả về các pid cấp firefox ko cần phải 'ps.......'

    ReplyDelete
    Replies
    1. chỉ trong trường hợp cần lấy PID
      pkill để grep + kill

      Delete
  3. Còn 1 điều nữa là ps cũng trả về được RSS (resident size) và VSZ (virtual size).
    Ví dụ:
    ps aux | grep skype
    USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
    1000 4771 2.2 3.6 540028 146196 pts/0 Sl 08:14 7:56 skype

    ReplyDelete
  4. http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html

    ReplyDelete