c++程序未挂,几分钟无响应,之后又好了?

1、里面的每秒定时器显示,距离上次执行超时10分钟了,按理超时2秒都不正常的。
超时期间没有任何日志,程序好多地方都有打印日志的

2、同一时间,相关的另一个进程也未收到任何信息,按理是可以收到的

3、用的是 Ubuntu 14.04.6 LTS (GNU/Linux 4.4.0-93-generic x86_64),gcc version 4.8.4

4、出问题的时候、cpu和内存、文件句柄数都正常,网络、端口、防火墙也可以

5、问题期间尝试建立sock连接无反应

6、刚出问题那会,就算请求进来的信息也突然中断,直到程序自己好了才回复,就好像CPU突然被占用了一样

图片说明

我猜是磁盘IO操作的问题。
应该是阻塞的造成的,但是什么阻塞的呢,不知道。
请求被挂起,应用程序又能恢复。内存正常。
那么按系统执行优先级硬件在前,软件在后,可能是硬件霸占CPU,然后软件等待。
具体看系统日志有没有记录什么的。都是猜测提供的信息简单又少,看你自己了

正常情况每秒都有输出显示,异常时有10分钟没有显示,说明程序卡在某个点上,没有持续执行。
CPU很低,说明不是卡在死循环,那么就是卡在带阻塞功能的系统调用上。这种接口很多,比如socket接口(read/readfrom)、IO接口等等。多线程同步时,死锁也可能导致这种现象。

一般都是根据代码逻辑插入日志,一点点排查。

你有没有用到多线程,或者IO访问加了锁,感觉你这个是死锁造成的。客户端和服务器端是否在一个计算机上,或者多个客户端在连服务器端。

排除加锁问题最有效的办法是在同步代码调用之前加上日志输出,看哪里不能输出了。另外排除下环境冲突的问题,可以把你的程序放在另一个计算机(没有条件可以用虚拟机),干净的系统上,看是否报错。

如果不是以上的原因,可能是网络的阻塞,软件方面是防火墙的拦截,硬件方面是网卡驱动,网络本身。

直接排查你的io访问吧, Ubuntu 我虽然没去整过硬件的开发,但是windows上经常遇到类似的情况

DeviceIoControl // 直接发送控制代码到指定的设备驱动程序,使相应的移动设备以执行相应的操作的函数

Ubuntu上应该也是有类似的函数的,在某些情况下io访问发送的数据或者指令造成驱动内的处理超时
而很多驱动中写的超时都超长,如windows下经常就看到sleep(5000) , 这就得等一个小时了

你不能gdb attach上去看看各个线程都在干什么吗?