Debian 10升级至Debian 12后rsync与du命令报内存不足错误求助
Debian 10升级至Debian 12后rsync与du命令报内存不足错误求助
遇到这种升级后常用工具突然报错的情况确实挺闹心的,结合你提供的信息,我梳理了几个可能的原因和对应的解决思路,你可以逐一尝试:
可能的原因分析
- 虽然系统
free显示还有不少可用内存,但rsync和du在处理大量小文件、深层嵌套目录或者大量符号链接时,会因为内核内存分配逻辑的变化(Debian 10到12的内核版本跨度不小),触发局部内存不足的问题。特别是readlink_stat报错,说明工具在处理文件元数据/符号链接时遇到了内存分配障碍。 - 另外,升级后的文件系统缓存策略可能有调整,导致工具扫描目录时无法及时获取足够的内存资源。
具体解决办法
针对rsync的调整
拆分同步任务
不要一次性同步整个vmail目录,按子域名或者子目录拆分,比如:/usr/bin/rsync -a -e "ssh -p9999" /home/vmail/domainA/ destserver:/home/vmail/domainA/ /usr/bin/rsync -a -e "ssh -p9999" /home/vmail/domainB/ destserver:/home/vmail/domainB/这样每次处理的文件量减少,内存压力会小很多。
调整rsync参数优化内存占用
- 添加
--no-inc-recursive参数:让rsync先完整扫描源目录树再开始传输,避免边扫描边传输导致的内存累积(注意会增加初始扫描时间)/usr/bin/rsync -a --no-inc-recursive -e "ssh -p9999" /home/vmail/ destserver:/home/vmail/ - 若不需要同步删除操作,添加
--max-delete=0:避免rsync生成删除列表占用额外内存 - 调整缓冲区大小:比如
--buffer-size=1M,限制rsync的内存使用
- 添加
临时调整进程内存限制
先查看当前用户的进程内存限制:ulimit -a如果
max memory size不是unlimited,临时调整后再运行rsync:ulimit -v unlimited /usr/bin/rsync -a -e "ssh -p9999" /home/vmail/ destserver:/home/vmail/要是有效,可以把
ulimit -v unlimited加到用户的~/.bashrc或者cron的环境配置里。
针对du命令的调整
限制扫描范围
- 加上
-x参数,让du不跨文件系统扫描,避免误扫挂载的其他分区:du -x /home/vmail - 先查看一级目录的大小,逐步排查异常子目录:
du --max-depth=1 /home/vmail
- 加上
清理系统缓存后重试
临时清理文件系统缓存,释放内存后再运行du:sync && echo 3 > /proc/sys/vm/drop_caches du /home/vmail
额外排查方向
- 统计
vmail目录下的符号链接数量,看看是否异常多:
如果符号链接数量极大,可能是rsync处理时的内存瓶颈所在,可以考虑过滤符号链接同步(添加find /home/vmail -type l | wc -l--no-links参数,但要确认业务是否允许)。
备注:内容来源于stack exchange,提问作者Sym
相关产品推荐
相关产品推荐

