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デーモンを起動します。非同期でメモリページをスキャンして他の場所で利用可能なデータが含まれている場合は、そのページを解放するか、バックアップストレージデバイスに削除します(ダーティページを覚えていますか?)。メモリ使用量がさらに増加し​​、他のしきい値(最小透かし)に達すると、割り当ては直接回収をトリガします。この場合、要求を満たすのに十分なメモリページが回復されるまで割り当ては停止されます。

メモリリーク

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

答え2

プロセスのリストとメモリ使用量を調べました。しかし、問題があります。完全なリストを見ていません。

gnome-system-monitorデフォルトでは「マイプロセス」のみが表示されます。このプロセスを含むすべてのシステムユーザーが所有するプロセスを表示するには、root右上隅にあるメニューアイコン(縦線の3点)をクリックします。 「マイプロセス」から「すべてのプロセス」に選択を変更します。


  1. 単一の数値で使用されるシステムRAMと使用可能なシステムRAMの比較
  2. /proc/meminfo 分析
  3. 利用可能なその他のツール -atop今すぐインストール8-)

1. 単一の数値で使用されるシステム RAM と使用可能なシステム RAM の比較

MemAvailableからルビーコードを引くことがわかりますMemTotal。これはgnome-system-monitor、システムが「3.7GiBのうち1.5GiB(41.4%)」を使用していることを示すまったく同じ計算です。

少なくとも最初の近似では、これらのいずれかを使用するか、gnome-system-monitor手動計算が正しいです。このMemAvailable数字には、デフォルトでリサイクル可能な「キャッシュ」がすべて含まれます。つまり、MemAvailableプログラムが使用可能なメモリよりも多くのメモリを要求した場合に回収できる一種の「キャッシュ」が含まれます。

注:「キャッシュ」には別の種類または意味があります。いいえリサイクル可能。Cache/ "cache"番号を見ると、通常Shmem/ "shared"が含まれていると報告されます。このShmem部分はいいえリサイクル可能なキャッシュ。このような混乱は、Shmemカーネル「ページキャッシュ」を巧妙に使用して、これを達成するために発生します。

「利用可能」を確認するもう一つの速い方法はですfree -h

このfreeコマンドは、共有、スワップ使用量なども表示します。システム文書には、出力フィールドと利用可能なオプションがリストされている必要がありますman free。他のいくつかのフィールドは誤解を招く可能性があります。

  • (現在)コマンドの「used」フィールドにはfree「shared」は含まれません。これは非常に混乱する可能性があります。 「使用済み」フィールドを無視
  • 表示された「キャッシュ」値は、free上記の問題のために困難になります。
  • 「使用可能」と表示されない場合、freeシステムは古いものです。古代文献を参照してください。

2. /proc/meminfo 分析

完全な出力に感謝しますcat /proc/meminfo。これは、特定の回答(またはすべての回答)を見つけるのに役立つことがよくあります。自分で計算する方法を知りたい場合は、MemAvailableここで私の答えの最初の部分を読んでください。「キャッシュ」メモリは実際に無料ですか?

匿名ページ

あなたの例には(0.9GB) meminfoがあります。縮小された用語の1つです。AnonPages: 924844 kBAnonPagesMemAvailable

増加すると、AnonPages一部の実行中のプログラムに対して「RES」または「RSS」(RAM「Set Size」の「Resident」)が増加したことを示す必要があります。ただし、RSSは一部のメモリが共有されるため、誤解を招く可能性があります。

