buff/cache内存占用太高

我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图:

[root@nfs ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           974M        518M         78M         72M        377M        143M
Swap:          2.0G        381M        1.6G

可以看到占用了377M的内存

什么是buff

buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。

什么是cache

cache(Page Cache)是一种高速缓存,用于CPU和内存之间的缓冲 ,是文件系统的cache。把读取过的数据保存起来,重新读取时若命中(找到需要的数据)就不要去读硬盘了,若没有命中就读硬盘。其中的数据会根据读取频率进行组织,把最频繁读取的内容放在最容易找到的位置,把不再读的内容不断往后排,直至从中删除。它们都是占用内存。两者都是RAM中的数据。

buff和cache

简单来说,buff是即将要被写入磁盘的,而cache是被从磁盘中读出来的。

手动清除buff/cache

[root@nfs ~]# sync 
[root@nfs ~]# echo 1 > /proc/sys/vm/drop_caches
[root@nfs ~]# echo 2 > /proc/sys/vm/drop_caches
[root@nfs ~]# echo 3 > /proc/sys/vm/drop_caches

注:/proc/sys/vm/drop_caches的值默认为0
说明:
#sync:将所有未写的系统缓冲区写到磁盘中
#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分配器中的缓存对象。

清除后

[root@nfs ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           974M        518M        211M         72M        244M        181M
Swap:          2.0G        381M        1.6G

查看buff/cache使用率高的进程有哪些

# 下载hcache工具
[root@ceph01 ~]# wget https://silenceshell-1255345740.cos.ap-shanghai.myqcloud.com/hcache
# 赋予权限
[root@ceph01 ~]# chmod 777 hcache && mv hcache /usr/local/bin/

全局显示最大的被缓存文件

[root@ceph01 ~]# hcache --top 10
+--------------------------------+----------------+------------+-----------+---------+
| Name                           | Size (bytes)   | Pages      | Cached    | Percent |
|--------------------------------+----------------+------------+-----------+---------|
| /usr/bin/dockerd               | 96792616       | 23632      | 16821     | 071.179 |
| /usr/bin/containerd            | 59580232       | 14546      | 12014     | 082.593 |
| /usr/bin/ceph-osd              | 19758688       | 4824       | 4824      | 100.000 |
| /usr/bin/ceph-mon              | 14452480       | 3529       | 3486      | 098.782 |
| /usr/bin/ceph-mgr              | 10286056       | 2512       | 2451      | 097.572 |
| /etc/udev/hwdb.bin             | 7780559        | 1900       | 958       | 050.421 |
| /usr/lib64/libmozjs-17.0.so    | 4028168        | 984        | 759       | 077.134 |
| /usr/local/bin/hcache          | 2542252        | 621        | 621       | 100.000 |
| /usr/lib64/libcrypto.so.1.0.2k | 2512832        | 614        | 610       | 099.349 |
| /usr/sbin/NetworkManager       | 2776016        | 678        | 603       | 088.938 |
+--------------------------------+----------------+------------+-----------+---------+

查看指定进程所使用的缓存情况

[root@ceph01 ~]# ps -ef | grep docker
root        1157       1  0 09:44 ?        00:00:00 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
root        1695    1623  0 09:49 pts/0    00:00:00 grep --color=auto docker
[root@ceph01 ~]# hcache -pid 1157
+--------------------------------------------+----------------+------------+-----------+---------+
| Name                                       | Size (bytes)   | Pages      | Cached    | Percent |
|--------------------------------------------+----------------+------------+-----------+---------|
| /usr/lib64/liblz4.so.1.7.5                 | 85952          | 21         | 21        | 100.000 |
| /usr/lib64/librt-2.17.so                   | 44448          | 11         | 11        | 100.000 |
| /usr/lib64/libm-2.17.so                    | 1139680        | 279        | 202       | 072.401 |
| /usr/lib64/libz.so.1.2.7                   | 90664          | 23         | 23        | 100.000 |
| /usr/lib64/libpcre.so.1.2.0                | 402384         | 99         | 99        | 100.000 |
| /usr/lib64/libresolv-2.17.so               | 106848         | 27         | 27        | 100.000 |
| /var/lib/docker/buildkit/metadata_v2.db    | 16384          | 4          | 4         | 100.000 |
| /usr/lib64/libbz2.so.1.0.6                 | 68192          | 17         | 17        | 100.000 |
| /usr/lib64/libudev.so.1.6.2                | 91256          | 23         | 23        | 100.000 |
| /usr/lib64/liblzma.so.5.2.2                | 157424         | 39         | 39        | 100.000 |
| /usr/lib64/libdl-2.17.so                   | 19776          | 5          | 5         | 100.000 |
| /var/lib/docker/buildkit/snapshots.db      | 16384          | 4          | 4         | 100.000 |
| /usr/lib64/libdw-0.170.so                  | 297360         | 73         | 73        | 100.000 |
| /usr/lib64/libc-2.17.so                    | 2173512        | 531        | 531       | 100.000 |
| /usr/lib64/libpthread-2.17.so              | 144792         | 36         | 36        | 100.000 |
| /usr/lib64/libelf-0.170.so                 | 99944          | 25         | 25        | 100.000 |
| /usr/lib64/libcap.so.2.22                  | 20032          | 5          | 5         | 100.000 |
| /usr/lib64/libnss_files-2.17.so            | 62184          | 16         | 16        | 100.000 |
| /usr/lib64/libgpg-error.so.0.10.0          | 19384          | 5          | 5         | 100.000 |
| /usr/lib64/libgcrypt.so.11.8.2             | 535064         | 131        | 116       | 088.550 |
| /usr/lib64/libselinux.so.1                 | 155744         | 39         | 39        | 100.000 |
| /usr/lib64/libdevmapper.so.1.02            | 356120         | 87         | 87        | 100.000 |
| /usr/lib64/libgcc_s-4.8.5-20150702.so.1    | 88720          | 22         | 22        | 100.000 |
| /var/lib/docker/buildkit/cache.db          | 32768          | 8          | 6         | 075.000 |
| /var/lib/docker/buildkit/containerdmeta.db | 16384          | 4          | 4         | 100.000 |
| /usr/lib64/libsepol.so.1                   | 660208         | 162        | 118       | 072.840 |
| /usr/lib64/libsystemd.so.0.6.0             | 203800         | 50         | 50        | 100.000 |
| /usr/lib64/ld-2.17.so                      | 164240         | 41         | 41        | 100.000 |
| /var/lib/docker/volumes/metadata.db        | 32768          | 8          | 5         | 062.500 |
| /usr/bin/dockerd                           | 96792616       | 23632      | 16870     | 071.386 |
| /usr/lib64/libattr.so.1.1.0                | 19896          | 5          | 5         | 100.000 |
+--------------------------------------------+----------------+------------+-----------+---------+

定位到缓存的最大文件后,然后使用lsof得到当前文件的一些进程信息了

[root@ceph01 ~]# lsof /usr/lib64/libc-2.17.so 
COMMAND    PID    USER  FD   TYPE DEVICE SIZE/OFF  NODE NAME
systemd      1    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
systemd-j  497    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
lvmetad    526    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
systemd-u  527    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
auditd     662    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
dbus-daem  686    dbus mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
systemd-l  689    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
irqbalanc  691    root mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so
polkitd    692 polkitd mem    REG  253,0  2173512 46386 /usr/lib64/libc-2.17.so

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