启动tunasync同步

shitou@shitou:~/redis-7.2.5$ sudo systemctl start tunasync-manager
shitou@shitou:~/redis-7.2.5$ sudo systemctl start tunasync-worker
shitou@shitou:~/redis-7.2.5$ tunasynctl list --all
[
  {
    "name": "rockylinux",
    "is_master": true,
    "status": "failed",
    "last_update": "0001-01-01 00:00:00 +0000",
    "last_update_ts": -62135596800,
    "last_started": "2026-07-15 14:29:12 +0000",
    "last_started_ts": 1784125752,
    "last_ended": "2026-07-15 14:29:12 +0000",
    "last_ended_ts": 1784125752,
    "next_schedule": "2026-08-14 14:29:12 +0000",
    "next_schedule_ts": 1786717752,
    "upstream": "rsync://rsync.mirrors.ustc.edu.cn/rockylinux/",
    "size": "unknown"
  },
  {
    "name": "ubuntu-cdimage",
    "is_master": true,
    "status": "failed",
    "last_update": "0001-01-01 00:00:00 +0000",
    "last_update_ts": -62135596800,
    "last_started": "2026-08-07 13:55:42 +0000",
    "last_started_ts": 1786110942,
    "last_ended": "2026-08-07 18:22:19 +0000",
    "last_ended_ts": 1786126939,
    "next_schedule": "0002-02-25 00:00:00 +0000",
    "next_schedule_ts": -62099308800,
    "upstream": "rsync://mirrors.bfsu.edu.cn/ubuntu-cdimage/",
    "size": "unknown"
  },
  {
    "name": "ubuntu",
    "is_master": true,
    "status": "syncing",
    "last_update": "0001-01-01 00:00:00 +0000",
    "last_update_ts": -62135596800,
    "last_started": "2026-08-10 02:10:54 +0800",
    "last_started_ts": 1786299054,
    "last_ended": "2026-08-07 18:22:19 +0000",
    "last_ended_ts": 1786126939,
    "next_schedule": "0001-01-01 00:00:00 +0000",
    "next_schedule_ts": -62135596800,
    "upstream": "rsync://mirrors.bfsu.edu.cn/ubuntu/",
    "size": "unknown"
  },
  {
    "name": "alpine",
    "is_master": true,
    "status": "failed",
    "last_update": "0001-01-01 00:00:00 +0000",
    "last_update_ts": -62135596800,
    "last_started": "2026-07-13 00:28:29 +0000",
    "last_started_ts": 1783902509,
    "last_ended": "2026-07-15 14:29:02 +0000",
    "last_ended_ts": 1784125742,
    "next_schedule": "0001-01-01 00:00:00 +0000",
    "next_schedule_ts": -62135596800,
    "upstream": "rsync://mirrors.bfsu.edu.cn/alpine/",
    "size": "unknown"
  }
]
shitou@shitou:~/redis-7.2.5$

top

负载严重

一、整机资源概况
负载:load average: 1.62, 0.58, 0.26
当前 1‑分钟负载偏高,主要是rsync 镜像同步进程产生 IO 压力;服务器 2核,1.62 负载属于轻度压力。
CPU 分项
3.7 us 9.4 sy 43.5 wa
wa=43.5% 很高,代表 磁盘 IO 等待严重,正是你 Tunasync (rsync) 大批量同步镜像读写硬盘造成的,属于同步任务的正常现象
内存
整机 8G 内存;可用内存 6639MiB,内存资源十分充裕;swap 交换分区完全没有启用,你的 Redis 内存优化参数生效正常。
二、关键进程解读(和你当前业务对应)
表格
PID	进程	说明
24342/24334/24345	rsync	3 个镜像同步进程,也就是 tunasync 正在执行的 ubuntu 源同步,占用大量磁盘 IO
24259	redis‑server	Redis 服务平稳运行,CPU 占用极低
1261	mysqld	MySQL 数据库
7993/9255/9456	k8s 组件	你的机器还部署了 k3s/kubernetes 集群 (docker、etcd、调度器等)
三、针对你镜像同步故障的判断
wa 高 IO 等待 = 硬盘读写已经打满,磁盘速度成为瓶颈;
其余几个同步任务failed失败,大概率就是 IO 阻塞超时,rsync 网络同步被硬盘读写卡住中断;
优化方案
调低并发同步数量,worker 配置里面限制同时只跑 1 个 rsync 任务
ini
[global]
max_workers = 1
给 rsync 添加限速,降低磁盘冲击
硬盘尽量更换 SSD 机械硬盘大批量同步很容易 IO 阻塞超时
补充命令
查看磁盘 IO 详细负载:
bash
iostat -x 1

nano /usr/local/tunasync/conf/worker.conf

