私は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でも同じ問題が発生しました。
ルビーコード:
#!/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点)をクリックします。 「マイプロセス」から「すべてのプロセス」に選択を変更します。
- 単一の数値で使用されるシステムRAMと使用可能なシステムRAMの比較
- /proc/meminfo 分析
- 利用可能なその他のツール -
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 kB
AnonPages
MemAvailable
増加すると、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
インストールされているファイルが含まれていますtmpfs
。tmpfs
を使用してインストールされているすべてを確認できます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以下であると推測されます。だから、まだわからない使い方があります。
コアボードメモリ
「リサイクル不可能なタブレット」メモリが少なくなりますMemAvailable
。SUnreclaim: 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/に保存されます。