オペレーティングシステムによっては、デフォルト (4KB) よりも大きいメモリーページをサポートしている。このサポートの実装はハードウェアやオペレーティングシステムに依存します。大量のメモリーアクセスがあるアプリケーションの場合には、大規模ページを使用して、パフォーマンスを改善できる可能性がある。つまりトランスレーション・ルックアサイド・バッファー (TLB; Translation Lookaside Buffer) のミスが減る。
MySQL では、InnoDB で大規模ページを使用して、バッファープールと追加のメモリープールのメモリーを割り当てることができます。
現在、MySQL は Linux 実装だけをサポートしています。Linux ではこれを HugeTLB と呼んでいます。
        Linux
        で大規模ページを使用するには、カーネルでのサポートを有効にすることと、HugeTLB
        メモリープールを設定することが必要です。リファレンスとして、Linux
        ソースの
        Documentation/vm/hugetlbpage.txt
        ファイルに記述されている HugeTBL API
        を参照してください。
      
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
コマンドの出力が空ではないので、大規模ページのサポートは存在します。ただし、値 0 は、使用されるように設定されたページがないことを示します。
        大規模ページをサポートするようにカーネルを再設定する必要がある場合、手順については
        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 allowed 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 allowed 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

