共享内存
对于共享内存(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中。
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 "