linux内存管理

来源:互联网 发布:降临影评知乎 编辑:程序博客网 时间:2024/06/05 08:41

共享内存

对于共享内存(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     cachedMem:      24676836     626568   24050268          0      30884     508312-/+ buffers/cache:      87372   24589464Swap:      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"