web-dev-qa-db-ja.com

freeは、上位プロセスの合計よりも多くのメモリが使用されていることを示します

UPDATE:

これは、nss-softknの既知の問題が原因で発生していました。この記事を参照してください: https://www.splyt.com/blog/2014-05-16-optimizing-aws-nss-softoken


Centos 6.5のボックスからfree -mを実行すると、キャッシュを含めて使用可能なRAMが約1400 MBしかないことがわかります。 topを実行するときは、メモリで並べ替え、使用されているプロセスが1600前後しかないことを確認します。もっとたくさんの空きメモリが必要です。これは、いくつかのボックスで発生しています。

[root@db1 ~]# free -m
              total      used       free     shared    buffers     cached
Mem:          7840       7793         47          0        287       1357
-/+ buffers/cache:       6148       1692
Swap:         7983          7       7976

トップ出力

enter image description here

以下は、プロセスによって消費されたメモリを視覚化するより良い方法です。

enter image description here

4
ipengineer

Linuxによると、約1692mの空きメモリがあります。

一番上の「Mem」行では、メモリはほぼ99%(7793m/7840m)のように見えますが、実際には使用可能なメモリの約78%しか使用していません。より詳細な説明については http://www.linuxatemyram.com/ も参照してください。


無料vsトップvs/proc/meminfo

プロセスメモリ
topのプロセスで使用されているメモリを合計し、これをfreeの使用されているメモリと一致させようとすると、時間が悪くなります。 topページングが原因で、このリストのすべてのプロセスを取得できない場合もあります。ps aux --sort -rssを使用して、メモリの使用量によってプロセスを並べ替えることをお勧めします。

ディスクキャッシング
Linuxは、使用していないメモリを使用して、舞台裏での動作を大幅に高速化します。これはfreeの「キャッシュされた」列に記載されており、実際に使用されているメモリと空きメモリについて「-/ +バッファ/キャッシュ」の横の値を確認する必要があるのはこのためです。

カーネルスラブキャッシュ
カーネルモジュールとドライバーには、未使用のメモリtooを使用する方法があります。 「SReclaimable」は、メモリ不足の状況下で使用できるメモリです。カーネルがこのキャッシュである方法を特定できるslabtopと呼ばれるクールなツールがあります。

キャッシュをクリアしています

echo 1 > /proc/sys/vm/drop_cachesページキャッシュを解放するには

echo 2 > /proc/sys/vm/drop_cachesエントリとiノードを解放するには

echo 3 > /proc/sys/vm/drop_caches pagecache、dentries、inodeを解放するには

も参照してください

10
c4urself

ここで問題が見つかりました。/proc/meminfoを見て、カーネルがスラブスペースとしてキャッシュしていたものを確認する必要がありました。私の問題は、「空き」メモリの上限/上限/空きがどれだけあるかを理解していないことでした。これらの数が足し合わなかったのは事実でした。 「free」コマンドを使用すると、約1692MBの空き容量があることがわかりますが、プロセスの合計は、合計メモリの約20%にすぎません。

この記事では、私の正確な問題について説明します。

http://blog.logicmonitor.com/2014/10/09/more-linux-memory-free-memory-that-is-not-free-nor-cache/

1
ipengineer

http://blog.logicmonitor.com/2014/10/09/more-linux-memory-free-memory-that-is-not-free-nor-cache に基づいて、私がfreeと呼んだスクリプト(私は.bash_profileの/ usr/binの前のパスに配置しました)は、有用な結果を生成します。

#!/usr/bin/Perl

$result = `/usr/bin/free`;
print "$result";

if ($result =~ /cache:\s+(\d+)/)
{
 $mem = $1;
 $slab = `cat /proc/meminfo|grep SReclaimable`; $slab =~ s/[^\d]//g;
 print "Slab                  $slab\n";
 print "Actual Used        ** ",$mem-$slab," **\n";
}
0
Eric Klien

私はあなたがバッファ/キャッシュを誤って読んでいると思います-+/-バッファ/キャッシュの行ごとにメモリキャッシュとして使用されている> 6ギグがあります。これが必要な場合は、それを食べることができます-そうではないので、OSはそれを使用してディスク読み取りなどをキャッシュします。

0
davidgo