Linuxで4G / 4G分割を有効にする方法は?

Linuxで4G / 4G分割を有効にする方法は?

これは、32ビットバイナリを使用し(...まだ使用する必要があります)、4G制限を考慮するシステムに便利な機能です。

これは、本質的に、32ビットユーザースペースコード、32ビットユーザースペースデータ、および(PAEの場合は32ビットまたは64ビット)カーネルが次の場所にあることを意味します。その他アドレス空間は、本質的に、プロセスがデータを記憶するために可能な最大4Gアドレス空間をほぼ全て使用できるようにする。

一部を除く古代発表、残念ながらもう見つかりません。

2.5.74 Linuxカーネル用の「4GB/4GB VM分割」パッチの最初の公開リリースを発表したことを嬉しく思います。

http://redhat.com/~mingo/4g-patches/4g-2.5.74-F8

4G / 4Gスプリット機能は、主により多くのコア/ユーザーVMを望むか、または確保する必要がある大容量RAM x86システム用ですが、システムコールごとにTLBフラッシュオーバーヘッドが発生します。

私たち全員が知っているように、x86では合計仮想メモリ量が4 GBに制限されています。合計4GBのVMのうち、3GBはユーザースペース(0x00000000-0xbffffffff)に使用され、1GBはカーネル(0xc0000000-0xffffffff)に使用されます。このVMスキームを3/1分割と呼びます。この分割は、RAMが1GBに達するまでうまく機能します。 "highmem"はさまざまな大規模なキャッシュ(およびオブジェクト)を高いメモリ領域に移動するため、1 GB RAMの前にも機能します。

テストでは、一部のプロセスが2〜3GB程度で競合が発生し始めました。

どうすればいいですか?私は比較的新しいカーネル(4.10)を使用しています。 32ビットユーザースペースで64ビットカーネルを使用するか、32ビットPAEカーネルを使用できます。

一部のプロセスだけが4G/4Gを使ったら十分でしょうが、必ず必要なようです。

ベストアンサー1

64ビットカーネルには、すでに32ビットユーザースペースプログラムにアクセスできるフル4Gスペースがあります。端末に次のように入力して直接確認してください(警告:このコマンドを実行すると、システムに使用可能な4GiB RAMがないとシステムが応答しなくなる可能性があります)。

cd /tmp
cat > test.c <<"EOF"
#include <stdlib.h>
#include <stdio.h>
int main()
{
    size_t allocated=0;
    while(1)
    {
        const size_t chunkSize=4096;
        char* p=malloc(chunkSize);
        if(!p) return 0;
        *p=1;
        allocated+=chunkSize;
        printf("%zu\n",allocated);
    }
    return 0;
}
EOF
gcc test.c -o test -m32 && ./test | tail -n1

私のx86_64カーネル3.12.18では約4GiB〜12.3MiBを得た4282097664ので、4G / xG分割の実装を検討するのが合理的です。

おすすめ記事