# 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倍 **可能原因**: 1. SCP legacy protocol 效率更低(相比 rsync delta transfer) 2. SCP 使用 exec(`scp -t`),而不是 SFTP subsystem 3. SSH server 处理 SCP stdin/stdout overhead 更高 ## SCP protocol 分析 ⭐⭐⭐⭐⭐ **SCP exec 命令**: ```bash scp -t /tmp/scp_20mb_fixed.bin ``` **SCP protocol 流程**(legacy): 1. Client sends: `C0644 20971520 test_20mb.bin\n` 2. Server responds: `\0` (ACK) 3. Client sends: File data (20MB) 4. Server responds: `\0` (ACK) 5. 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) **理由**: 1. rsync 已验证成功(10-50MB,MD5一致) 2. SCP legacy protocol 本身效率低(无 delta transfer) 3. 实现复杂度高(需要完全禁用 stdin timeout 或实现 SCP subsystem) --- **最后更新**:2026-06-17 22:20