MySQL + 大页面 + 内存锁
MySQL + hugepages + memlock
我已成功配置 Ubuntu 服务器,因此 MySQL 可以使用大页面。问题是当我想在 my.cnf
中启用 memlock
选项并且 /proc/sys/vm/hugetlb_shm_group
设置为另一个组(MySQL 是该组的成员)。
# uname -a
Linux hostname 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
# mysqld --version
mysqld Ver 5.5.53-0ubuntu0.12.04.1 for debian-linux-gnu on x86_64 ((Ubuntu))
# egrep ^Huge /proc/meminfo
HugePages_Total: 15000
HugePages_Free: 15000
HugePages_Rsvd: 0
HugePages_Surp: 0
# id mysql
uid=107(mysql) gid=113(mysql) groups=113(mysql),117(hugetlb)
如果 /proc/sys/vm/hugetlb_shm_group
设置为 113
,则无论 memlock
选项如何,一切顺利。
但是如果我将 /proc/sys/vm/hugetlb_shm_group
设置为 117
它只在没有 memlock
选项的情况下有效。如果我启用它,我会在 MySQL 启动时收到此错误:
InnoDB: HugeTLB: Warning: Failed to allocate 21978152960 bytes. errno 1
InnoDB HugeTLB: Warning: Using conventional memory pool
知道哪里出了问题吗?
原来是 ulimit
的问题。 /etc/security/limits.conf
中的设置被忽略,所以我在 /etc/init/mysql.conf
:
中进行了简单的编辑
exec /usr/bin/mysqld
改为
script
ulimit -l unlimited
/usr/bin/mysqld
end script
我已成功配置 Ubuntu 服务器,因此 MySQL 可以使用大页面。问题是当我想在 my.cnf
中启用 memlock
选项并且 /proc/sys/vm/hugetlb_shm_group
设置为另一个组(MySQL 是该组的成员)。
# uname -a
Linux hostname 3.13.0-32-generic #57~precise1-Ubuntu SMP Tue Jul 15 03:51:20 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
# mysqld --version
mysqld Ver 5.5.53-0ubuntu0.12.04.1 for debian-linux-gnu on x86_64 ((Ubuntu))
# egrep ^Huge /proc/meminfo
HugePages_Total: 15000
HugePages_Free: 15000
HugePages_Rsvd: 0
HugePages_Surp: 0
# id mysql
uid=107(mysql) gid=113(mysql) groups=113(mysql),117(hugetlb)
如果 /proc/sys/vm/hugetlb_shm_group
设置为 113
,则无论 memlock
选项如何,一切顺利。
但是如果我将 /proc/sys/vm/hugetlb_shm_group
设置为 117
它只在没有 memlock
选项的情况下有效。如果我启用它,我会在 MySQL 启动时收到此错误:
InnoDB: HugeTLB: Warning: Failed to allocate 21978152960 bytes. errno 1
InnoDB HugeTLB: Warning: Using conventional memory pool
知道哪里出了问题吗?
原来是 ulimit
的问题。 /etc/security/limits.conf
中的设置被忽略,所以我在 /etc/init/mysql.conf
:
exec /usr/bin/mysqld
改为
script
ulimit -l unlimited
/usr/bin/mysqld
end script