youngwolf

Results 3 comments of youngwolf

谢谢你的反馈。 1. 库只会用stl对象,或者boost对象,没有创建并维护过指针,这意味着想内存泄漏都有一定难度。 2. 请详细描述你是怎么做压力测试的,或者提供代码,比如到底是不停的连接断开再连接,还是发送尽可能多的数据占满带宽。 3. 查看object_pool::size()和object_pool::invalid_object_size()的大小。 4. 对于主动关断连接的一方,套接字会进入TIME_WAIT状态,并持续一定的时间,在这段时间之内,这个端口将不可用,如果服务器机器上所有端口都处于这个状态,则无法接收新的连接,这是SOCKET的设计,可以通过参数修改这个行为以及持续时长。 5. server_base默认最多支持4096个连接,当多余的连接到达时,会主动关断连接。 6. glibc是有内存池的,一般只增长不减小。 7. 每个st_asio_wrapper::socket都有两个消息缓存,每个缓存里面最多1024条消息(消息长度要看解包器),和一个解包器,占用4000字节宝长长度。这些都是默认值,可以被修改。

异常断线是检查不了的,所以才有了心跳包的出现(但你这种情况不能开启心跳包功能,因为对方不是st_asio_wrapper库,心跳包是用户数据包,必须两端都认可的格式才能叫心跳包)。 默认情况下,只要你不截获on_recv_error,框架会走del_socket(这个签名跟你的不一样,可见你没有用最新的版本,建议用最新版本),除非你定义了ASCS_CLEAR_OBJECT_INTERVAL且大于0,此时框架会帮你定时批量清理无效的socket,所谓清理其实是放object pool里面等待被重用,如果不想被重用,就不能定义ASCS_REUSE_OBJECT或者ASCS_RESTORE_OBJECT宏,那么才会真正的从内存中释放socket。 异步通信系统里,释放对象是很麻烦的一件事,搞不好会造成回调的时候,对象野掉了。 object_pool::invalid_object_size()就是断开的连接的数量,没有真正从内存中释放(原因可能是开启了对象重用,或者异步调用还未结束所以不能释放)。 object_pool::size()是有效(包括未检测到的断开了的连接)连接的数量。 注意,上面我说的宏是ascs库用的,st库的话,把前辍改成ST_ASIO_,同时我也建议你用ascs,效率远高于st库,ascs需要c++0x,不需要boost,st库需要boost不需要c++0x,st库的接口与ascs完全一样,只是顶层命名空间一个是st_asio_wrapper,一个是ascs,其它都一样。