RAMデフラグ/OOMエラー

RAMデフラグ/OOMエラー

この質問はかなり長いので、質問を一番上に投稿し、問題の解決策を見てみましょう。

  1. (Busyboxベース)連続RAMが不足してrmが実行されていませんか?
  2. それでは、システムを再起動せずにDMAデフラグを実行する簡単な方法はありますか?
  3. そうでなければ、その理由は何ですか?今後このようなことが再発しないようにするにはどうすればよいですか?

過去数日間、テストシステムがかなり集中的に実行された後、リモートログインを介してシステムにログインしてテスト結果を確認しました。一部のデータを削除しようとすると、システムはコマンドラインを返します(コマンドが正しく実行されたかのように)。ディレクトリ内の他の結果セットを確認するときは、ファイルがまだ存在することを確認してください(lsを使用)。

その後、期待どおりに実行されないシェルコマンドがますます多くなることがわかりました。

出力から始めます。情報rm が正しく実行されなかった後:

プロセス6821(rm)で長さ61440の割り当てに失敗しました。

CPUあたりDMA:

CPU 0: こんにちは: 0, btch: $1: 0

Active_anon: 0 active_file: 1 inactive_anon: 0 inactive_file: 0 削除できません: 6 dirty: 0 writeback: 0 不安定: 0 アイドル: 821 flat: 353 マッピング: 0 ページ テーブル: 0 バウンス: 0

DMAアイドル:3284kB最小:360kB低:448kB高:540kB active_anon:0kB inactive_anon:0kB active_file:4kB inactive_file:0kB削除できません:24kB現在:8128kneいいえ

lowmem_reserve[]: 0 0 0

DMA: 31*4kB 47*8kB 42*16kB 64*32kB 1*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 0*4096kB = 3284

合計14ページのページキャッシュページ

プロセスデータにRAMを割り当てることはできません。エラー番号12

最初は、連続メモリの最大の部分でプログラムを実行できないと思いました。これは、DMAが断片化しすぎてシステムにメモリを最適化する方法を見つける必要があることを意味します。

その後、私は迅速な数学/完全性チェックを実行し、プログラムが唯一の64kB連続メモリスロットで実行できる必要があることに気づきました。 Rmは61440バイト(60kB)を要求しました。

私は古い「手動デフラグ」を実行し、システムを再起動しました。システムを再起動すると、/proc/buddyinfo が出力されます。

Node 0, zone DMA 2 8 3 12 0 1 0 1 0 1 0

次のマッピングが疑われます。

  • 2×4kB
  • 8x8KB
  • 3x16KB
  • 12×32KB
  • 1×128kB
  • 1x512KB

ただし、上記の値のリストを合計すると、次の出力と一致しません。/proc/メモリ情報:

MemTotal:           6580 kB
MemFree:            3164 kB
Buffers:               0 kB
Cached:              728 kB
SwapCached:            0 kB
Active:              176 kB
Inactive:            524 kB
Active(anon):          0 kB
Inactive(anon):        0 kB
Active(file):        176 kB
Inactive(file):      524 kB`
Unevictable:           0 kB
Mlocked:               0 kB
MmapCopy:            844 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:             0 kB
Mapped:                0 kB
Slab:               1268 kB
SReclaimable:        196 kB
SUnreclaim:         1072 kB
PageTables:            0 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:        3288 kB
Committed_AS:          0 kB
VmallocTotal:          0 kB
VmallocUsed:           0 kB
VmallocChunk:          0 kB

要約すると、私の質問は次のとおりです。

  1. 連続RAMが足りず、rmが動作しませんか?
  2. それでは、システムを再起動せずにDMAデフラグを実行する簡単な方法はありますか?
  3. そうでなければ、その理由は何ですか?今後このようなことが再発しないようにするにはどうすればよいですか?

私はuClinuxバージョン2.6.30を実行しているLantronixのXPort Pro(8MB、Linux OS)を使用しています。使用されたエンクロージャは静かです。

ベストアンサー1

メモリの最適化情報、見積もりカーネル文書:

現在、これらのファイルは次の場所にあります/proc/sys/vm。 [...]

compact_memory

のみ利用可能CONFIG_COMPRESSION設定しました。1ファイルに書き込むとき、すべての領域は、可能であれば連続ブロックに使用可能なメモリを提供するために圧縮されます。プロセスは必要に応じてメモリを直接圧縮することができますが、これは大きなページを割り当てるときに重要です。

これは次のコマンドを意味します(root権限で実行され、上記のカーネルオプションが有効になっている場合)。

echo 1 > /proc/sys/vm/compact_memory

できるだけ多くのメモリを最適化するようにカーネルに指示する必要があります。たとえば、一部のRHEL6バージョンではカーネルがクラッシュする可能性があります。

おすすめ記事