buffAndCache介绍
百度:在Linux系统中,buffCache指的是缓冲区(buffer)和缓存(cache)的使用量,它们通常用于提高磁盘操作的效率。当buffCache使用过高
时,可能会对系统性能产生负面影响,然而Linux内核会智能地管理内存,包括使用未分配的内存来缓存文件和磁盘数据,以提高系统性能。导致
过高的原因:
大量小文件操作:频繁的小文件操作会导致大量的缓存命中,因为每次操作都会涉及到缓存的更新和回收。
数据库操作:数据库系统,如MySQL或PostgreSQL,由于其频繁的读写操作,会占用大量的缓存。
日志文件:应用程序的日志文件不断增长也会导致缓存使用增加。
内存压力:系统内存不足时,内核可能会使用更多的磁盘缓存来作为内存的扩展,这会增加buffCache的使用。
不合理的缓存管理策略:如果系统的缓存管理策略(如LRU, MRU等)配置不当,可能导致缓存命中率低,增加磁盘I/O。
百度提供分析方向,然而我遇到的原因是因为部署了minio,大量上传文件时导致过高的,把minio 部署到其它地方程序就能稳定长时间跑。
buffAndCache组成介绍
1、内存脏页(dirty pages)管理相关的内核参数
1.1 vm.dirty_ratio
描述:这个参数定义了当脏页占可用内存(不包括保留给内核和其他用途的内存)的百分比达到这个值时,系统将阻塞所有写操
作,直到脏页被写回磁盘为止。
默认值:通常是20%(对于大多数Linux发行版,但可能有所不同)。
影响:较高的值可以减少写磁盘操作的频率,但可能会导致更多的内存被脏页占用,增加内存压力。较低的值会增加写磁盘的
频率,但可以减少内存占用。
1.2 vm.dirty_background_ratio
描述:这个参数定义了当脏页占可用内存的百分比达到这个值时,内核将启动后台写操作(即pdflush或kworker/n进程)来将脏页写回磁盘。
默认值:通常是10%(对于大多数Linux发行版,但可能有所不同)。
影响:较高的值可以减少后台写操作的频率,但可能导致脏页积累更多,增加内存压力。较低的值会增加后台写操作的频率,有助于保持较
低的脏页数量,但可能 会增加磁盘I/O负载。
1.3 永久设置
1.3.1 通过修改/etc/sysctl.conf文件来永久设置这些参数,例如:
vm.dirty_ratio = 30
vm.dirty_background_ratio = 15
1.3.2 运行sysctl -p 来应用这些更改
1.4 sysctl命令临时设置这些参数,重启后会丢失,例如:
sysctl -w vm.dirty_ratio=30
sysctl -w vm.dirty_background_ratio=15
1.5 命令查看,例如:
sysctl vm.dirty_ratio
sysctl vm.dirty_background_ratio
2、物理内存交换到磁盘
2.1vm.swappiness
描述:vm.swappiness是一个内核参数,用于设置内核使用交换空间的倾向性。它决定了系统在内存压力增大时,是更倾向于使用物理内
存还是交换空间。
参数范围:可以在0到100之间设置。
低值(接近0):内核将尽可能少地使用交换空间,而更多地依赖于物理内存。这有助于减少磁盘I/O操作,但可能会增加物理内存的使
用率,当物理内存耗尽时可能导致系统性能下降或崩溃(如out of memory,OOM)。
高值(接近100):内核将积极使用交换空间,将不常用的内存页面交换到磁盘上。这有助于释放物理内存供其他进程使用,但可能会
增加磁盘I/O操作,从而影响系统性能。
默认值(60):表示当剩余物理内存低于40%(100-60=40%)时,开始使用交换空间。这是一个折衷的选择,旨在平衡物理内存和
交换空间的使用。
2.2 永久设置
2.2.1 通过修改/etc/sysctl.conf文件来永久设置这些参数,例如:
vm.swappiness=30
2.2.2 运行sysctl -p 来应用这些更改
2.3 sysctl命令临时设置这些参数,重启后会丢失,例如:
sysctl vm.swappiness=30
2.4 命令查看,例如:
cat /proc/sys/vm/swappiness
或
sysctl vm.swappiness
3、控制文件系统缓存(特别是directory和inode cache)的回收倾向
3.1 vm.vfs_cache_pressure
描述:决定了内核在内存压力下回收文件系统缓存(如dentries和inodes)的优先级。通过调整此参数,可以控制系统在内存不足
时,是更倾向于保留文件系统缓存还是回收这些缓存以释放内存。
参数范围:取值范围通常为0到200(尽管某些文档可能指出其范围为0到100,但现代Linux内核可能支持更高的值)
低值(接近0):内核将倾向于保留文件系统缓存,而不是回收这些缓存以释放内存。这有助于提高文件访问速度,但可能会
增加内存的使用率。
高值(接近200):内核将更积极地回收文件系统缓存以释放内存。这有助于在内存压力下保持系统的稳定性,但可能会降
低文件访问速度。
默认值(100):表示内核将根据页面缓存(pagecache)和交换缓存(swapcache)的情况,将directory和inode cache保
持在一个合理的百分比。这是一个折衷的选择,旨在平衡文件系统缓存的使用和内存释放。
3.2 永久设置
3.2.1 通过修改/etc/sysctl.conf文件来永久设置这些参数,例如:
vfs_cache_pressure=100
3.2.2 运行sysctl -p 来应用这些更改
3.3 sysctl命令临时设置这些参数,重启后会丢失,例如:
sysctl vm.vfs_cache_pressure=100
3.4 命令查看,例如:
cat /proc/sys/vm/vfs_cache_pressure
或
sysctl vm.vfs_cache_pressure
4、tmpfs文件系统,类似于windows的虚拟磁盘
4.1 查看当前系统中的tmpfs
df -h | grep tmpfs
4.2 创建挂载点
mkdir /tmp/xkTmpfs
4.3 创建文件系统/修改大小,临时
sudo mount -t tmpfs -o size=200M tmpfs /tmp/xkTmpfs
4.4 系统重启后自动挂载tmpfs
4.4.1 打开文件:vi /etc/fstab
4.4.2 末尾添加
tmpfs /tmp/xkTmpfs tmpfs defaults,size=200M 0 0
5、清理系统缓存脚本记得管理员运行,清理有可能导致程序奔溃
#!/bin/bash
echo "开始清理缓存"
写入硬盘,防止数据丢失
sync;sync;sync;
延迟10S
sleep 10
echo 1 > /proc/sys/vm/drop_caches
echo 2 > /proc/sys/vm/drop_caches
echo 3 > /proc/sys/vm/drop_caches
echo "清理缓存结束"
6、补充
6.1 内存详细信息查看:cat /proc/meminfo|grep -E "Buffer|Cache|Swap|Mem|Shmem|Slab|SReclaimable|SUnreclaim"
6.2 上面的配置验证好像都没生效,达不到效果,比如想控制缓存不能超过内存的60%,那位大佬看出问题的可以讲解讲解