1、 swappiness=0
这是一个倾向性的值,并不能完全避免swap的使用。该值的范围是0~100,默认值是60,当swappiness=0时,会最大可能性尽量避免使用swap。
2、 innodb_flush_method设为O_DIRECT
innodb_flush_method的选项有:fdatasync、O_DSYNC、O_DIRECT。
/* We disable OS caching (O_DIRECT) only ondata files */
if (type != OS_LOG_FILE &&
srv_unix_file_flush_method == SRV_UNIX_O_DIRECT)
{
os_file_set_nocache(file, name, mode_str);
}
说明了除日志文件外,buffer pool都会绕过cache,直接对应磁盘。但是日志文件还是会写入cache中。也有可能会使用swap,但是由于mysql的log是覆盖循环写入的,因此影响并不会很大。
3、 memlock强制使用物理内存
memlock将不会使用swap,但是必须以root用户启动mysql,局限性较大。
解决方法:
l 重启swap
1、 free 查看是否有内存足以存放swap中的数据
total used free shared buffers cached
Mem: 64410 64117 292 0 127 9846
-/+buffers/cache: 54143 10267
Swap: 12287 3346 8941
注:Mem中的free并没有实际意义,它用于表示未被分配为buffer/cache的内存大小,而这里我们需要关注的是buffer/cache中free的大小,该大小大于swap中used的大小,方可重启swap,不然mysql进程可能会被强制关闭。
2、 swapoff -a && swapon -a&
关闭,再打开swap
以上可能有所疏漏,但是为自己所理解,并会不断改进,欢迎多多指教。