free -h
total used free shared buffers cached
Mem: 7.6G 3.7G 3.9G 34M 642M 1.5G
-/+ buffers/cache: 1.6G 6.0G
Swap: 7.8G 0B 7.8G
total 内存总数: 7.6G
used 已经使用的内存数: 3.7G
free 空闲的内存数: 3.9G
shared 当前已经废弃不用,总是0
buffers Buffer Cache内存数: 642M
cached Page Cache内存数: 1.5G
关系:total = used + free
第2行:
-/+ buffers/cache的意思相当于:
-buffers/cache 的内存数: 1.6G (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 6.0G (等于第1行的 free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。
sync #释放前最好sync一下,防止丢数据
echo 1 > /proc/sys/vm/drop_caches :表示清除pagecache。
echo 2 > /proc/sys/vm/drop_caches :表示清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
echo 3 > /proc/sys/vm/drop_caches :表示清除pagecache和slab分配器中的缓存对象。
centos6中,优化mysql与php后,所占用的内存都是稳定的,但是服务器的内存使用一直在增加,缓存不会主动释放,难道只能用上述方式吗,还是我没有找到具体原因,有待考量
这样看好像是pagecache问题,看看如何优化它
参考 https://blog.csdn.net/u012489236/article/details/115579851
https://www.jianshu.com/p/d7355a840e61
什么时候触发回刷?
脏数据达到多少阈值还是定时触发呢?
内核是如何做到回写机制的
Linux内核在/proc/sys/vm中有透出数个配置文件,可以对触发回刷的时机进行调整。内核的回刷进程是怎么运作的呢?这数个配置文件有什么作用呢?
[root@svn_dev_lan ~]# sysctl -a | grep dirty vm.dirty_background_ratio = 10 vm.dirty_background_bytes = 0 vm.dirty_ratio = 20 vm.dirty_bytes = 0 vm.dirty_writeback_centisecs = 500 vm.dirty_expire_centisecs = 3000page cache
page cache即系统脏页,是系统的io缓存,当数据写入磁盘前会先写入page cache中,然后异步刷入磁盘;写缓存可以提升IO的访问速度,但同时也会增加丢失数据的风险。
从page cache刷到磁盘有以下三种时机:
可用物理内存低于特定阈值时,为了给系统腾出空闲内存;
脏页驻留时间超过特定阈值时,为了避免脏页无限期驻留内存;
被用户的sync()或fsync()触发。
由系统执行的刷盘有两种写入策略:
异步执行刷盘,不阻塞用户I/O;
同步执行刷盘,用户I/O被阻塞,直到脏页低于某个阈值。
在一般情况下,系统先执行第一种策略,当脏页数据量过大,异步执行来不及完成刷盘时,切换到同步方式。
我们可以通过内核参数调整脏数据的刷盘阈值:
vm.dirty_background_ratio,默认值为10。该参数定义了一个百分比。当内存中的脏数据超过这个百分比后,系统使用异步方式刷盘。
vm.dirty_ratio,默认值为30。同样定义了一个百分比,当内存中的脏数据超过这个百分比后,系统使用同步方式刷盘,写请求被阻塞,直到脏数据低于dirty_ratio。如果还高于dirty_background_ratio,则切换到异步方式刷盘。因此 dirty_ratio 应高于dirty_background_ratio。
除了通过百分比控制,还可以指定过期时间:vm.dirty_expire_centisecs,默认值为3000(30秒),单位为百分之1秒,超过这个时间后,脏数据被异步刷盘。
可以通过下面的命令查看系统当前的脏页数量:
cat /proc/vmstat |egrep "dirty|writeback"



