作为一位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数据页——比;用户缓冲区页面
——数据库软件有自己的内存块的管理方法,不需要内核态高速缓冲区,这样让阅读(),
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数据页——比;用户缓冲区页面
——数据库软件有自己的内存块的管理方法,不需要内核态高速缓冲区,这样让阅读(),