侧边栏壁纸
  • 累计撰写 16 篇文章
  • 累计创建 52 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

解决 LXC 容器中 Cache/Buffer 过大的问题

Stone
2024-06-12 / 0 评论 / 0 点赞 / 89 阅读 / 1,260 字

发现问题

Linux 中 buff/cache 占用过高

root@docker:~# free -h
               total        used        free      shared  buff/cache   available
内存:      4.0Gi       1.7Gi        37Mi       0.0Ki       2.2Gi       2.3Gi
交换:      4.0Gi       596Mi       3.4Gi

采用常规操作,但提示只读文件系统

root@docker:~# echo 1 > /proc/sys/vm/drop_caches
-bash: /proc/sys/vm/drop_caches: 只读文件系统

本地 Windows 虚拟机内查看了一下文件权限,没有区别

# Windows 虚拟机内环境
root@tower:~# ll /proc/sys/vm/drop_caches
--w------- 1 root root 0 Jun 12 17:26 /proc/sys/vm/drop_caches

# LXC 虚拟机内环境
root@docker:~# ls -l /proc/sys/vm/drop_caches
--w------- 1 root root 0  6月 12 17:19 /proc/sys/vm/drop_caches

整理教程时的系统环境

Debian GNU/Linux 11 (容器内虚拟机)

解决问题

此次问题解决思路

网上搜索后发现基本都是大差不差的常规操作,没有什么用处,改用英文搜索,关键词为drop_caches readonly file system ,发现一篇很有用的文章:How to drop_caches inside a container?

里面提到

VM caches are global to the entire system, you can’t drop them for just a single container.
You need to do it as root on the host, which will then flush the cache for the entire system.

于是在宿主机中执行内存清理指令

root@pve:~# free -h
               total        used        free      shared  buff/cache   available
Mem:            15Gi        10Gi       205Mi        14Mi       5.0Gi       4.8Gi
Swap:          8.0Gi       1.1Gi       6.9Gi
root@pve:~# sync
root@pve:~# echo 1 > /proc/sys/vm/drop_caches
root@pve:~# echo 2 > /proc/sys/vm/drop_caches
root@pve:~# echo 3 > /proc/sys/vm/drop_caches
root@pve:~# free -h
               total        used        free      shared  buff/cache   available
Mem:            15Gi        10Gi       4.5Gi        14Mi       660Mi       4.8Gi
Swap:          8.0Gi       1.1Gi       6.9Gi

然后再回到 LXC 虚拟机中查看内存占用,发现 free 已经提高了,buff/cache 也下来了

root@docker:~# free -h
               total        used        free      shared  buff/cache   available
内存:      4.0Gi       1.5Gi       2.0Gi       0.0Ki       435Mi       2.5Gi
交换:      4.0Gi       596Mi       3.4Gi

网上通用科普

首先了解下两个概念buff和cache

  • buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。根据磁盘的读写设计的,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能。
  • cache(Page Cache)是一种高速缓存,用于CPU和内存之间的缓冲 ,是文件系统的cache。
    把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。

它们都是占用内存。两者都是RAM中的数据。简单来说,buff是即将要被写入磁盘的,而cache是被从磁盘中读出来的。

目前进程正在实际被使用的内存的计算方式为used-buff/cache,通过释放buff/cache内存后,我们还可以使用的内存量free+buff/cache。通常我们在频繁存取文件后,会导致buff/cache的占用量增高。

手动清除

执行以下命令即可

[root@docker:~]# sync
[root@docker:~]# echo 1 > /proc/sys/vm/drop_caches
[root@docker:~]# echo 2 > /proc/sys/vm/drop_caches
[root@docker:~]# echo 3 > /proc/sys/vm/drop_caches
  • sync:将所有未写的系统缓冲区写到磁盘中,包含已修改的i-node、已延迟的块I/O和读写映射文件
  • echo 1 > /proc/sys/vm/drop_caches:清除page cache
  • echo 2 > /proc/sys/vm/drop_caches:清除回收slab分配器中的对象(包括目录项缓存和inode缓存)。slab分配器是内核中管理内存的一种机制,其中很多缓存数据实现都是用的pagecache。
  • echo 3 > /proc/sys/vm/drop_caches:清除pagecache和slab分配器中的缓存对象。
    /proc/sys/vm/drop_caches的值,默认为0

定时清除

1、创建脚本cleanCache.sh

#!/bin/bash#每两小时清除一次缓存
echo "开始清除缓存"
sync;sync;sync #写入硬盘,防止数据丢失
sleep 10#延迟10秒
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches

2、创建定时任务

crontab -e #弹出配置文件

3、添加定时任务执行频率

#分  时  日  月  周  命令
0 */2 * * * ./cleanCache.sh

4、设置crond启动以及开机自启

systemctl start crond.service
systemctl enable crond.service

5、查看定时任务是否被执行

cat /var/log/cron | grep cleanCache

参考资料

0

评论区