boost的asio使用中的一个问题

前两天在测试用asio写的模块时发现,在高压力情况下,内存使用很大,而且涨上去之后在低压力情况下内存依然没降下来。一开始以为是内存泄露,后来用valgrind查了半天,发现根本没有内存泄露的代码。

后来查了半天代码,推敲了很久之后,发现是其中的一个日志模块在打日志很多的情况下就会出现这个情况,这个日志模块是一个单线程的模块,为了防止日志不被写乱,通过post方法将多个其他线程的日志内容推到这个日志线程的中去。于是这个时候就比较容易理解了,多线程来喂一个单线程,单线程必然响应不过来,这样子导致整个task队列比较一直在增长,并且当压力降下来之后,整个队列已经很大了,并不会再降回去。

其实这个问题,在所有异步系统中普遍存在的,当响应很慢时,会导致请求队列积压,造成内存的大量占用。解决这种问题的办法很直接的一个就是给队列一个上限,当走出这个队列长度之后,拒绝新的请求。这种方法很暴力,但是不会造成系统崩溃。但是检查了io_service的构造函数之后发现,没有提供任何关于队列长度限制的函数,因此这个方法可以直接忽略了。目前来看造成问题的地方在日志模块,只要把日志级别提高,就可以解决问题了。而其他模块由于采用半双工结构,也不会出现请求积压的情况。

今天测试的时候发现整个系统的响应还是比较好的,一个长连接服务器对应两个php-cgi服务器时,1s可以响应4500多个请求,这个结果还是很令人满意的。

你可能感兴趣的:(boost)