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