现象:进程在被远程观察时,会导致进程消息队列满,进一步查看进程堆栈,发现是线程阻塞在printf。
为什么printf会阻塞呢,虽然printf本身是阻塞函数,但通常直接输出到标准输出时不太会阻塞很长时间。
但是如果标准输出被重定向到其他地方,就有可能阻塞。比如重定向到串口、网口、管道等。
重定向到串口的情况:假如输出的过多过快,串口输出的过慢,就会导致阻塞较长时间
到网口的情况:最常见的就是ssh登录、telnet登录,这时输出的当前终端的标准输出都重定向到了ssh、telnet的链路中,如果链路的send阻塞了,标准输出自然也就阻塞了
到管道的情况:管道缓冲区有限,对端读的过慢或不读,本端作为写的一端将缓冲区写满后就会阻塞
本次问题是由于重定向到ssh导致的。
由于使用ssh登录到服务器定位问题,且打开了被定位进程的标准输出,printf就源源不断的通过ssh的链路输出到当前终端。
但是在当前机器一段时间未使用休眠后,ssh终端将不再从TCP协议栈读取数据,导致服务器端的发送缓冲区满,进而导致send阻塞,
然后就是printf阻塞,直到ssh心跳超时断开连接,printf恢复。
阅读(7049) | 评论(0) | 转发(0) |