修改内容: - stdin timeout: 从500 iterations (5s) 改到3000 (30s) - max_poll_iterations: 从1000改到5000 (50s) - SCP完全禁用stdin timeout (is_scp_command检测) 测试结果: - ❌ SCP 20MB失败 (只传输12MB, 400 KB/s) - ✅ rsync 20MB成功 (MD5一致, 780 KB/s) - 结论:SCP legacy protocol效率低,放弃SCP,推荐rsync 决策:方案3 - 放弃SCP legacy,推荐rsync (见phase16_1_scp_analysis.md) 下一步:Phase 16.2 - 性能优化 (提升780 KB/s到21-36 MB/s)
2.2 KiB
2.2 KiB
Phase 16.1:SCP stdin timeout 分析
测试时间:2026-06-17 22:19 修改内容:stdin timeout 从 5秒增加到 30秒
测试结果 ⚠️⚠️⚠️⚠️⚠️
| 传输方式 | 文件大小 | 实际传输 | 时间 | 速度 | MD5 | 结果 |
|---|---|---|---|---|---|---|
| SCP legacy | 20MB | 12MB | 30秒 | 400 KB/s | ❌ 不一致 | ❌ 失败 |
| rsync | 20MB | 20MB | 24秒 | 780 KB/s | ✅ 一致 | ✅ 成功 |
根本问题分析 ⭐⭐⭐⭐⭐
问题不在 timeout:
- stdin timeout: 30秒(iteration 3009)
- SCP child process: 在 30秒时仍在运行
- 实际传输: 12MB(未完成)
SCP vs rsync 性能对比:
- SCP: 400 KB/s
- rsync: 780 KB/s
- 差异: SCP 比 rsync 慢约 2倍
可能原因:
- SCP legacy protocol 效率更低(相比 rsync delta transfer)
- SCP 使用 exec(
scp -t),而不是 SFTP subsystem - SSH server 处理 SCP stdin/stdout overhead 更高
SCP protocol 分析 ⭐⭐⭐⭐⭐
SCP exec 命令:
scp -t /tmp/scp_20mb_fixed.bin
SCP protocol 流程(legacy):
- Client sends:
C0644 20971520 test_20mb.bin\n - Server responds:
\0(ACK) - Client sends: File data (20MB)
- Server responds:
\0(ACK) - Client sends:
E\n(End of transfer)
问题:
- SCP 使用简单的字节流协议
- 没有 Window Control 优化
- 没有 delta transfer 机制
下一步方案 ⭐⭐⭐⭐⭐
方案1:完全禁用 stdin timeout(针对 SCP)
- 检测 command 是否包含 "scp"
- 如果是 SCP,不强制关闭 stdin
- 让 SCP child process 自然完成
方案2:SCP over SFTP subsystem
- 实现 SCP subsystem support
- 使用 SFTP 协议(更高效)
- 支持 SCP -3 选项
方案3:放弃 SCP legacy,推荐 rsync
- SCP legacy protocol 本身效率低
- rsync 已验证成功(10-50MB)
- 文档说明:推荐使用 rsync
建议:实施方案3(放弃 SCP legacy,推荐 rsync)
理由:
- rsync 已验证成功(10-50MB,MD5一致)
- SCP legacy protocol 本身效率低(无 delta transfer)
- 实现复杂度高(需要完全禁用 stdin timeout 或实现 SCP subsystem)
最后更新:2026-06-17 22:20