問題タブ [huge-pages]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux - ファイルの共有メモリマップに Linux hugetlbfs を使用するには?
mmap()
大きなデータベース ファイルに効率的にアクセスするために共有メモリを使用するプログラムがあります。巨大なページで実験して、速度が上がるかどうかを確認したいと思います。
データベース ファイルを Linux のhugetlbfsディレクトリにコピーし、古い場所にシンボリック リンクを作成するのが手早く簡単な方法だと思いました。
ただし、cp
コマンドがファイルに書き込めないため、これは機能しません。ftrunc()
およびmmap()
システム コールを呼び出してファイルに書き込むことによってのみ、ファイルを作成できると思われます。既存のツールについて説明する回答が得られない限り、おそらくこれを行うコピー ツールを作成してみます。
Linux でヒュージ ページを使用して共有メモリ マップを実行する他の良い方法を探しています。
php - 巨大なPDFファイルの書き方
FPDFを使用しています。
10ページ程度ごとにディスクに書き込む必要があります。そうしないと、メモリが使い果たされます。
どうすればいいですか?
出力メソッド('filename.pdf'、'F')を呼び出してみました。ループでは、これは機能しません。
それがどのように見えるべきかについて何か考えはありますか?
jvm - -XX:+UseLargePagesが有効になっているJVMを作成できません
現在14GBのヒープで実行されているJavaサービスがあります。-XX:+ UseLargePagesオプションを試して、これがシステムのパフォーマンスにどのように影響するかを確認したいと思います。適切な共有メモリとページ値を使用して、Oracleの説明に従ってOSを構成しました(これらはオンラインツールを使用して計算することもできます)。
OSを構成すると、予想される量のメモリが巨大なページとして割り当てられていることがわかります。ただし、-XX:+UseLargePages
オプションセットを使用してVMを起動すると、常に次のいずれかのエラーが発生します。
-Xms
/-Xmx
が巨大なページ割り当てとほぼ等しい場合:
-Xms
/-Xmx
が巨大なページ割り当てより少ない場合:
ある程度の余裕を持たせてみました。32GBのシステムで、24GBの共有メモリと巨大なページを20GBのヒープで構成されたJVMで使用するために割り当てましたが、現在は14GBしか使用されていません。また、JVMを実行しているユーザーがと一致するグループ権限を持っていることを確認しました/proc/sys/vm/hugetlb_shm_group
。
誰かが私がどこで間違っているのか、そして次に何を試すことができるのかについてのいくつかの指針を私に与えることができますか?
割り当て/使用率:
-Xms
/-Xmx
-20GB- 使用されるヒープ-14GB
/proc/sys/kernel/shmmax
-25769803776(24GB)/proc/sys/vm/nr_hugepages
-12288
環境:
- システムメモリ-32GB
- システムページサイズ-2048KB
- debian 2.6.26-2-amd64
- Sun JVM 1.6.0_20-b02
解決
解決策につながる答えを提供してくれた@jfgagneに感謝します。 /proc/sys/kernel/shmall
設定(4KBページとして指定)に加えて、Thomasのブログで説明されているようにエントリを追加する必要がありまし/etc/security/limits.conf
た。ただし、アプリケーションの使用を開始すると、rootユーザーの設定も複製する必要がありました(制限はKBで指定されていることに注意してください)。jsvc
-version
また、次の引数を使用してJVMを起動することにより、設定をすばやくテストできることにも言及する価値があります。
c - 複数のプロセスを使用して malloc() を SYS V 共有メモリに変換する
標準の 4Kb ページではなく、Linux で静的に割り当てられたヒュージ ページを利用するプログラムの改善に取り組んでいます。すでに静的なヒュージ ページをサポートするシステムをセットアップし、ヒュージ ページ プール (/prov/sys/vm/nr_hugepages) に大量のヒュージ ページを割り当てました。私の希望は、プログラムを調べて、大規模な malloc() が発生している場所を見つけて、malloc() を削除し、SHM_HUGETLB フラグが設定された shmget/shmat に置き換えることでした。
これは高度な並行プログラムであることに注意してください。
共有メモリを使用する私の目標は、実際に共有された方法でメモリを使用することではありません。malloc() ルーチンのすべての機能を保持しながら、その代わりに静的に割り当てられた巨大なページのサポートを使用したいと考えています。
以下は、私が達成しようとしているもののサンプル コード セグメントです。プログラムがこの時点に到達する前に、多くのプロセスがフォークされています。各プロセスは、このコード セグメントを同時に処理します。もともと、このセグメントには次のコードだけが含まれていました。
これはうまくいきます。
これを次のように変更しました。
注!!: 私は乱数をキーとして使用するので、各プロセスは、独立したメモリ割り当てであることを識別するランダム キーを持ちます。
この新しい実装では、PANEL->WORK から読み取ろうとするたびに、セグメンテーション エラーが発生します。これがセグメンテーション違反である理由を実際に掘り下げる前に、私はこれに正しく取り組んでいるかどうか疑問に思わずにはいられません。これはこれにアプローチする最善の方法ですか?この方法論に誤りがある人はいますか?
linux - 大きなページでのパフォーマンスの低下
Javaベンチマーク(SPECJbb)で遊んでいますが、大きなページ(1ページあたり2M)を有効にするとパフォーマンスが低下することがわかりました。私たちのサーバーはNUMA
アーチベースで、80コア(HTが有効な場合は160論理CPU)と260G
メモリを備えています。
ベンチマークは200G
メモリを消費するため、カーネルラージページプールに200Gラージを割り当てましたが、パフォーマンスは6%~8%
低下しています。このベンチマークは200Gのメモリを使用しているため、パフォーマンスがある程度向上するはずです。
私の質問は、どのような状況で、大きなページを使用するとパフォーマンスが低下するかについてです。私たちのOSはRHEL6.3
、HotSpot JDK 1.6.38
とを試し1.6.37
ましたが、これら2つのバージョンの両方でこのような劣化が見つかりました。ありがとう。
windows - コードでWindowsの大きなページを使用するにはどうすればよいですか?
大きなページを有効にした場合、OSはそれを利用しますか、それともコードを変更する必要がありますか?たとえば、HeapAllocが内部で大きなページを使用することを期待できますか?
64ビットのWindowsServer2008を使用していることを付け加えておきます。
windows - CreateFileMapping / OpenFileMapping にアドレスを提供する方法
使用するアドレスのマッピングを提供するために使用できる関数はありますか?
小さなファイルをマップする必要がある場合でも、大きなページを利用する方法を見つけようとしています。私はメモリを浪費できることを知っています。必要に応じて、VirtualAlloc を使用してページ サイズのブロックを割り当て、それを分割して複数のファイルにマップすることができます。メモリ マッピングは仮想メモリ サブシステムによってサポートされているため、これは不可能であると想定しています。おそらく、メモリの 1 ページを 1 つのファイルでサポートする必要があります。
何かをする前に聞いてみようと思いました。
windows - Windowsの下で、スタックに大きなページを使用させる方法はありますか?
SEC_LARGE_PAGESまたは同等のものを使用してスタックを割り当てるようにWindowsプログラムをコンパイルする方法はありますか?
ubuntu - Ubuntu で透過的なヒュージ ページをデフォルトで有効にするにはどうすればよいですか?
Ubuntu で透過的なヒュージ ページをデフォルトで有効にするにはどうすればよいですか?
java - Linux 上の Java hotspot jvm でのヒュージ ページと DirectByteBuffer の使用
やりたいこと
GC が物事を動かさないようにするには、ダイレクト メモリを使用する必要があります。それらのために巨大なページを有効にしたいと思います。
ここのところ
フラグ -XX:+UseLargePages は、ヒープ バッファー (非直接 ByteBuffers) を使用する場合は正常に機能しますが、DirectByteBuffers を使用する場合は機能しなくなりました。MappedByteBuffers と hugetlbfs ファイルシステムも使用してみました。これは機能しますが、いくつかの問題が発生するため、別の解決策を探しています。
CentOS リリース 6.3、ホットスポット、jdk1.7 の構成
[編集]
hotspot のソース コードを見ると、malloc を使用して Unsafe でメモリを割り当てていますが、巨大なページを使用するには shmat/shmget または mmap が必要でした。
[編集] 非ヒープメモリの理由
私たちは、メモリ内データベースの NUMA コンテキストにあり、多くの長期間有効なオブジェクトがあります。UseNUMA フラグがオンの場合、JVM は古い世代を分割しません。ダイレクト メモリを使用すると、メモリを必要とするスレッドの近くにメモリを保持できます。
DirectByteBuffers を使用する決定には、明らかにベンチマークが大きな役割を果たしました。DirectByteBufferを使用する必要があるかどうかを尋ねているのではなく、質問に対する答えを探しています。