混乱した質問があります。私は以下を使用するライブラリを持っています。シンガポールカスタマイズを実行するためのCDBです。一部のシステムでは、メモリ割り当ての問題がよくあります。シンガポール。通常、シンガポールドライバには約4MBのハード制限がありますが、これらのシステムによっては約2.3MBを要求することがわかりました。つまり、CDBは2.3mbの転送割り当てを準備しているのです。これには問題はありません。2.3 < 4.0。
今マシンの概要です。私は64ビットCPUですが、CentOS 6.0 32ビットを実行しています(私は自分で構築しておらず、この決定には関係ありません)。このCentOSディストリビューションのカーネルバージョンは2.6.32です。 16GBのRAMがあります。
これはシステムのメモリ使用量です。 (ただし、このエラーは自動化テスト中に発生するため、このerrnoが返された時点の状態を反映していることを確認していません。)シンガポール)。
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
私が見つけたこの記事~からLinuxマガジンこれはカーネルにメモリを割り当てることに関するものです。記事は古いですが、2.6に関連しているようです(頭の部分に著者に関するいくつかのコメントがあります)。この記事では、カーネルのメモリ制限は約1 GBと呼ばれています(実際のメモリと仮想メモリのそれぞれ1 GBまたは合計メモリというテキストでは完全には明らかではありませんが)。これが2.6.32に対して正しいかどうか疑問に思います。最終的に、これらのシステムがこの限界に達したかどうか疑問に思います。
これは実際に私の質問に対する答えではありませんが、2.6.32の説明の正確さを知りたいです。それでは、カーネルの実際のメモリ制限はどのくらいですか?問題を解決するときは、この点を考慮する必要があります。他の提案も歓迎します。混乱しても、これらのシステムは他の多くのシステムと同じですが、同じ問題を示していません。
答え1
32ビットシステムでは、Linuxカーネルメモリの1GiB制限は32ビットアドレス指定の結果であり、非常に厳しい制限です。変更は不可能ではありませんが、変更には結果が続く正当な理由があります。
Linuxが誕生したばかりの1990年代初頭に戻りましょう。当時、私たちはLinuxが2MiB RAMで実行できるかどうかについて議論しました。本物必要4 フル MiB。もちろん、高度なスピードは16MiBモンスターサーバーを持って私たちを笑っています。
この興味深い小さなエピソードはどんなものに関連していますか?その世界では、単純な32ビットアドレス指定から得られた4GiBアドレス空間をどのように分割するかを決定するのは簡単です。一部のオペレーティングシステムは、アドレスの最上位ビットを「カーネルフラグ」として扱い、それを半分に分割します。アドレス 0 ~ 2 31 -1 にはユーザ空間コードに対して最上位ビットがクリアされ、アドレス 2 31~ 2 32 - 1 セット最高のビット、カーネルで使用されます。アドレスだけを見て知ることができます:0x80000000以上はカーネルスペースで、そうでない場合はユーザースペースです。
PCメモリサイズが4GiBメモリ制限に膨らみ、この単純な2/2分割が問題になり始めました。ユーザースペースとカーネルスペースの両方に多くのRAMが必要ですが、コンピューターの目的は通常、カーネルを実行するのではなくユーザープログラムを実行することであるため、オペレーティングシステムはユーザー/カーネルの分割を使用し始めます。 3/1分割は一般的なトレードオフです。
実際と仮想に関するあなたの質問は実際には重要ではありません。技術的にはこれは仮想メモリの制限ですが、これはLinuxがVMベースのオペレーティングシステムであるためです。 32GiBの物理RAMをインストールしても変更はなく、swapon
32GiBスワップパーティションを作成するのにも役立ちません。何をしても、32ビットLinuxカーネルは同時に4GiB以上を処理できません。
(はい、わかりますPAE。 64ビットオペレーティングシステムがついに座っているので、迷惑なハッキングを忘れてしまうことを願っています。とにかく、私はそれがこの状況であなたに役立つと信じていません。 )
さらに、1GiBカーネルVMの制限に達すると、2/2分割でカーネルを再構築できますが、これはユーザースペースプログラムに直接影響します。
64ビットが正解です。
答え2
何かを追加したいウォーレン・ヤングの素晴らしい回答、真実は彼が書いたよりも悪いからです。
1GBのカーネルアドレス空間は2つの部分に分けられます。の場合は128MB vmalloc
、の場合は896MBですlowmem
。実際に何を意味するのか気にしないでください。メモリを割り当てるとき、カーネルコードは必要なメモリを選択する必要があります。空き領域があるプールからメモリをインポートすることはできません。
を選択した場合、vmalloc
制限は128 MBです。もう1GBも悪くないようですね…
を選択した場合、lowmem
制限は896 MBです。 1GBとは大きく異なりますが、この場合、すべての割り当ては2の次の累乗に丸められます。したがって、2.3MBの割り当ては実際に4MBを消費します。また、使用時に単一の呼び出しに割り当てられたメモリは4 MBを超えることはできませんlowmem
。
64ビットが正解です。