MySQL大量使用swap文件

现象:
    一台高配的MySQL数据库服务器,双CPU48线程.
    CentOS 7
    本机磁盘是一万五千转的Raid 0.系统文件,Swap都分配在了本机磁盘.
    服务器挂载了一个SSD的磁盘阵列.数据库文件都存放在磁盘阵列中.
    
    系统运行之后,发现系统Swap大量使用,并且本机磁盘的IO使用率持续100%.

权宜之计:
    我把Swap挪到了盘阵中

原因:
    swap insanity
    NUMA架构

引用:
    对于单CPU,多核心的情况,每个核心访问内存的速度是一样的,这种架构称为SMP(Symmetric multiprocessing, 对称多处理器),又叫UMA(Uniform Memory Architecture,与NUMA相对,一致性内存访问架构)。
可以看到,每个CPU都有一组配套的内存槽。每个CPU访问自身的内存插槽,速度都很快,但对于主板上的其他内存插槽,访问速度就会下降。这种架构被称为NUMA。

    对于Linux来说,加载的时候就会检测内存,计算CPU到内存的访问开销,将CPU和内存分成一组组的。每个进程和线程,都会继承父进程的NUMA策略,这种策略包括这个进程/线程会在哪个CPU上运行,分配的内存应该用哪组插槽的。

    面对内存分配,只要一经分配到指定的CPU—内存槽,就不会再挪动了。对于数据库这类应用,理想情况下是一个单一的多线程进程,吃掉了几乎所有的系统内存,并尽可能多的消耗其余的系统资源例如IO。

    对于两个CPU的NUMA架构来说,如果一个核心分配的内存超过系统内存的一半,就会出现问题。而Linux的分配策略是,首先使用CPU 0,然后再使用CPU 1。这时候就会出现一种情况,CPU 0的内存组已经率先使用完了,但系统还有很多空闲内存,都在CPU 1上。这时候,Linux会选择将CPU 0的内存刷到磁盘上,以换取可用内存。但是,swap过程远比跨CPU访问内存要慢啊。这就会造成内存还没用光,但数据库疯狂刷盘的现象了。



参考:
http://www.cnblogs.com/Lifehacker/p/database_swap_insanity_on_Linux.html
https://blog.jcole.us/2010/09/28/mysql-swap-insanity-and-the-numa-architecture/
https://yq.aliyun.com/articles/50933

名称栏目:MySQL大量使用swap文件
标题网址:http://myzitong.com/article/gihjih.html