web-dev-qa-db-ja.com

プロセスがスワップ領域を使用していることをどのように確認できますか?

Linuxサーバーのトップレポートで、9 GBのスワップが使用されていることが報告されています。 top

しかし、私はそれがどこでスワップを使用するのかわからない、いくつかのグーグルの結果は、トップ-Oの後ろにpが続くとプロセスごとのスワップの使用法を表示すると言った。しかし、上の図に示すように、SWAP列の概要を見ると、10 GBを超えるスワップが使用されていることがわかります。それで、スワップ使用の9 GBの数値はどこから来たのでしょうか。

上位の報告によると、約96492kbのRAMがバッファーによって使用されています。スワップを使用する代わりに、これを利用するために何かできることはありますか?

10
secmask

複数のプログラムが同じスワップ領域を使用している可能性があるため、2回報告されます。

スワップの代わりにバッファ領域を使用するようにLinuxに指示する必要はありません-それはそれが何をしているかについてすでに非常にスマートです。 9GBのスワップと9GBのバッファを使用している場合、それは良いことです...それは、メモリにロードされた9GBのものがアクティブに使用されていないことをLinuxが認識しているため、ディスクにスワップする方が効率的ですバッファが大きくなり、パフォーマンスが向上します。


編集: 各プロセスで使用されるすべてのメモリを合計すると、物理RAMよりもはるかに多くなります。これは、複数のプログラムで共有ライブラリが使用されていること、およびLinuxがフォークを処理する方法によるものです。メモリ全体でプログラム全体を複製するのではなく、2つのインスタンス間で異なる部分のみを複製します。場合によっては、ビデオメモリがXプロセスの一部として表示されることがあります。古いVoodoo3カードがこれを実行したと思います。 「ファントム」メモリが上部に表示される場合もあります。

6
Flimzy

/ procサブディレクトリの解析は機能します:

Bashスクリプトとして:

for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done

出力は、パイプでソートすることにより、Hi-Loでソートできます。

{blah}| sort -rn

もちろん、好きな週の言語でこれを好きなように書き直してください。私のawk-fuは強くありません。

(カットアンドパス可能な)

#!/bin/bash
#
# show swap used by processes
#
(for PROCESS in /proc/*/; do
  swapused=$(awk 'BEGIN { total = 0 } /^Swap:[[:blank:]]*[1-9]/ { total = total + $2 } END { print total }' ${PROCESS}/smaps 2>/dev/null || echo 0)
  if [ $swapused -gt 0 ]; then
    /bin/echo -e "${swapused}k\t$(cat ${PROCESS}/cmdline)"
  fi
done ) | sort -nr
3
lornix
for file in /proc/*/status ; do awk '/VmSwap|Name/{printf $2 " " $3}END{ print ""}' $file; done | sort -k 2 -n -r | less

から: http://www.cyberciti.biz/faq/linux-which-process-is-using-swap/

3
akostadinov

別の方法:

smem -s swap -r
1