linux内存管理

共享内存

对于共享内存(Shared memory),主要用于在UNIX 环境下不同进程之间共享数据,是进程间通信的一种方法,一般的应用程序不会申请使用共享内存,笔者也没有去验证共享内存对上面等式的影响。

例如Linux平台的oracle为多进程程序,SGA和PGA都是各进程共享和通信的数据区域,所有可以看到分配了很大的共享内存。而MySQL为多线程,系统级表现为一个进程,不需要共享内存。

Linux的cache和buffer有何区别

Linux下对文件的访问和设备的访问通常会被cache起来加快访问速度,这个是系统的默认行为。 而cache需要耗费我们的内存,虽然这个内存最后可以通过echo 3>/proc/sys/vm/drop_caches这样的命令来主动释放。但是有时候我们还是需要理解谁消耗了我们的内存。


我们来先了解下内存的使用情况:

:


 

[root@my031045 ~]# free
             total       used       free     shared    buffers     cached
Mem:      24676836     626568   24050268          0      30884     508312
-/+ buffers/cache:      87372   24589464
Swap:      8385760

Page cache和buffer cache一直以来是两个比较容易混淆的概念,在网上也有很多人在争辩和猜想这两个cache到底有什么区别,讨论到最后也一直没有一个统一和正
确的结论,在我工作的这一段时间,page cache和buffer cache的概念曾经困扰过我,但是仔细分析一下,这两个概念实际上非常的清晰。如果能够了解到这两个cache的本质,那么我们在分析io问题的时候可能会更加得心应手。 Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。

Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中,例如,文件系统的元数据都会缓存到buffer cache中。


简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用
dd等工具对磁盘进行读写,那么数据会缓存到buffer cache补充一点,在文件系统层每个设备都会分配一个def_blk_ops的文件操作方法,这是设备的操作方法,在每个设备的inode下面会存在一个radix tree,这个radix tree下面将会放置缓存数据的page页。这个page的数量将会在top程序的buffer一栏中显示。如果设备做了文件系统,那么会生成一个inode,这个inode会分配ext3_ops之类的操作方法,这些方法是文件系统的方法,在这个inode下面同样存在一个radix tree,这里会缓存文件的page页,缓存页的数量在top程序的cache一栏进行统计。从上面的分析可以看出,2.6内核中的buffer cache和page cache在处理上是保持一致的,但是存在概念上的差别,page cache针对文件的cache,buffer是针对磁盘块数据的cache,仅此而已。
更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。

测试
[root@db01 soft]# more catalina.logaa >> catalina.logaa
^C
[root@db01 soft]#
[root@db01 soft]# du -sh catalina.logaa
1.7G    catalina.logaa
创建一个catalina.logaa的文件,里面内容都是aaa
然后通过一个sheel来理解。

 #!/bin/bash 
sync 
sync 
echo  3 > /proc/sys/vm/drop_caches   
echo -e  " ----------------------缓存释放后,内存使用情况(KB):---------------------- " 
free 
cached1=` free | grep Mem:| awk  ' {print $7} '
buffers1=` free | grep Mem:| awk  ' {print $6} '
date1=` date + " %Y%m%d%H%M%S "
cat catalina.logaa > 1 
date2=` date + " %Y%m%d%H%M%S "
echo -e  " ----------------------首次读取大文件后,内存使用情况(KB):---------------------- " 
free 
cached2=` free | grep Mem:| awk  ' {print $7} '
buffers2=` free | grep Mem:| awk  ' {print $6} '
# echo $date1 
# echo $date2 
interval_1=` expr ${date2} - ${date1}` 
cached_increment1=` expr ${cached2} - ${cached1}` 
buffers_increment1=` expr ${buffers2} - ${buffers1}` 
 
date3=` date + " %Y%m%d%H%M%S "
cat catalina.logaa > 1 
date4=` date + " %Y%m%d%H%M%S "
echo -e  " ----------------------再次读取大文件后,内存使用情况(KB):---------------------- " 
free 
cached3=` free | grep Mem:| awk  ' {print $7} '
buffers3=` free | grep Mem:| awk  ' {print $6} '
# echo $date3 
# echo $date4 
interval_2=` expr ${date4} - ${date3}` 
cached_increment2=` expr ${cached3} - ${cached2}` 
buffers_increment2=` expr ${buffers3} - ${buffers2}` 
echo -e  " ----------------------统计汇总数据如下:---------------------- " 
echo -e  " 首次读取大文件,cached增量:${cached_increment1},单位:KB " 
echo -e  " 首次读取大文件,buffers增量:${buffers_increment1},单位:KB " 
echo -e  " 首次读取大文件,耗时:${interval_1},单位:s \n " 
echo -e  " 再次读取大文件,cached增量:${cached_increment2},单位:KB " 
echo -e  " 再次读取大文件,buffers增量:${buffers_increment2},单位:KB " 
echo -e  " 再次读取大文件,耗时:${interval_2},单位:s " 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值