[global]
# 最大同时运行同步任务,改成1,一次只跑一个镜像
max_workers = 1

# rsync 限速,单位 KB/s;例如 50000 = 50MB/s,根据你的硬盘性能调低
rsync_speed_limit = 30000

# 忽略rsync常见软链接、临时文件报错,不会判定任务失败
dangerous_global_rsync_success_exit_codes = [23,24]


concurrent = 1
rsync_speed_limit = 30000
dangerous_global_rsync_success_exit_codes = [23,24]
# 日志目录放在独立磁盘分区内

配置文件


name = "local-worker"
# 镜像本体存放至独立分区
mirror_dir = "/opt/mirror/mirrors"
concurrent = 1
rsync_speed_limit = 30000
dangerous_global_rsync_success_exit_codes = [23,24]
# 日志目录放在独立磁盘分区内
log_dir = "/opt/mirror/logs/{{.Name}}"

[manager]
api_base = "http://127.0.0.1:14242"
token = "Sync@2026Tuna"
ca_cert = ""

# Ubuntu 北外rsync源
[[mirrors]]
name = "ubuntu"
provider = "rsync"
upstream = "rsync://mirrors.bfsu.edu.cn/ubuntu/"
interval = 21600
use_ipv6 = false

# Ubuntu ISO镜像 北外源
[[mirrors]]
name = "ubuntu-cdimage"
provider = "rsync"
upstream = "rsync://mirrors.bfsu.edu.cn/ubuntu-cdimage/"
interval = 604800

Redis 不能帮 rsync 镜像同步降低磁盘 IO,这条路行不通,真正能用 IO‑减负方案。

1、先讲明白为什么 Redis 做不到

  1. Redis 是内存数据库,它的缓存只存 Redis 自己的键值数据;

  2. rsync 下载镜像,是大批量本地写入实体文件(iso、软件包,几十 GB‑几百 GB);

  3. 文件系统的磁盘缓存是由 Linux 内核自带的 Page‑Cache 负责,不归 Redis 管

    Redis 没法接管系统文件读写、缓冲 rsync 的下载文件,二者完全是两套东西。

简单比喻:

Linux 自带缓存=系统自带硬盘缓冲;

Redis=专门存业务数据的内存盒子;

你下载保存大文件,只会走系统内核缓存,不会跑进 Redis。


2、那什么东西才能降低 rsync 的 IO 压力?(你现在正在用的方案就是正确方案)

  1. concurrent = 1 只允许一个同步任务,杜绝多进程抢磁盘

  2. rsync_speed_limit = 30000 限速,压低硬盘每秒写入量

  3. 内核 Page‑Cache(Linux 自带)会自动缓冲读写,这个才是负责文件 IO 缓存

额外优化,继续减轻机械硬盘负担

  1. 调低速度,机械硬盘建议 15‑20MB/s

ini

rsync_speed_limit = 20000
  1. 调整 Linux 内核缓存参数,放大系统内存缓存,减少磁盘直接刷写

bash

# 脏页缓冲,内存积攒更多写入,合并再一次性落盘
sysctl -w vm.dirty_ratio=40
sysctl -w vm.dirty_background_ratio=15
  1. 镜像目录单独一块硬盘,不要和系统、redis、k8s 共用一块磁盘


3、Redis 的正确用处

你本机的 Redis 是给 k8s、业务程序做缓存;

它只能加速程序的键‑值数据读写不能缓存下载的镜像文件

如果你希望靠内存缓冲减少硬盘 IO:依靠 Linux 自带页缓存,不要拿 Redis 承担文件缓存。

# 脏页后台触发比例:内存15%时后台慢慢写入硬盘
vm.dirty_background_ratio = 15
# 脏页上限:内存40%装满写入缓存之后,才强制同步磁盘
vm.dirty_ratio = 40
# 减少频繁回收内存,给文件页缓存留出空间
vm.vfs_cache_pressure = 50
# 优化swap倾向,优先使用内存缓存
vm.swappiness = 10
# 脏页过期时长,延长内存缓冲时间
vm.dirty_expire_centisecs = 6000
vm.dirty_writeback_centisecs = 500

通俗解释

  1. dirty_background_ratio=15

    当写入缓存占到内存 15%,系统在后台慢悠悠往硬盘写数据,不会突然爆发大量 IO

  2. dirty_ratio=40

    缓冲最多占用 40% 内存才强制落盘;你的 8G 内存,可以腾出大量内存充当文件缓存,rsync 的数据先堆内存,合并之后再写入磁盘,大幅降低机械硬盘频繁随机写入

  3. swappiness=10

    尽量少使用交换分区,优先拿物理内存充当文件缓存

  4. vfs_cache_pressure=50

    倾向保留目录、文件缓存