rsync占用过多内存
继续上篇,简介现状
A虚拟机做了一个nextcloud,搭建了私有网盘。
B虚拟机同样的系统环境,作为nextcloud的备份盘。
A机器计划任务执行的rsync
cat /etc/crontab
* 1 * * * root /var/www/sql/bak.sh
cat /var/www/sql/bak.sh
#! /bin/bash
a=`date +%y-%m-%d`
mysqldump -uroot -proot nextcloud_db > /var/www/sql/$a.sql
rsync -avz --delete /var/www linx00:/var &> /dev/null
第二天查看内存已满
root@A:~# free -m
total used free shared buffers cached
Mem: 16051 15895 155 9 206 13988
-/+ buffers/cache: 1700 14350
Swap: 122069 0 122069
free详解:
第1行Mem数据:
total 内存总数: 16051
used 已经使用的内存数: 15895
free 空闲的内存数: 155
shared 当前已经废弃不用,总是9
buffers Buffer Cache内存数: 206
cached Page Cache内存数: 13988
第2行-/+ buffers/cache:
-buffers/cache 的内存数:1700 (等于第1行的 used - buffers - cached)
+buffers/cache 的内存数: 14350 (等于第1行的 free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。
第三行数据是交换分区SWAP的,也就是我们通常所说的虚拟内存。
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
感兴趣的可以进一步参考文件/proc/meminfo,free命令就是根据它的信息生成的。free命令的源码可从procps-xxx-.src.rpm获取,xxx为版本号,比如procps-3.2.3-5.3.src.rpm。
解决方法
*思路:*由于找不到rsync使用的清楚技巧,只能从清楚内存占用情况来处理。
*具体:*经常使用rsync传输大量数据的朋友可能遇到过类似的情况:开始是传输大量文件过去,到后来传输的数据并不大,但就是很慢很慢,到对边的服务器上看会发现在终端输入命令都不会觉得慢,但看内存使用情况时,发现free的内存很少,几乎接近零了,我觉得可能就是内存都被cached了导致的
为什么我们要释放掉cached内存?因为我们用rsync传输大量数据的时候,linux系统将一部分文件的信息缓存在内存中,这样是可以减少频繁使用的文件的磁盘IO时间占用,当我们传完一批文件后,我们要传输另外一批文件过去,是完全不同的文件或者文件的内容发生了变化,内存中缓存的文件也不是我们需要的了,我们需要清空缓存,腾出内存用来传输下一批文件使用,这个时候我们急切的需要看到更多的内存是free状态的。
在这样的前提下,我们有必要自己手动清空缓存,腾出更多可用内存来
free看到的信息:
buffer,cached的作用:
cached主要负责缓存文件使用, 日志文件过大造成cached区内存增大把内存占用完 .
Free 中 的 “ buffer和cache:(它们都是占用内存)” :
buffer : 作为buffer cache的内存,是块设备(磁盘)的缓冲区,包括读、写磁盘
cache: 作为page cache的内存, 文件系统的cache,包括读、写文件
如果 cache 的值很大,说明cache住的文件数很多。
为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了 I/O系统调用(比如read,write,getdents)的时间。
如何解决这个导致机器变慢的问题呢?
罪魁祸首就是内存都被cached了,free的基本没有了
所以我们应该想想如何把cached内存释放出来
重启机器肯定是可以解决,但是我们肯定是不能用这样的办法
root@A:~# sync
#手动执行sync命令(描述:sync 命令运行 sync 子例程。如果必须停止系统,则运行sync 命令以确保文件系统的完整性。sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)
root@A:~# echo 1 > /proc/sys/vm/drop_caches
root@A:~# echo 2 > /proc/sys/vm/drop_caches
root@A:~# echo 3 > /proc/sys/vm/drop_caches
#默认是0,1表示清空页缓存,2表示清空inode和目录树缓存,3清空所有的缓存。
查看,已清理
root@A:~# free -m
total used free shared buffers cached
Mem: 16051 1351 14699 9 1 190
-/+ buffers/cache: 1159 14892
Swap: 122069 0 122069
root@A:~# echo 0 > /proc/sys/vm/drop_caches
-bash: echo: 写错误: 无效的参数
题外篇,未测试
除了释放掉cached内存以外,还需要设置vm.swappiness的值,以尽大限度的使用物理内存
查看vm.swappiness参数的值:
#sysctl -q vm.swappiness
临时设置vm.swappiness的值(重启后生效)
#sysctl vm.swappiness=10
永久设置vm.swappiness:
echo "vm.swappiness = 10" >> /etc/sysctl.conf
本文介绍了Linux系统中rsync进程占用过多内存的问题,导致系统性能下降。通过分析`free`命令的输出,确认内存主要被缓存(cached)占用。为了解决这个问题,无需重启系统,可以通过执行`sync`命令和写入`/proc/sys/vm/drop_caches`来释放缓存。此外,调整`vm.swappiness`参数也能控制内存使用策略。文章提供了释放缓存和调整系统参数的方法,以确保系统在执行大量数据传输时保持高效运行。
729





