Làm cách nào tôi có thể hiển thị mức sử dụng bộ nhớ của từng quy trình nếu tôi thực hiện 'ps -ef'?


24

Trong Linux, làm cách nào tôi có thể hiển thị mức sử dụng bộ nhớ của từng quy trình nếu tôi thực hiện ps -ef? Tôi muốn xem memory bộ nhớ ảo ',' bộ nhớ res ', memory bộ nhớ chia sẻ' của mỗi tiến trình. Tôi có thể có được điều đó thông qua top, nhưng tôi muốn có cùng thông tin ps -efđể tôi có thể dẫn đầu ra grepvới tên quy trình của mình.

Câu trả lời:


8

Có được việc sử dụng bộ nhớ thông qua ps là không đáng tin cậy. Nếu bạn có kernel mới hơn, nó sẽ hỗ trợ / Proc / pid # / smaps cung cấp cho bạn một số thông tin chi tiết về từng quá trình sử dụng bộ nhớ. Dưới đây là một tập lệnh khá bẩn và nhanh để lặp qua từng quy trình được mở và lấy sử dụng Kích thước, Rss, Pss và Chia sẻ Sạch / Bẩn. Hy vọng nó có thể hữu ích theo một cách nào đó.

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
            echo "* Mem usage for PID $pid"
            echo "-- Size:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Size: | awk '{print $2}'
            echo "-- Rss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Rss: | awk '{print $2}'
            echo "-- Pss:"
            cat /proc/$pid/smaps | grep -m 1 -e ^Pss: | awk '{print $2}'
            echo "Shared Clean"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared_Clean:' | awk '{print $2}'
            echo "Shared Dirty"
            cat /proc/$pid/smaps | grep -m 1 -e '^Shared Dirty:' | awk '{print $2}'
    fi
done

1
Bạn nên tóm tắt cột Kích thước. Xem câu trả lời của ezsmith dưới đây.
Basil A

11

ps ef -o command,vsize,rss,%mem,size

Tôi không thể tìm thấy tùy chọn cho bộ nhớ dùng chung, nhưng tôi đã tìm thấy các tùy chọn cho% tổng bộ nhớ vật lý và lượng không gian hoán đổi cần thiết để trao đổi quá trình. Điều này và nhiều hơn nữa được ghi lại trong trang man cho ps.


Các tài khoản Linux được chia sẻ bộ nhớ trong bộ nhớ cho mỗi quy trình, điều này có thể dẫn đến các khoản tiền không có thật nếu bạn có nhiều quy trình được gắn vào một phân đoạn bộ nhớ chia sẻ lớn. top, psvà các chương trình tương tự đều bị ảnh hưởng bởi điều này theo cùng một cách.
Peter Eisentraut

Tôi biết bộ nhớ chia sẻ hoạt động như thế nào, nhưng có vẻ như ps không thể cung cấp thông tin đó (hoặc ít nhất là tôi không thể tìm thấy nó trong tài liệu ps của mình). top hoặc htop thực sự có thể hiển thị việc sử dụng bộ nhớ được chia sẻ trên cơ sở mỗi quá trình.
Justin Smith

9

Câu trả lời của @ user26528 không hoàn toàn tính toán bộ nhớ một cách chính xác - bạn cần tổng số ánh xạ trong các lần đập, không chỉ là đầu trang. Kịch bản này nên làm điều đó:

#!/bin/bash

