执行repo sync/git clone时出现Bad packet length错误的解决咨询
问题场景
执行repo sync拉取大型项目时频繁触发Bad packet length xxxxx错误,git clone操作偶尔也会出现相同问题。尝试在~/.ssh/config中添加ControlMaster auto和ControlPersist yes后,错误信息不再显示,但同步操作依然卡顿。
环境信息:
- 系统:Ubuntu 20.04.6 LTS
- CPU/内存:32核,125G内存
- Repo版本:2.45(launcher)
- Git版本:2.25.1
错误日志示例:
yangbinbin@pvt-BianYiJi012:~/8678_single$ repo sync -c -f -j4 --no-repo-verify --optimized-fetch warning: -f/--force-broken is now the default behavior, and the options are deprecated Fetching: 68% (1268/1862) 25:05 | 4 jobs | 8:08 platform/prebuilts/clang/host/linux-x86 @ prebuilts/clang/host/linux-x86Bad packet length 2647955583. Finished discarding for 192.168.1.234 port 29415
解决方法
1. 优化SSH连接配置
修改~/.ssh/config,针对目标Gerrit服务器添加更稳定的连接参数:
Host 192.168.1.234 ControlMaster auto ControlPersist 300s # 设为具体时长,避免长期闲置连接卡顿 Ciphers aes128-ctr,aes192-ctr,aes256-ctr # 选用轻量稳定的加密算法 MACs hmac-sha2-256,hmac-sha2-512 Compression yes # 启用压缩减少传输数据量
说明:高负载场景下,复杂加密算法容易引发数据包长度异常,轻量算法可降低连接出错概率;压缩能有效减少大型仓库的传输体积。
2. 降低Repo同步并发数
减少repo sync的-j参数值,从-j4调整为-j2或-j1:
repo sync -c -f -j2 --no-repo-verify --optimized-fetch
说明:过高的并发数会导致SSH连接池拥堵,引发数据包冲突或服务器端限流,降低并发可缓解连接压力。
3. 调整网络MTU值
过大的MTU可能导致数据包分片失败,引发Bad Packet错误。临时调整MTU(以网卡eth0为例):
sudo ifconfig eth0 mtu 1400
永久修改需编辑Netplan配置(如/etc/netplan/00-installer-config.yaml):
network: ethernets: eth0: mtu: 1400 addresses: [192.168.1.x/24] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8] version: 2
执行sudo netplan apply生效。
4. 更新Git版本
当前Git 2.25.1存在部分SSH传输的已知bug,更新到稳定新版本:
sudo add-apt-repository ppa:git-core/ppa sudo apt update && sudo apt install git -y
验证版本:git --version
5. 优化Repo缓存与日志
在~/.bashrc中添加环境变量,指定临时缓存目录并开启调试日志:
export REPO_CACHE_DIR=/tmp/repo-cache # 用tmpfs加速缓存访问 export REPO_TRACE=1 # 开启trace日志,便于定位卡顿节点
执行source ~/.bashrc生效。
6. 检查服务器端Gerrit配置(若有权限)
登录Gerrit服务器,修改/etc/gerrit/sshd_config中的连接限制参数:
MaxSessions 10 # 单连接的最大会话数 MaxStartups 10:30:100 # 并发连接限制,10个连接后开始限流,超过100个拒绝
重启Gerrit服务:sudo service gerrit restart
内容的提问来源于stack exchange,提问作者user25382962

