1時間使用した後、システムがより多くのRAMを使用するのはなぜですか?

1時間使用した後、システムがより多くのRAMを使用するのはなぜですか?

私はXFCE DEとXFWM4 WMでArch Linux(5.1.8-arch1-1-ARCH)を使用しています。すべてが非常にエレガントで、RAMとCPU使用率が低いです。

起動後にDEが完全にロードされると、RAM使用量は665MiBと表示されます。

しかし、Atom、Code、Firefox、Chromiumなどのアプリケーションを開いたり、GIMP、Blenderなどで作業した後にRAMの使用量が増加することは明らかです。ただし、すべてのアプリケーションを閉じてgnome-system-monitorのみを残した後、RAM使用量が1.2 - 1.4GiBであることを確認できます。 /proc/meminfo は gnome-system-monitor と一致しますが、htop は常に異なる結果を提供します。

さらに悪いことに、後でRAMを大量に使用するアプリを開くと、1.4GiB以外に必要なメモリも消費されます。いつもそうです。合計メガバイトのファイルは/ tmp /ディレクトリに保存されません。

また、そんなに多くのRAM(最初は700MiBからブラウザを閉じてから1.4GiBまで!)を使用するプロセスを探しても何も表示されません。実際、Arch ARMを実行しているRaspberry Piでも同じ問題が発生しました。

スクリーンショット1 スクリーンショット2

ルビーコード:

#!/usr/bin/ruby -w
STDOUT.sync = true

loop do
    IO.readlines(File.join(%w(/ proc meminfo))).then { |x| [x[0], x[2]] }.map { |x| x.split[1].to_i }.reduce(:-)
        .tap { |x| print "\e[2K\rRAM Usage:".ljust(20), "#{x / 1024.0} MiB".ljust(24), "#{(x / 1000.0)} MB" }
    Kernel.sleep(0.1)
end

コマンドcat /proc/meminfoの出力は次のとおりです。

MemTotal:        3851796 kB
MemFree:         1135680 kB
MemAvailable:    2055708 kB
Buffers:            1048 kB
Cached:          1463960 kB
SwapCached:          284 kB
Active:          1622148 kB
Inactive:         660952 kB
Active(anon):     923580 kB
Inactive(anon):   269360 kB
Active(file):     698568 kB
Inactive(file):   391592 kB
Unevictable:      107012 kB
Mlocked:              32 kB
SwapTotal:       3978216 kB
SwapFree:        3966696 kB
Dirty:               280 kB
Writeback:             0 kB
AnonPages:        924844 kB
Mapped:           563732 kB
Shmem:            374848 kB
KReclaimable:      74972 kB
Slab:             130016 kB
SReclaimable:      74972 kB
SUnreclaim:        55044 kB
KernelStack:        8000 kB
PageTables:        14700 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5904112 kB
Committed_AS:    3320548 kB
VmallocTotal:   34359738367 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB
Percpu:             1456 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      226736 kB
DirectMap2M:     3778560 kB
DirectMap1G:           0 kB

まず、htopが決して同意しないことがわかります。私はそれについてあまり知らない。

第二に、xfdesktopが44MiBを使用し、他のプロセスがいくつかのメモリを使用し、カーネルが〜150MiBを使用していることがわかります。それに加えて、1.5GiBのRAMが使用されているとマークされているのはなぜですか?これは実際にシステムのパフォーマンスに影響しますか?

ベストアンサー1

未使用のRAMは無駄なRAMです。 Linuxカーネルには高度なメモリ管理機能があり、システムに負担をかけるハードドライブ/ SSDのボトルネックを回避しようとしています。メモリにファイルをキャッシュしようとします。

メモリ管理システムは複雑な方法で動作し、目標はより良いパフォーマンスです。

あなたはそれが何をしているのかを確認できます/proc/meminfo

cat /proc/meminfo

"drop_caches"を使用してこのキャッシュメモリを回復できます。ただし、ドキュメントには、「削除されたオブジェクトを再生成すると、再び必要なときにかなりのI / OおよびCPUコストがかかる可能性があるため、テストまたはデバッグ環境の外部では推奨されません」と記載されています。 :-).

ページキャッシュのみを消去する:

# sync; echo 1 > /proc/sys/vm/drop_caches

dentryとinodeを消去する:

# sync; echo 2 > /proc/sys/vm/drop_caches

PageCache、dentries、inode を消去します。

# sync; echo 3 > /proc/sys/vm/drop_caches

これにより、syncすべてのデータが書き込まれたことを確認するためにファイルシステムバッファがフラッシュされます。

~からカーネル文書:

ページキャッシュ

物理メモリは揮発性であり、データをメモリに保存する一般的なケースは、ファイルからデータを読み取ることです。ファイルを読み取るたびに、データはページキャッシュに保存され、後続の読み取り時に高価なディスクアクセスを防ぎます。同様に、ファイルに書き込むと、データはページキャッシュに保存され、最終的にはバックアップストレージデバイスに移動されます。作成されたページはダーティで表示され、Linuxはそれを他の目的に再利用することにした場合、デバイス上のファイルの内容が更新されたデータと同期されるようにします。

リサイクル

システムのライフサイクル全体にわたって物理ページを使用して、さまざまな種類のデータを保存できます。内部カーネルデータ構造、デバイスドライバで使用するためのDMA対応バッファ、ファイルシステムから読み取られたデータ、ユーザー空間プロセスによって割り当てられたメモリなどがあります。

Linux メモリ管理は、ページ使用量を異なる方法で処理します。ハードディスクなど、他の場所で使用可能なデータをキャッシュしたり、再びハードディスクに置き換えることができるため、いつでも解放できるページを回収可能ページといいます。回収可能なページの最も注目すべきカテゴリは、ページキャッシュと匿名メモリです。

ほとんどの場合、内部カーネルデータを保持し、DMAバッファとして使用されるページは目的を変更できず、ユーザーが解放されるまで固定されたままになります。これらのページをリサイクルできないページと呼びます。しかし、場合によっては、カーネルデータ構造が占めるページを回収することが可能です。たとえば、ファイルシステムメタデータのメモリ内キャッシュはストレージデバイスから再度読み取られ、システムがメモリ不足に直面したときにメインメモリから廃棄される可能性があります。

回収可能な物理メモリページを解放し、用途を変更するプロセスを(驚くべきことに!)回収と呼びます。 Linuxはシステムの状態に応じて非同期または同期的にページを回収できます。システムがロードされていない場合、ほとんどのメモリは利用可能であり、割り当て要求はすぐに利用可能なページ配信で満たされます。ロードが増加すると、使用可能なページ数が減少し、特定のしきい値(最高透かし)に達すると、割り当て要求はkswapdデーモンを起動します。非同期でメモリページをスキャンして他の場所で利用可能なデータが含まれている場合は、そのページを解放するか、バックアップストレージデバイスに削除します(ダーティページを覚えていますか?)。メモリ使用量がさらに増加し​​、他のしきい値(最小透かし)に達すると、割り当ては直接回収をトリガします。この場合、要求を満たすのに十分なメモリページが回復されるまで割り当ては停止されます。

メモリリーク

現在、一部のプログラムは「メモリリーク」、つまり廃止されたメモリを解放することを「忘れる」という問題を抱えています。プログラムをしばらく実行し、メモリ使用量が増え続け、プログラムを閉じてもメモリが解放されない場合は、これを確認できます。もちろん、プログラマはメモリリークを避けようとしますが、プログラムには少しのリークがあるかもしれません。このメモリを回復する方法は、再起動することです。

おすすめ記事