memlock - xiaoboluo768/qianjinliangfang GitHub Wiki
- mysqld启动选项(对应的server system variables为locked_in_memory),如果开该参数,则会把分配给mysqld的内存锁定在物理内存中,防止被交换到swap空间中,以提高数据访问和操作效率,在内存资源紧张时,可以尽量保证分配给mysqld的内存不被swap out到磁盘。但是有些副作用,比如:mysqld运行在一个大内存的服务器上,而buffer pool参数配置得又比较大时,如果mysqld执行重启操作,分配给mysql的内存越大启动时间越长,同时在mysqld尚未启动成功之前,涉及到会收集内存统计信息的所有命令都会被hang住(如ps aux命令需要读取/proc下的一些信息,/proc/$mysqlpid/cmdline文件在mysqld没启动完成之前不可读),因为mysqld使用memlock参数实际上是使用了mlockall()系统调用,这个操作会把mysqld分配的内存大小一次性都给锁住(分配给mysqld的内存size中的每个内存page都需要设置PG_mlocked标签,所以导致分配动作很慢,内核memlock详情参考:https://www.kernel.org/doc/Documentation/vm/unevictable-lru.txt),直到mysqld启动成功。过程中其他需要读取这部分内存分配信息的进程都需要进行等待。当然,如果在你的mysql服务器操作系统中有因为内存不足而导致mysqld的占用的内存被swap out到磁盘的问题发生,那么则此选项可能有所帮助。
- memlock启动选项只在支持mlockall()系统调用的生效系统上有用。操作系统包括Solaris、大多数使用2.4或更高内核版本的Linux发行版,以及其他Unix系统。在Linux系统上,您可以通过检查在系统mman.h文件中是否有定义mlockall()来判断你的操作系统是否受支持mlockall()系统调用,如下所示:shell> grep mlockall /usr/include/sys/mman.h,如果支持mlockall(),你应该能看到输出如下:extern int mlockall(int __flags)__THROW;
- 注意:
- 使用此选项可能需要以root用户身份运行mysql server,出于安全考虑,这通常不是一个好主意。
- 在Linux和其他系统上,如果需要限制以root启动mysql server,您可以通过更改limits.conf文件来避免以root用户身份运行服务器(关于memlock limit以及使用large-pages参考链接:https://dev.mysql.com/doc/refman/5.6/en/large-page-support.html)
- 不要尝试在不支持mlockall()系统调用的系统上使用此选项,否则mysqld很可能启动失败
- 布尔类型,默认值为FALSE,如果设置为ON,则代表使用mlockall()系统调用来分配mysqld的内存。另外,该选项并不是mysqld配置参数(非system variables,非innodb variables),而是mysqld的一个启动选项。
上一篇:optimizer_switch | 下一篇:default_password_lifetime