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


10

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

しかし、私はそれがどこでスワップを使用するのか理解できません、いくつかのグーグルの結果は、トップ- Oコンマが続くのpがプロセスによるスワップの使用法を示していると言いました。しかし、上の図に示すように、SWAP列の要約を見ると、> 10GBのスワップが使用されていることがわかります。それで、スワップ使用の9GBの数値はどこから来たのですか?

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


1
top(manページによる)は、SWAPがVIRTUAL-PHYSICAL ram usageになるように計算します。私の実験から完全に正確ではありません。
lornix

回答:


6

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

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


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


システムの起動時にスワップは使用されませんが、多くの共有ライブラリが既にロードされているため、共有ライブラリはスワップとしてカウントされるべきではないと思います。とにかく、私のシステムは約9GBのスワップパーティションを使用しているようです。どのプロセスがほとんどのスワップを使用したのかを知りたいだけです(共有ライブラリ、メモリマップファイルを除く...)
secmask

3

/ 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


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