「ps -ef」を実行した場合、各プロセスのメモリ使用量を表示するにはどうすればよいですか?


24

Linuxで、各プロセスのメモリ使用量を表示するにはどうすればよいps -efですか?各進捗の「仮想メモリ」、「解像度メモリ」、「共有メモリ」を確認したいと思います。で取得できますが、プロセス名で出力をパイプできるようにtop、同じ情報がps -ef必要ですgrep

回答:


8

psを使用したメモリ使用量の取得は、かなり信頼できません。新しいカーネルを使用している場合は、/ proc / pid#/ smapsをサポートする必要があります。これにより、各プロセスのメモリ使用量に関する詳細情報が提供されます。以下は、開いている各プロセスをループして、サイズ、Rss、Pss、および共有クリーン/ダーティの使用量を取得する、かなり汚くて速いスクリプトです。うまくいけば、何らかの形で役立つことがあります。

#!/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
[サイズ]列を合計する必要があります。以下のezsmithの回答をご覧ください。
バジルA

11

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

共有メモリのオプションは見つかりませんでしたが、合計物理メモリの%とプロセスのスワップアウトに必要なスワップスペースの量のオプションは見つかりました。これおよびその他の詳細は、psのmanページに記載されています。


Linuxは、各プロセスのメモリ内の共有メモリを考慮します。1つの大きな共有メモリセグメントに多数のプロセスが接続されている場合、偽の合計につながる可能性があります。 topps、および同様のプログラムは、すべて同じようにこの影響を受けています。
ピーターアイゼントラウト

共有メモリがどのように機能するかは知っていますが、psはその情報を提供できないようです(または、少なくともpsのドキュメントでそれを見つけることができませんでした)。topまたはhtopは、実際にはプロセスごとに共有メモリの使用量を表示できます。
ジャスティンスミス

9

@ user26528の答えはメモリを正確に計算しません-一番上のものだけでなく、smapsのマッピングの合計が必要です。このスクリプトはそれを行う必要があります。

#!/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

出力:16行目:+:構文エラー:オペランドが必要です(エラートークンは "+")。これは、 "Private $(($ pd + $ pc))kB"を含む行です。CentOS7で実行しています。 。
バジルA

2
@evsmithはなぜPssに0.5を追加するのですか?
ピート

1
10,000個の小さなAwkスクリプトを実行することは大規模なアンチパターンです。このすべてを単一のAwkスクリプトにリファクタリングする必要があります。
トリプリー

しかし、このスクリプト自体はメモリを大量に消費します
mehmet riza oz

8

メモリ使用量別にプロセスを一覧表示する

ps -e -orss =、args = | sort -b -k1,1n


ps -e -orss=,pid=,args= | sort -b -k1,1nプロセスIDを含めるために使用
ジェイコブ14

ps独自に並べ替えることができます:ps -eo rss=,args= --sort +rss
phil294


3

メモリ使用量別にプロセスを一覧表示する

コマンド:ps -e -orss =、args = | sort -b -k1,1n | pr -TW $ COLUMNS \


3

更新:

次のワンライナーは、現在のユーザーによる総メモリ消費量に関する情報も提供します。

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'"

次のように、すべてのユーザープロセスをMB単位の最大メモリ使用量でソートしてリストしました。

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

command=代わりにcomm=を使用して、フルパスプロセスを表示できます。

=ちょうど列のタイトルを削除します。


3

同じプロセスにforkサブプロセスが何度もあり、そのプロセスで使用される合計メモリに興味があることがわかりました。たとえば、google chromeは複数のプロセスを開始し、chromeが消費した合計メモリを知りたいと考えています。以下の1行のコマンドが非常に便利だとわかりました

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

メモリをMB単位で表示したり、メモリを並べ替えたり、主にコマンドでグループ化するなど、多くのことを処理します。また、%CPUと%memoryをグループ化しています。ユーザーフレンドリーな形式でデータを表示しています。

このコマンドはこの答えからインスピレーションを得たもので、どのプロセスがリソースを消費しているかを知るのに大いに役立ちました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.