for pid in $(ps -ef | awk '{print $2}'); do
    if [ -f /proc/$pid/smaps ]; then
        echo "* Mem usage for PID $pid"     
        rss=$(awk 'BEGIN {i=0} /^Rss/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pss=$(awk 'BEGIN {i=0} /^Pss/ {i = i + $2 + 0.5} END {print i}' /proc/$pid/smaps)
        sc=$(awk 'BEGIN {i=0} /^Shared_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)            
        sd=$(awk 'BEGIN {i=0} /^Shared_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pc=$(awk 'BEGIN {i=0} /^Private_Clean/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        pd=$(awk 'BEGIN {i=0} /^Private_Dirty/ {i = i + $2} END {print i}' /proc/$pid/smaps)
        echo "-- Rss: $rss kB" 
        echo "-- Pss: $pss kB"
        echo "Shared Clean $sc kB"
        echo "Shared Dirty $sd kB"
        echo "Private $(($pd + $pc)) kB"
    fi
done

Đầu ra: dòng 16: +: lỗi cú pháp: toán hạng dự kiến ​​(mã thông báo lỗi là "+") là dòng chứa: echo "Private $ (($ pd + $ pc)) kB", tôi đang chạy trên CentOS 7 .
Basil A

2
@evsmith tại sao thêm 0,5 vào Pss?
Pete

1
Chạy 10.000 tập lệnh Awk nhỏ là một antipotype lớn, bạn chỉ nên cấu trúc lại tất cả những điều này thành một tập lệnh Awk duy nhất.
tripleee

nhưng chính kịch bản này đã tiêu tốn quá nhiều bộ nhớ
mehmet riza oz

8

Liệt kê các tiến trình theo cách sử dụng bộ nhớ

ps -e -orss =, args = | sắp xếp -b -k1,1n


Sử dụng ps -e -orss=,pid=,args= | sort -b -k1,1nđể bao gồm id quá trình
Jacob

pscó thể tự sắp xếp:ps -eo rss=,args= --sort +rss
phil294


3

Liệt kê các quy trình theo cách sử dụng mem

lệnh: ps -e -orss =, args = | sắp xếp -b -k1,1n | pr -TW $ COLUMNS \


3

Cập nhật:

Một lớp lót sau đây cũng cung cấp thông tin về tổng mức tiêu thụ bộ nhớ của người dùng hiện tại.

echo "------------------------------------" && mem=0 && while read -r rss comm ; do mbs=$((rss/1024)); mem=$((mbs + mem)); echo $mbs"MB - $comm"; done <<< "$(ps -u $USER -wo rss=,comm= --sort -rss)" && echo "------------------------------------" && echo $mem"MB: Memory used by user '$USER'"

Tôi vừa liệt kê tất cả các quy trình người dùng được sắp xếp theo mức sử dụng bộ nhớ cao nhất trong MB như thế này:

ps -u $USER -wo rss=,comm= --sort -rss | while read -r rss comm ; do echo $((rss/1024))"MB -" $comm; done

Bạn có thể sử dụng command=thay vì comm=để hiển thị quá trình đường dẫn đầy đủ.

Chỉ =cần loại bỏ tiêu đề cột.


3

Tôi thấy rằng nhiều lần quá trình tương tự có quá trình phụ ngã ba và bạn quan tâm đến tổng bộ nhớ được sử dụng bởi quy trình. ví dụ: google chrome bắt đầu nhiều quá trình và bạn muốn biết tổng bộ nhớ được lấy bởi chrome. Tôi tìm thấy bên dưới một dòng lệnh rất hữu ích

echo "%CPU   %MEM    MEM     PROCESS"
ps aux | awk '{mem[$11]+=int($6/1024)}; {cpuper[$11]+=$3};{memper[$11]+=$4}; END {for (i in mem) {print cpuper[i]"% ",memper[i]"% ",mem[i]" MB ",i}}' | sort -k3nr | head -n 5

Nó đảm nhiệm rất nhiều thứ, như hiển thị bộ nhớ trong MB, sắp xếp theo bộ nhớ và chủ yếu nhóm theo lệnh. Nó cũng được nhóm% CPU và% bộ nhớ. Nó đang hiển thị dữ liệu ở định dạng thân thiện với người dùng.

Lệnh này được lấy cảm hứng từ câu trả lời này và nó đã giúp tôi rất nhiều để có ý tưởng về quá trình nào đang chiếm dụng tài nguyên của tôi.

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.