mirrors 修复 linux.git 源

最近有人反映 mirrors 上的 linux.git 源无法 clone。具体表现为 git clone 到 700MB 左右时卡住,git 无输出。登录后发现 linux.git 有差不多 7GB 大小,判断为 git 存储的松散对象没有被重新打包,导致这个 git 镜像越来越大。

因此先手动对 linux.git 进行 git gc 操作,其占用空间从 7GB 下降到 700MB,服务恢复。随后在同步用的LXC虚拟机中,添加crontab规则:

0       0       * * mon (cd /srv/ftp3/git-repos/linux.git; git gc) > /dev/null 2>&1

即每周一零点零分对 linux.git 进行一次 git gc 操作。

Mirrors 新版首页上线

喵喵为 mirrors 设计了新版首页,欢迎围观~

http://mirrors.ustc.edu.cn/

Mirrors 新首页使用 git 版本控制,只要 push 到 master 分支,GitLab 就会触发 Web Hook,被守候在 mirrors 上的 nodejs 捕获,触发版本库更新和首页重生成。还使用 incron 监控 /srv/www 的变化,有变化时重新生成首页,不再需要每 5 分钟执行重新生成首页的脚本了。

repo 地址是 https://gitlab.lug.ustc.edu.cn/mirrors/newindex.git

mirrors 修复部分文件不能更新问题

mirrors 9月重装后使用 root 同步,一些文件 owner 变成了 root。对所有文件进行 chown,但事实上没有全部 chown。后来改用 mirror 用户同步,就有一些文件一直不能同步成功(Permission Denied)。感谢 HUANG Jianbo 的反馈。

chown 时使用的命令是 chown -R /srv/{array/exports,array/repo,ftp1,ftp2,ftp3,ftp4},而 ftp1,ftp2,ftp3,ftp4 是符号链接(链接到 /mnt/{d,e,f,g}),重装系统之前是直接挂载在这里的。对这些符号链接,chown 并没有 follow symlink,因此 ftp1,2,3,4 事实上没有 chown。正确的做法是在后面加 /,也就是 chown -R /srv/ftp{1,2,3,4}/。希望引以为戒。

mirrors 修复 page allocation failure

从 syslog 里看到,从9月3日(也就是 mirrors 最近一次故障刚恢复服务)开始,每天都有几十次甚至上百次 page allocation failure,最多的一天 266 次。诱发者大部分是 swapper/0,少数是 rsync,nginx,collectd。

Aron Xu 建议修改 sysctl 中的下列参数:

vm.vfs_cache_pressure=1000
vm.zone_reclaim_mode=2

现在不再出现 page allocation failure 了。

mirrors 修复 Debian 源缓存不一致问题

mirrors 在此前两个星期,Debian 源有时 Packages 文件与软件包有时会 MD5 不一致,这是因为 SSD cache 没有及时更新。本来是希望每次同步之后更新当前源,每6小时整体更新(failover,以防万一)。但实际出现了三次问题:

  1. 对 rsync 参数理解不对,旧缓存文件没有删除,导致 SSD 满了。现在自己写了个很丑的 bash 脚本来实现。
  2. ftpsync 的同步写在文件末尾,而末尾的 runmirrors 有可能失败,导致脚本提前退出,不执行更新。
  3. ftpsync 的同步写在 stage1 后,stage2 更新 Packages 和索引文件后并没有更新缓存。

ftpsync 真是个比较复杂的东西。非常抱歉这种间歇性的缓存不一致给 Debian 用户带来的麻烦。

mirrors 修复缓存更新慢的问题

现在设置了 trigger,每个源同步完成后都会立即更新这个源的 cache,而不用等每天凌晨统一更新 cache 了。这使得缓存不一致的时间缩短到秒级。

此外,由于 rsync 同步不够灵活,全部删掉再重新复制又太浪费,我重新发明了轮子来做同步。算法见下面的注释:

# There are actually 3 file lists:
#  - cache_list: files to be cached (param 1 of this func)
#  - WWWROOT: authoritative source
#  - CACHEROOT: cache files
# After sync, CACHEROOT should contain up-to-date files in and only in the intersection of cache_list and WWWROOT.
# So comes the algorithm:
#  1. Remove files in CACHEROOT but not in cache_list
#  2. Remove files in CACHEROOT but not in WWWROOT or not up-to-date
#  3. Copy non-cached files in cache_list to CACHEROOT, if it exists in WWWROOT

完整的代码 git clone https://gitgeek.net/mirrors/ssd-cache.git