
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这个文件,感觉一下两次打开的速度有何异同
| 维度 | buffers | cached |
|---|---|---|
| 中文名 | 缓冲区 | 页缓存 |
| 主要对象 | 块设备元数据 (分区表、超级块、inode) | 文件内容 (实际读写的文件数据) |
| 数据来源 | 文件系统元数据、裸设备直接IO | 普通文件读写 |
| 访问方式 | 直接访问块设备 | 通过文件系统访问 |
| 典型场景 | mkfs.ext4、dd if=/dev/sda | cat file.txt、vim、nginx静态文件 |
| 内核机制 | 块层缓存 | 内存页缓存 |
| 生命周期 | 较短,元数据操作后释放 | 较长,文件未被覆盖/删除可一直缓存 |
| 释放难易 | 相对容易 | 相对困难 |
| 主要作用 | 减少块设备访问次数 | 减少磁盘IO |
| free命令位置 | 第一行(Mem:)第2列 | 第一行(Mem:)第3列 |
| 手动释放 | echo 1 > /proc/sys/vm/drop_caches | echo 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 # 激活交换文件,系统开始使用该交换空间
发表回复