
この質問はかなり長いので、質問を一番上に投稿し、問題の解決策を見てみましょう。
- (Busyboxベース)連続RAMが不足してrmが実行されていませんか?
- それでは、システムを再起動せずにDMAデフラグを実行する簡単な方法はありますか?
- そうでなければ、その理由は何ですか?今後このようなことが再発しないようにするにはどうすればよいですか?
過去数日間、テストシステムがかなり集中的に実行された後、リモートログインを介してシステムにログインしてテスト結果を確認しました。一部のデータを削除しようとすると、システムはコマンドラインを返します(コマンドが正しく実行されたかのように)。ディレクトリ内の他の結果セットを確認するときは、ファイルがまだ存在することを確認してください(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
要約すると、私の質問は次のとおりです。
- 連続RAMが足りず、rmが動作しませんか?
- それでは、システムを再起動せずにDMAデフラグを実行する簡単な方法はありますか?
- そうでなければ、その理由は何ですか?今後このようなことが再発しないようにするにはどうすればよいですか?
私は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バージョンではカーネルがクラッシュする可能性があります。
答え2
私は少し時間がかかりましたが、3つのサブ質問に対するすべての答えが得られるまで答えを保留にする必要があると思いました。
始める前に、作業記憶を「構成」することについて話すとき、正確な用語は作業記憶を「圧縮」することに言及したいと思います。
1.連続RAMが不足してrmが実行されないのですか?
私の結論は正しいです。連続RAMが不足しているため、rmは実行されません。システムは引き続きRAMを使用して断片化するため、回収できません。
2.もしそうなら、システムを再起動せずにDMAデフラグを実行する簡単な方法はありますか?
組み込みシステムを再起動する以外に、メモリを圧縮する方法がないことがわかりました。 MMUのないシステムでは、予防が最も重要です。
ソフトウェアでMMUをエミュレートするためにLinuxカーネルをハッキングすることが可能かどうか疑問に思います。可能であれば、誰かがすでにやったと思います。まったく新しい概念とは思えない;)
3.これからこれが起こらないようにするにはどうすればよいですか?
このプロジェクトでは、必要に応じてcronを使用してプログラムを手動で起動しました。より良いアプローチは、起動時にプログラムを呼び出してから、必要になるまでプログラムを強制的にスリープモードにすることです。これにより、使用するたびにメモリを割り当てる必要がなくなります。これにより断片化を減らします。
プロジェクトの最初の繰り返しでは、シェルスクリプト呼び出しを使用して重要な機能(rmなど)を実行しました。必ずしも必要でなければ、車輪を再発明する必要はないと思います。
ただし、MMUを持たないシステムでは、可能であればシェルの使用を避けることをお勧めします。
(質問、実行するとどうなりますかls -la /path/to/directory/ | grep file-i-seek
? )
(回答:新しい子プロセスを開始します)
Cプログラムでいくつかのコアシェルスクリプト機能を実装する必要がある場合は、以下で使用されるソースコードを調べることをお勧めします。忙しい箱。組み込みシステムでは、C言語を使用する可能性が高いです。