共有メモリは二重に計算されるため、RSSを合計することはできません。あなたは合計する必要がありますPSS、共有RSSの割合。このsmemコマンドはPSSを表示し、合計を計算することもできます。たとえば、

  • sudo smem -t > p; head -n1 p; echo; tail -n17 p- 各プロセスのメモリ使用量を表示します。このtailセクションには最初の15のプロセスが表示され、その後に合計PSSなどの行が表示されます。
  • smem -t -U ^sourcejedi$ > U; head -n1 U; echo; tail -n17 U- 私のユーザー"sourcejedi"に属するプロセスのメモリ使用量を表示します。
  • sudo smem -t -u- ユーザー別にグループ化されたメモリを表示します。これは、ログインセッションと独自のユーザーとして実行されているいくつかのシステムデーモンを区別するのに役立ちます。たとえば、packagekitdはユーザーとして実行され、root数百メガバイトを使用できます。
  • smem -t -P firefox- 私のWebブラウザのメモリ使用量を確認してください:-)。
  • sudo smem -t -m > m; head -n5 m; echo; tail m- マッピング名(キャッシュファイル名)別にグループ化されたメモリビュー「<匿名>」または「[ヒープ]」

    プロセス「常駐」メモリには、次のものが含まれます。両方「匿名」メモリといくつかのキャッシュファイル。 smem -mキャッシュされたファイルをすべて表示することはできず、現在使用中の特定の種類のファイルのみを表示できます。特に、プログラムが仮想メモリにマップするファイルです。これには、プログラムコード、ライブラリコード、およびmmap()を使用してマップされたファイルが含まれます。

シュマイム

まだShmem: 374848 kB(0.4GB)があります。Shmem上記で/"共有"を言及しました。これは、「使用可能な」メモリを減らす別の用語です。 (リサイクル可能なキャッシュではありません。)これは非常に正常な現象ですが、これが何であるかを確認できます。

一部の共有メモリは、個々のプロセスのメモリとして表示されます。共有メモリがプロセスによってマッピングされている場合は、RSS / PSSとして計算する必要があります。探す。ここでは、「マップ名」が役に立つことがあります(例smem -t -m:)。

Shmemインストールされているファイルが含まれていますtmpfstmpfsを使用してインストールされているすべてを確認できますdf -t tmpfs

システムによっては、Shmemいくつかのグラフィックバッファを含めることができます。私のシステム(Intel Graphics)で現在のサイズを確認する方法を見つけました。GEMバッファに割り当てられたメモリ量を確認できますか? システムをチェックする別の方法を見つけたかどうか知りたいです!

Shmem一部の他のグラフィックドライバのメモリリークは、Xorgの非常に大きなVIRT(別名VSIZE)に関連する可能性があることを読んでいます。Linux はスワップ領域全体を使用し、十分な RAM があれば応答しません。

異なるメモリ使用量?

  • MemTotal - MemAvailable = 1796088 kB(1.8GB)
  • AnonPages: 924844 kB(0.9GB)
  • Shmem: 374848 kB(0.4GB)

残りの 0.5 GB の中で、全体的に 0.1 GB 未満で少しの使用量を見ることができます。カーネルはまた数パーセントのヘッドルームを確保しますが(「低透かし」を参照)、システムでは0.2GB以下であると推測されます。だから、まだわからない使い方があります。

コアボードメモリ

「リサイクル不可能なタブレット」メモリが少なくなりますMemAvailableSUnreclaim: 55044 kB(0.05GB)

slabtop を実行してスラブのリストを表示することもできます。 AFAICT、スラブトップは、リサイクル可能またはリサイクル不可能なスラブの統計を提供しません。しかし、疑わしい部分があれば名前で探してみればいいと思います。

3.利用可能なその他のツール -atop今すぐインストール8-)

smem少し過剰かもしれません。時々あなたが必要とするのはtop、あなたのお気に入りの選択肢と常駐メモリに基づいてソートする方法を理解することだけです。 (gnome-system-monitorこれは良い選択ではないかもしれませんが、実際には十分にパフォーマンスが良いとは思いません。)

時にはパフォーマンスの問題がある場合は、ディスクの読み取りと書き込みを見てください。あなたが使用できるsudo iotop

時には、各プロセスのメモリ使用量のログを取得したいので、なぜメモリが不足してシステムが遅くなるのかを確認したいと思います。

atop上記のすべてを行うための素晴らしい小さなツールです。これが役に立つと思われる場合は、今すぐインストールすることをお勧めします。その後、必要に応じてこれについて学ぶことができます:-).

sudo atop -R「PSIZE」(「PSS」と同じ意味)を表示します。パッケージatopには、10分間隔で実行されるバックグラウンドサービスが含まれています。を使用してログファイルを開くことができますatop -r ...。これらのファイルは/var/log/atop/に保存されます。

関連情報