オペレーティングシステムによっては、デフォルト (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