원격 Mac APFS 磁盘水位线与 SFTP rsync 업로드失败治理示意

2026 원격 Mac 디스크 가득 참 SFTP/rsync 업로드 실패: APFS 수위선, 아티팩트 LRU, CI Job 게이트 결정 매트릭스

원격 Mac에서 No space left on device 时,SFTP/rsync 往往在中途断开,而 ssh 登录仍可能正常。本文把 APFS 真满盘、inode、配额与中间设备 reset 分层归因,并给出 20%/12%/10% 水位线、아티팩트 LRU 与업로드前 df 探测,并联원자 배포、link-dest、SHA256 闸门与병렬 SFTP 관련 글。

当租赁或自建원격 Mac 同时承载 Xcode 编译、아티팩트업로드与 link-dest 快照时,空间压力很少来自单一목차。更常见的是 APFS 容器、purgeable 字节与多路 SFTP 병렬叠加。建议阅读顺序对齐 원자 배포link-destSHA256 闸门병렬 SFTPDerivedData 관련 글。

2026 生产里为何「디스크 가득」会让 SFTP/rsync 업로드像网络故障

痛点一:把 df 的 Available 当成「还能传」。APFS 的 purgeable 与本地快照会让可用空间在压力下骤降;업로드前应同时看容器空闲百分比与 tmutil listlocalsnapshots,而不是只看 Finder 圆饼图。

痛点二:满盘时仍 in-place rsync 覆盖 release。半写入的 bundle 会破坏 원자 배포 假设;应先停新 Job、清可再生목차,再对 staging 做 dry-run。

痛点三:link-dest 保留 N 过大。硬链接快照省空间但代数叠加仍可能吃满 NVMe;满盘治理应先降 N,再动 DerivedData,避免删除当前 staging 指向的一代。

痛点四:병렬 SFTP 与编译抢同一卷。多路大文件업로드会放大元数据 IO;应联读 병렬 SFTPDerivedData 的降载规则。

痛点五:把 ENOSPC 与 Operation not permitted 混为一谈。后者可能是 TCC/SIP 或只读挂载;用 errno 与 unified log 对照,避免误删业务树。

痛点六:无 SHA256 闸门就强行重试업로드。디스크 가득后的部分文件可能已损坏;恢复顺序应为:释放空间 → dry-run → 무결성 검증 → 再切可见性。

디스크 가득盘治理결정 매트릭스:水位线、LRU 与 CI 闸门

矩阵原则:先判层(真满盘 / inode / 配额),再按空闲百分比选动作;禁止在 <12% 时启动全量 mirror 或多路大文件병렬。

水位线CI / 업로드动作风险下一跳
≥20% 空闲正常업로드/编译常规 rsync + SHA256
12–20%仅增量、禁全量 mirror降병렬 SFTP
<12%停新 Job(exit 75)LRU + 扩卷/外迁
inode>90%停 --delete清小文件集群

How-to:七步完成 APFS 水位探测、아티팩트 LRU 与업로드恢复

在扩卷/外迁前,先完成 SHA256 清单 快照与 원자 배포 工单字段,避免满盘清理删掉仍被 rollback 指针引用的목차。

# APFS disk watermark — pre-upload probe (remote Mac)
df -H / /System/Volumes/Data 2>/dev/null
diskutil info / | rg -i 'Volume Free Space|Container Free Space|APFS'
tmutil listlocalsnapshots / 2>/dev/null | head
du -sh ~/Library/Developer/Xcode/DerivedData/* 2>/dev/null | sort -hr | head -5
FREE_PCT=$(df -g / | awk 'NR==2{print int($4*100/($3+$4))}')
[ "$FREE_PCT" -lt 12 ] && echo "DEFER_CI_UPLOAD" && exit 75
rsync -a --info=stats2 --dry-run ./artifact/ user@remote:/var/staging/incoming/ || true
  1. 冻结变更:记录 df、容器 UUID、当前 link-dest 代数与正在跑的 CI Job 清单。
  2. 判层:区分真满盘、inode 耗尽、配额与中间设备 reset。
  3. 执行水位线:空闲 ≥20% 正常;12–20% 只允许增量;<12% 停新업로드(exit 75)。
  4. LRU 清理:DerivedData → 旧 releases → 降 link-dest N → 本地快照(可再生的优先)。
  5. 업로드前探测:df + rsync dry-run;병렬度按水位自动下调。
  6. 恢复传输:先 staging,再 SHA256,最后原子 swap。
  7. 验收:写入工单「释放空间 GB、删除类别、是否影响回滚」并设定下周 Top10 报表。

참조 데이터:APFS 空闲比例与清理边界

下表为规划用中位数,请在自家원격 Mac 实测后写入 SLO。

指标常见观测建议动作관련 글
DerivedData 单机80–220 GB周期 LRU관련 글
link-dest 保留 5 代1.2–3.5× 单次全量满盘先降 N관련 글
병렬 SFTP 4 路元数据 IO +40%<12% 改 2 路관련 글
本地 TM 快照10–80 GBtmutil thin与 release 分账

建议阅读顺序:link-dest 缩面 → 本文水位/LRU → SHA256원자 배포 swap → 병렬 SFTP 降载。

FAQ

问:업로드中途断开一定是디스크 가득吗?答:不一定。需先区分 ENOSPC、配额、inode 与中间设备 reset;디스크 가득时 ssh 往往仍可登录但写入失败。

问:满盘时能否继续 in-place rsync?答:不建议。应先停新 Job、清可再生아티팩트或扩卷,再按 원자 배포SHA256 闸门 顺序恢复。

问:link-dest 快照占多少空间?答:取决于保留代数与增量比例;满盘时应先降 N、再清 DerivedData,避免删当前 staging。

요약与 SFTPMAC 원격 Mac 收束

本文价值在于把「디스크 가득」从模糊的 rsync 失败,拆成 APFS 水位、아티팩트 LRU 与 CI 闸门三层可执行规则,并与站内원자 배포、完整性、병렬관련 글串成同一套交付顺序。

自建원격 Mac 的局限是:快照代数、清理窗口与监控仍由团队自管;多 Job 同机时,一次满盘会同时打断编译、업로드与回滚能力,SLA 代价高于单次 rm。

若要把磁盘水位与아티팩트 LRU 写进长期基线,租赁 SFTPMAC 원격 Mac可预设分离构建卷与아티팩트卷、内置水位告警与업로드闸门,减少 No space left 导致的发布事故。见 요금제 및 홈