在linux内核中有一个叫 swappiness 的参数。可以调整内存的使用方式。

 

默认情况下,这个数值为60,这意味着内核会比较多的为文件系统提供内存作为缓存,甚至会将一些程序占据的内存交换到swap中以腾出内存。

这正好与使用innodb引擎的mysql数据库有冲突:innodb缓冲池本来就相当于文件系统的缓存,它会缓存住一部分读取过的数据库。

这部分内存通常不会怎么修改变动,所以操作系统就更会倾向于交换出这部分内存到swap中。这样,当mysql真的需要innodb缓冲区中

的数据时,操作系统需要重新读取相应的swap到内存中,甚至更糟的是它会将其他部分内存交换到swap以保持足够的系统内存(文件系统缓存)。

这就使得innodb缓冲区不但没起到加速的作用,反而比不缓存更慢。

 

对于这种情况,可以考虑把 swappiness 参数设置为0:尽量倾向于把内存分配给程序进程(这里正好是指innodb缓冲区),而不是文件系统缓存。

 

具体命令如下:

echo 0 > /proc/sys/vm/swappiness