Linuxはメモリ需要が上がったときに大きなディスクキャッシュを解放しません


24

2.6.31-302 x86-64カーネルでUbuntuを実行します。全体的な問題は、「キャッシュ」カテゴリにメモリがあり、それが上昇し続け、アプリケーションで必要な場合でも解放または使用されないことです。

だからここに私が「無料」コマンドから得たものがあります。一見したところ、これは普通のことではありません。

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5750320    1608172          0       7848    1443820
-/+ buffers/cache:    4298652    3059840
Swap:            0          0          0

誰かが最初に言うことは、「心配しないで、Linuxはそのメモリを自動的に管理する」ということです。はい、メモリマネージャがどのように機能するかを知っています。問題は、それが正しいことをしていないということです。ここで「キャッシュされた」1.4 GBは予約済みで使用できないようです。

Linuxに関する私の知識から、3 GBは「無料」であることがわかります。しかし、システムの動作はそうではないと言っています。使用量のピーク時に1.6 GBの実際の空きメモリが使い果たされると、より多くのメモリが要求されると(および最初の列の「空き」が0に近づくと)、OOMキラーが呼び出され、プロセスが強制終了され、問題が発生し始めますにもかかわらずで「無料」 - / +バッファ/キャッシュ行はまだ持っている約1.4 GB「無料」。

主要なプロセスのoom_adjの値を調整して、システムをひざまずかせないようにしましたが、それでも重要なプロセスは強制終了され、そのポイントには到達したくありません。特に、理論的には、ディスクキャッシュを削除するだけであれば1.4GBが「無料」のままです。

ここで何が起こっているのか誰にも分かりますか?インターネットには、Linuxの「無料」コマンドに関する愚かな質問と「なぜ空きメモリがないのか」が殺到しており、そのためこの問題については何も見つかりません。

私の頭に浮かぶ最初のことは、スワップがオフになっていることです。それについて固執するシステム管理者がいます。それらがバックアップされている場合、私は説明を受け入れます。これは問題を引き起こす可能性がありますか?

実行後は無料echo 3 > /proc/sys/vm/drop_cachesです:

# free
             total       used       free     shared    buffers     cached
Mem:       7358492    5731688    1626804          0        524    1406000
-/+ buffers/cache:    4325164    3033328
Swap:            0          0          0

ご覧のとおり、ごくわずかな量のキャッシュが実際に解放されますが、約1.4 GBが「スタック」しているように見えます。もう1つの問題は、この値が時間とともに上昇するように見えることです。別のサーバーでは2.0 GBがスタックしています。

私はこの記憶を本当に戻したい...どんな助けでも大歓迎だろう。

ここだcat /proc/meminfo、それは何も価値があるとします。

# cat /proc/meminfo 
MemTotal:        7358492 kB
MemFree:         1472180 kB
Buffers:            5328 kB
Cached:          1435456 kB
SwapCached:            0 kB
Active:          5524644 kB
Inactive:          41380 kB
Active(anon):    5492108 kB
Inactive(anon):        0 kB
Active(file):      32536 kB
Inactive(file):    41380 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:               320 kB
Writeback:             0 kB
AnonPages:       4125252 kB
Mapped:            42536 kB
Slab:              29432 kB
SReclaimable:      13872 kB
SUnreclaim:        15560 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     3679244 kB
Committed_AS:    7223012 kB
VmallocTotal:   34359738367 kB
VmallocUsed:        7696 kB
VmallocChunk:   34359729675 kB
DirectMap4k:     7340032 kB
DirectMap2M:           0 kB

3
キャッシュの説明はありませんが(mmapされたファイルがおそらく入ってくるのではないかと思いますが)、人類のためにシャベルと生石灰を取り、「スワップは不要です」を取り除きますRAMがたくさんあるなら!」ブースター。彼らは合理的な議論に対して免疫があり、危険なほど間違っています。OOMキラーがストーカーしているという事実は、この症状の1つにすぎません。
ウォンブル

私の考えは正確に。アドバイスをありがとう。スワップが必要な理由に関する他の良い記事や議論を知っていますか?
トリスウェブ

6
スワップがない場合、このようなことが起こるからです。ただし、スワップの否定について議論しようとしないでください。「あなたはここでスワップをしたくない場合は、生石灰を抜け出すかと言うどちらかあなたはあなたが作成を主張してきたこの混乱を解決します」。彼らは最終的に自分自身の心を変えるか、しようとして死ぬでしょう。どちらの方法でも問題は解決しました。
ウォンブル

すばらしい、ヒントをありがとう。ところで、mmapされたファイルについては正しかった-簡単なlsofがメモリを占有するログファイルのギグを示した。それらをクリアすることで問題は解決しました。
トリスウェブ

問題は、スワップなしでは、オーバーコミットするとOOMキラーが実行され、オーバーコミットしないとプロセスを起動できないシステムになるということです。RAMを効果的に使用するには、スワップが必要です。
デビッドシュワルツ14年

回答:


8

私は自分の質問に対する答えを発見しました-wombleの助けのおかげです(お望みなら答えを提出してください)。

lsof -s 使用中のファイルハンドルを表示し、キャッシュを占有するmmap'dログファイルが数ギガバイトあったことがわかります。

logrotateを実装すると、問題が完全に解決し、より多くのメモリを利用できるようになります。

また、スワップを再度有効にして、今後OOMキラーで問題が発生しないようにします。ありがとう。


2
mmapされたページは破棄できるため、キャッシュが固定されることはありません。ramfsを使用していますか?
-psusi

こんにちは、古いスレッドを掘り下げて申し訳ありませんが、私は現在同じ問題に直面しておりlsof -s、異常な使用法を示していません。しかし、私はあなたが言ったようにramfsを使用しています[そして、drop_caches機能を持たない2.6.10カーネル]。容疑者は何だと思いますか?
ラム

1
ヒントをありがとう!lsof -s | sort -rnk 7 | less現在、ツールボックスに追加しています。他の読者への注意:これはのような大きなエントリかもしれ/proc/net/rpc/nfs4.nametoid/channelませんが、私の場合は犯人ではありませんでした。
ニコレイ

大きなファイルまたはプログラムがmlockを使用していないことを確認してください。で/proc/meminfo「Unevictable」ページをご覧ください。
マイケルマルティネス

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.