ハードウェアまたはオペレーティングシステムのアーキテクチャーによっては、デフォルト (通常は 4K バイト) よりも大きいメモリーページをサポートしています。 このサポートの実際の実装は、ベースとなるハードウェアやオペレーティングシステムに依存します。 大量のメモリーアクセスがあるアプリケーションの場合、大きいページを使用して、トランスレーションルックアサイドバッファー (TLB; Translation Lookaside Buffer) のミスが減ることによってパフォーマンスが改善される可能性があります。
MySQL では、InnoDB でラージページを使用して、バッファープールと追加のメモリープールにメモリーを割り当てることができます。
MySQL での標準的な大規模ページの使用では、サポートされる最大サイズである 4M バイトまでの使用が試行されます。 Solaris では「超大規模ページ」機能により 256M バイトまでのページの使用が可能です。 この機能は最新の SPARC プラットフォームで使用できます。 これは --super-large-pages
または --skip-super-large-pages
オプションを使用して有効または無効にできます。
MySQL は、ラージページのサポートの Linux 実装 (Linux では HugeTLB と呼ばれる) もサポートします。
Linux でラージページを使用する前に、カーネルで、それらをサポートできるようにする必要があり、HugeTLB メモリープールを構成する必要があります。 参考のため、HugeTBL API は、Linux ソースの Documentation/vm/hugetlbpage.txt
ファイルで説明されています。
Red Hat Enterprise Linux などの一部の最近のシステムのカーネルでは、ラージページ機能がデフォルトで有効にされているようです。 使用しているカーネルにこれが当てはまるかどうかを確認するには、次のコマンドを使用し、「huge」 を含む出力行を探します。
shell> cat /proc/meminfo | grep -i huge
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
空でないコマンド出力は、ラージページのサポートが存在することを示しますが、ゼロの値は、使用するように構成されたページがないことを示します。
ラージページをサポートするようにカーネルを再構成する必要がある場合、手順については hugetlbpage.txt
ファイルを参照してください。
Linux カーネルでラージページのサポートが有効にされていると仮定し、それを次のコマンドを使用して、MySQL で使用するように構成します。 通常、システムが起動するたびにコマンドが実行されるように、システムのブートシーケンス中に実行される rc
ファイルまたは同等の起動ファイルにこれらを入れます。 コマンドは、ブートシーケンスの早期の、MySQL サーバーが起動する前に実行されるべきです。 システムに適切なように、割り当ての数値とグループ番号を変更してください。
# Set the number of pages to be used.
# Each page is normally 2MB, so a value of 20 = 40MB.
# This command actually allocates memory, so this much
# memory must be available.
echo 20 > /proc/sys/vm/nr_hugepages
# Set the group number that is permitted to access this
# memory (102 in this case). The mysql user must be a
# member of this group.
echo 102 > /proc/sys/vm/hugetlb_shm_group
# Increase the amount of shmem permitted per segment
# (12G in this case).
echo 1560281088 > /proc/sys/kernel/shmmax
# Increase total amount of shared memory. The value
# is the number of pages. At 4KB/page, 4194304 = 16GB.
echo 4194304 > /proc/sys/kernel/shmall
MySQL で使用する場合、通常 shmmax
の値を shmall
の値に近くなるようにしたいと考えます。
ラージページの構成を確認するには、前述のとおりに再度 /proc/meminfo
をチェックします。 これで、0 以外の値が表示されるはずです。
shell> cat /proc/meminfo | grep -i huge
HugePages_Total: 20
HugePages_Free: 20
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
hugetlb_shm_group
を使用するための最後の手順は、mysql
ユーザーに、memlock 制限として 「unlimited」 値を指定することです。 これを行うには、/etc/security/limits.conf
を編集するか、次のコマンドを mysqld_safe スクリプトに追加します:
ulimit -l unlimited
ulimit コマンドを mysqld_safe に追加すると、mysql
ユーザーに切り替える前に root
ユーザーの memlock 制限が unlimited
に設定されます。 (これは、mysqld_safe が root
によって起動されたものと仮定します。)
MySQL のラージページのサポートはデフォルトで無効にされています。 それを有効にするには、サーバーを --large-pages
オプションで起動します。 たとえば、サーバー my.cnf
ファイルで次の行を使用できます:
[mysqld]
large-pages
このオプションを使用すると、InnoDB
はそのバッファープールと追加のメモリープールに自動的にラージページを使用します。 InnoDB
がこれを実行できない場合、従来のメモリーの使用に戻り、エラーログに警告を書き込みます: Warning: Using conventional memory pool
ラージページが使用されていることを確認するには、再度 /proc/meminfo
をチェックします。
shell> cat /proc/meminfo | grep -i huge
HugePages_Total: 20
HugePages_Free: 20
HugePages_Rsvd: 2
HugePages_Surp: 0
Hugepagesize: 4096 kB