LINUX系统编程交换原理以及和数据库(MYSQL ORACLE)关系

  作为一位DBA长期以来一直受到一些关于交换使用的问题,比如如下问题:
  1、为了我自由中缓冲/缓存明明还有空间为什么交换使用了?
  2、哪个(些)进程使用了最多的互换?
  3,如果在ORACLE或者MYSQL避免使用交换?
  4,为什么要使用直接路径绕过操作系统缓冲(O_DIRECT) ?
  5,ORACLE 11 g使用tmpfs虚拟文件系统,内存可能被交换出吗?
  6,设置/proc/sys/vm/swappiness为0后有什么风险?
  
  
  本文参考& lt; & lt;深入理解liunx内核祝辞祝辞& lt; & lt;在祝辞结合数据库希望给出
  比较明了的答案,但是由于涉及内容较深特别是系统知识,而作者也没有详细
  研究过LINUX内核和实现,只是从API调用者和DBA的角度来看,难免有概念不准
  或者有误的地方,望指出共同讨论。如果特别有兴趣请自行参考& lt; & lt;深入理解liunx内核祝辞祝辞
  类似书籍。
  
  1,LINUX高速页面缓冲与数据库缓冲区的关系
  为了阐明这些问题,不得不从LINUX页高速缓冲说起,在数据库中我们都知道有
  一块非常大的缓冲区用于存放最近访问的数据,如甲骨文的BUFFER_CACHE, INNODB
  的通过innodb_buffer_pool_size,这片区域至关重要,直接影响到数据库物理读取的可能性。
  所以一般数据库指导意见都为系统物理内存的60%以上(当然甲骨文还有share_pool
  一般甲骨文建议memory_target包含SGA + PGA为系统内存60%以上),而在LINUX操作系统看来
  数据软件只是用户态的匿名页空间,既然如此重要LINUX操作系统当然也是如此,他也
  有这样一部分内存为内核态页高速缓存,LINUX采用一种比较粗狂的分配方式,只要
  数据读取(还有预读——局部性原理)它就会进行缓存,它只受限于2个方面
  ——物理内存大小
  ——用户态空间占用内存大小
  (LINUX系统编程13章)
  这样做是因为这样能够大大加快读(),()调写下来用的速度,如果用户态程序没有自己的
  缓存的时候,那么热数据缓存在LINUX页高速缓冲中,那么下次读取的时候速度大大加快
  那么就数据库而言数据块可能存在于:
  磁盘数据页面——在内核缓冲区/缓存页面——→用户(数据库)缓冲区页面
  这样一个顺序,这里是我自己的理解,因为我编程的时候也时常自己分配一块内存区域
  (malloc族函数)
  如果这个时候稍加思考,我们可以看到数据页可能存在于2个地方一个内核是一个是
  用户(数据库)缓冲区,前者是LINUX操作系统级别的,后者是数据库级别的。在LINUX中
  我们通过免费可以查看到
  (root@testmy ~) #免费
  ,,,,,,,总,,使用,,,免费的,,共享,缓冲区大敌;,缓存
  Mem:,,,4052856,,2009000,2043856,,,,0,146404年,,1327484
  -/+缓冲/缓存:,535112年,,3517744
  交换:,,8388600,,,,0,8388600
  
  第一行:从操作系统的角度看内存使用
  总:总的内存大小
  使用:LINUX来看使用的空间,用户态内存(比如数据库内存)+内核态高速缓冲区
  免费的:剩余的内存大小4052856 - 4052856
  缓冲区和缓存:一起说明了内核占用的大小
  分解:共享内存大小,应该存在于用户态
  第二行:从用户态的角度来看内存使用
  使用:用户态内存(比如数据库内存)
  免费的:应用程序可能可以使用的大小,第一行的应用——(缓冲+缓存)
  
  ——其实如果要看内存剩余空间,这两个免费的都是只有部分参考价值。
  另外如果要说缓冲区和缓存的区别,这一点在深入LINUX内核P607页有相关
  的说明,实际上在内核2.4.10后就没有区别了,所以进行描述。
  关于内核态,用户态可以参考:
  http://blog.itpub.net/7728585/viewspace-2129073/
  的部分观点和配图
  
  2,为什么数据库可以采用O_DIRECT打开文件模式(linux开放()api标志)
  ——数据库软件有自己的内存块的管理方法,不需要内核态高速缓冲区,这样有浪费内存
  ,空间的风险。如上:
  磁盘数据页面——在内核缓冲区/缓存页面——→用户(数据库)缓冲区页面
  我们去掉了在内核缓冲/缓存页面,直接从DIS数据页——比;用户缓冲区页面
  ——数据库软件有自己的内存块的管理方法,不需要内核态高速缓冲区,这样让阅读(),

LINUX系统编程交换原理以及和数据库(MYSQL ORACLE)关系