40.3.2. systemd サービスユニットを使用した HugeTLB を設定
systemd サービスユニットを使用して、ユーザー空間のブートプロセス中に HugeTLB ページを設定できます。この方法では、カーネルが初期化された後、ほとんどのユーザー空間サービスが開始される前に、大きなメモリーページを予約できます。この方法は、カーネルコマンドラインで設定する方法ほど早い段階で行われるものではありませんが、システムの運用中にアプリケーションが必要な huge page にアクセスできるようにするには効果的です。
前提条件
- システムの root 特権がある。
手順
/usr/lib/systemd/system/ディレクトリーにhugetlb-gigantic-pages.serviceという新しいファイルを作成し、以下の内容を追加します。[Unit] Description=HugeTLB Gigantic Pages Reservation DefaultDependencies=no Before=dev-hugepages.mount ConditionPathExists=/sys/devices/system/node ConditionKernelCommandLine=hugepagesz=1G [Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/lib/systemd/hugetlb-reserve-pages.sh [Install] WantedBy=sysinit.target/usr/lib/systemd/ディレクトリーにhugetlb-reserve-pages.shという新しいファイルを作成し、以下の内容を追加します。#!/bin/sh nodes_path=/sys/devices/system/node/ if [ ! -d $nodes_path ]; then echo "ERROR: $nodes_path does not exist" exit 1 fi reserve_pages() { echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages } reserve_pages <number_of_pages> <node><number_of_pages>は、予約する 1 GB ページの数に置き換えます。<node>は、これらのページを予約するノード名に置き換えます。たとえば、node0に 2 つの 1 GB ページを予約し、node1に 1 つの 1 GB ページを予約するには、<number_of_pages>を、node0の場合は2に、node1の場合は1に置き換えます。実行可能なスクリプトを作成します。
# chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh初期のブート予約を有効にします。
# systemctl enable hugetlb-gigantic-pages.service注記-
任意のタイミングで nr_hugepages に書き込みを行うことにより、ランタイム時にさらに
1 GBページを予約してみることができます。ただし、メモリーの断片化による失敗を防ぐために、起動プロセスの早い段階で 1 GB のページを予約してください。 - 静的 Huge Page を確保することで、システムで利用可能なメモリー量を効果的に減らすことができます。ただし、メモリーの全容量を適切に使用できなくなります。予約済み huge page のプールのサイズが適切に設定されていると、それを使用するアプリケーションにメリットがあります。しかし、予約済み huge page のプールが大きすぎる場合や使用されていない場合、最終的にシステム全体のパフォーマンスに悪影響が発生します。予約済み huge page プールを設定するときは、システムがメモリー全容量を適切に使用できることを確認してください。
-
任意のタイミングで nr_hugepages に書き込みを行うことにより、ランタイム時にさらに