内存的监控(free,buffers与cached)

available=free+buff/cache

buffers与cached的异同

  • buffers = “目录本” —— 记文件在哪(元数据)
  • cached = “内容复印件” —— 记文件是啥(实际数据)

buffers vs cached 核心对比

buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。
buffers表示块设备(block device)所占用的缓存页(page cache),包括直接读写块设备、以及文件系统元数据(metadata)如SuperBlock所使用的缓存页.
例子: find 命令扫描文件系统,观察 “buffers” 增加的情况。
cat /dev/sda1 > /dev/null
cached表示普通文件所占用的缓存页(page cache),cached把读取过的数据保缓存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不经常读取的内容不断往后排,直至从中删除。
例子:通过vi打开一个非常大的文件,看看cached的变化,然后再次vi这个文件,感觉一下两次打开的速度有何异同

维度bufferscached
中文名缓冲区页缓存
主要对象块设备元数据 (分区表、超级块、inode)文件内容 (实际读写的文件数据)
数据来源文件系统元数据、裸设备直接IO普通文件读写
访问方式直接访问块设备通过文件系统访问
典型场景mkfs.ext4dd if=/dev/sdacat file.txtvimnginx静态文件
内核机制块层缓存内存页缓存
生命周期较短,元数据操作后释放较长,文件未被覆盖/删除可一直缓存
释放难易相对容易相对困难
主要作用减少块设备访问次数减少磁盘IO
free命令位置第一行(Mem:)第2列第一行(Mem:)第3列
手动释放echo 1 > /proc/sys/vm/drop_cachesecho 2 > /proc/sys/vm/drop_caches
两者关系早期内核严格区分,现代内核两者趋于融合,都是“系统缓存”,均可被应用程序回收使用

一定要先sync

echo 3 > /proc/sys/vm/drop_caches #有点类似于手机的清理后台那个一件释放

在手动释放内存前,需要使用sync指令,将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件。否则在释放缓存的过程中,可能会丢失未保存的文件。

场景手机(Android/iPhone)Linux(drop_caches)
你看到的现象剩余内存变多了,手机变“清爽”了free -h 显示 buff/cache 下降,可用内存上升
实际上释放了什么?App 的缓存文件、缩略图、预加载数据文件缓存、目录项缓存、inode缓存
没释放什么?正在运行的 App 本身(微信、QQ 还在后台)应用程序的 RSS 内存(进程本身)
效果下次打开 App 重新加载,变慢下次读文件/目录,变慢(重新读盘)

手机“清理加速” = 删掉 App 的临时缩略图,不是杀掉 App 本身
Linux drop_caches = 删掉文件的“缩略图缓存”,不是释放进程内存

在实际生产环境中,不要用这个

场景正确做法错误做法
free显示buff/cache很高什么都不用做❌ echo 3 > drop_caches
系统内存真的不足排查内存泄漏、扩容、优化应用❌ 指望清缓存解决
想测试磁盘裸性能测试环境用 echo 3❌ 直接在业务机器操作
领导嫌内存占用率高教他看 available 不是 used❌ 为了数字好看清缓存

swap

创建交换空间所需的交换文件是一个普通的文件,但是,创建交换文件与创建普通文件不同,必须通过dd命令来完成,同时这个文件必须位于本地硬盘上,不能在网络文件系统(NFS)上创建swap交换文件。例如:

[root@localhost ~]# dd if=/dev/zero of=/data/swapfile bs=1024 count=65536 # if=输入文件(/dev/zero提供无限零数据流),of=输出文件(指定交换文件路径),bs=设置读写块大小(1024字节=1KB),count=复制块数量(65536个块,总大小=64MB)
65536+0 records in
65536+0 records out

if=输入文件,或者设备名称。

of=输出文件或者设备名称。

ibs=bytes 表示一次读入bytes 个字节(即一个块大小为 bytes 个字节)。

obs=bytes 表示一次写bytes 个字节(即一个块大小为 bytes 个字节)。

bs=bytes,同时设置读写块的大小,以bytes为单位,此参数可代替 ibs 和 obs。

count=blocks 仅拷贝blocks个块。

激活和使用swap

首先通过mkswap命令指定作为交换空间的设备或者文件:

[root@localhost ~]# mkswap /data/swapfile # 将普通文件格式化为交换空间格式,写入swap签名

通过swapon命令激活swap:

[root@localhost ~]# /usr/sbin/swapon /data/swapfile # 激活交换文件,系统开始使用该交换空间

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注