Paramiko SSH读取stdout为何未释放缓冲区空间?
SSH缓冲区阻塞与窗口流控测试疑问
测试背景
编写测试代码验证SSH缓冲区的工作机制,以及未读取的输出达到多大体积时会阻塞远程程序。
测试现象与结论
- 客户端代码优先读取
stdout,当服务器端stderr输出量过大填满缓冲区时,客户端无法继续读取stdout - 测试发现缓冲区总容量约为2MiB,当
stderr输出超过2097134字节时,客户端会出现挂起 - 推测
stdout和stderr共享同一缓冲区,总限制为2MiB-1字节
待解疑问
客户端已经读取了stdout的8+9字节数据,按照SSH2的窗口流控机制(根据Paramiko文档,读取数据后应当释放对应缓冲区空间,允许服务器继续发送数据),但实际服务器仍然无法写入更多stderr数据,这一情况和预期不符。
环境信息
- 客户端:Windows 10、Python 3.8.10、paramiko 3.1.0
- 服务器:Ubuntu 20.04.2 LTS、Python 3.8.10、OpenSSH_8.2p1
内容的提问来源于stack exchange,提问作者Vespene Gas
相关产品推荐
相关产品推荐

