Linuxメモリ使用量?

Linuxメモリ使用量?

SAPアプリケーションをホストするサーバーには1TBのメモリがあります。

アプリケーションの実行中に表示されるメモリ使用量はtop約700 GBです。アプリケーションが停止すると、表示されるメモリ使用量はtop10GBに低下します。サーバーを再起動すると、メモリ使用量は1 GBになります。

  • 実行中のアプリケーションがないためにtop10 GBを使用したと表示されますが、再起動すると9 GBが追加されたのはなぜですか?
  • 再起動せずに9GBを取得できますか?

出力free -g

free -g 
                 total used   free shared buffers cached 
Mem:              1009  567   442    0      0     152 
-/+ buffers/cache:      415   594 
Swap:              1     0     1

答え1

Linuxは他のオペレーティングシステムとは異なるRAMを使用します。

未使用のRAMをそこに置く代わりに、Linuxは必要なデータを保存します。考えるRAMで使用できます。すべてのアプリケーション、ファイルなどをここにキャッシュできます。

したがって、Linux RAMの使用量は、アプリケーションの実行に使用される量よりも高くなります。この追加使用量は、他の項目によって訴えられるようにバッファリングされます。free -h2行目を実行使用される「使用された」メモリの多くは実際にはキャッシュされていることを伝えます。

すべてのメモリがキャッシュされ、プログラムにメモリが必要な場合は、プログラムを受け入れるのに十分なメモリがキャッシュから削除されます。

答え2

これは、アプリケーションが停止したにもかかわらず、一部のファイル記述子がまだ開いているためです。上記の技術を使用して、開かれたファイル記述子を一覧表示できます。ここ

再起動せずにファイル記述子を閉じる必要がある場合は、Graemeが述べた方法に従うことができます。ここしかし、Graemeが答えで強調したように、閉じたいファイル記述子を知る必要があります。彼の答えは、

文字通り答え、閉じるみんなファイル記述子を開くbash:

for fd in $(ls /proc/$$/fd); do
  eval "exec $fd>&-"
done

しかし、これはシェルの入力と出力に必要なデフォルトのファイル記述子を閉じるので、実際には良い考えではありません。これにより、実行しているすべてのプログラムは、ttyデバイスに直接書き込まない限り、端末に出力を表示しません。実際に私がテストした結果stdinexec 0>&-)を閉じると、対話型シェルは終了しました。

実際に行うことは、デフォルトのシェル操作の一部ではないすべてのファイル記述子を閉じることです。これらはstdin0、1、2stdoutですstderr。これに加えて、一部のシェルは基本的に別のファイル記述子を開くようです。あなたは bash255個(ターミナルI / Oにも使用されます)を持っており、私は10個を持っており、これは端末が使用する特定の/デバイスではないことをdash示します。 0、1、2、255を除くすべての項目をオフにするには、次の手順を実行します。/dev/ttyttyptsbash

for fd in $(ls /proc/$$/fd); do
  case "$fd" in
    0|1|2|255)
      ;;
    *)
      eval "exec $fd>&-"
      ;;
  esac
done

これは、変数に含まれるファイル記述子をリダイレクトするときにもeval必要です。そうでない場合、bashは変数を拡張しますが、コマンドの一部として処理します(この場合はexec コマンドを試す01、ファイル記述子を閉じようとします)。 。またls、(例えば)の代わりにglobを使用すると、glob用の追加の/proc/$$/fd/*ファイル記述子が開かれているように見えるため、lsここでは最良の解決策のようです。

修正する

移植性の詳細については、/proc/$$/fd次を参照してください。 ファイル記述子リンクの移植性。ご利用できない場合は /proc/$$/fd代替品(使用可能な場合)を差し上げます。$(ls /proc/$$/fd)lsof$(lsof -p $$ -Ff | grep f[0-9] | cut -c 2-)

関連情報