boost:asio中io_service使用的几个小问题
boost::asio中io_service使用的几个问题
使用boost::asio开发网络服务器,windows平台下,用于多虚拟现实客户端场景同步(最多100个左右客户端),数据包短但比较频繁,我用的TCP协议。
首先是消息打包解包的问题,我用的是boost::serialization先转换为字符串,再传输,请问boost::serialization转换结构体到字符串的开销大吗?另外转换为字符串导致的数据包变大对系统性能影响大吗?哪位有什么经验。
第二个是是io_service使用模型问题,至少两种方式:1.io_service-per-CPU,就像boost::asio的examples中的http server 2。2.另一种是一个cpu开一个线程。我想在用的是第二种(比如双核4超线程,那就开4个线程)。那么这两种设计模型有什么区别么,大家有什么看法。
另一个问题存在已久,一般都向io_service来post网络I/O请求,然后io_service会调用比如run_one中的GetQueuedCompletionStatus来处理,但io_service也可以处理一般work,比如可以通过function/bind绑定类方法向io_service来post,那io_service是通过什么机制实现类方法的调度、调用呢?
最后一个是,我目前只使用一个io_service,向它又post网络IO请求,又post一般异步方法调用请求(方法都不长),然后多个thread执行io_service.run,那这样做可以吗,对网络IO效率影响有多大呢?
多谢各位了~
------解决方案--------------------
1. 这点我感觉看不出来什么开销的,我的协议都xml,接收了还要解析xml呢
2. 这两种没有具体测试对比过数据,目前我用的是一个io_service对应多个thread
3. 这种机制就是回调啊,只不过asio里用了function bind的方式而已
4.多个线程run没关系的
------解决方案--------------------
1 如果追求打包解包的高校,google protobuffer效率应该是最高的
2 100左右的客户端,2种模型都可以。
3 io_service会使用你run的线程将数据回调给你,io_service自己是不会创建线程的,如果你想效率高,可以初始化IO_SERVICE的时候写入CPU数目的线程,然后创同样数目的线程来run
4 接3,多线程run可能导致你会遇到多线程的问题,你可以使用锁或者strand的方法来解决。友情提示,调用异步send的时候要注意,在发送成功的进回调前一定得保证send的buffer有效。
使用boost::asio开发网络服务器,windows平台下,用于多虚拟现实客户端场景同步(最多100个左右客户端),数据包短但比较频繁,我用的TCP协议。
首先是消息打包解包的问题,我用的是boost::serialization先转换为字符串,再传输,请问boost::serialization转换结构体到字符串的开销大吗?另外转换为字符串导致的数据包变大对系统性能影响大吗?哪位有什么经验。
第二个是是io_service使用模型问题,至少两种方式:1.io_service-per-CPU,就像boost::asio的examples中的http server 2。2.另一种是一个cpu开一个线程。我想在用的是第二种(比如双核4超线程,那就开4个线程)。那么这两种设计模型有什么区别么,大家有什么看法。
另一个问题存在已久,一般都向io_service来post网络I/O请求,然后io_service会调用比如run_one中的GetQueuedCompletionStatus来处理,但io_service也可以处理一般work,比如可以通过function/bind绑定类方法向io_service来post,那io_service是通过什么机制实现类方法的调度、调用呢?
最后一个是,我目前只使用一个io_service,向它又post网络IO请求,又post一般异步方法调用请求(方法都不长),然后多个thread执行io_service.run,那这样做可以吗,对网络IO效率影响有多大呢?
多谢各位了~
------解决方案--------------------
1. 这点我感觉看不出来什么开销的,我的协议都xml,接收了还要解析xml呢
2. 这两种没有具体测试对比过数据,目前我用的是一个io_service对应多个thread
3. 这种机制就是回调啊,只不过asio里用了function bind的方式而已
4.多个线程run没关系的
------解决方案--------------------
1 如果追求打包解包的高校,google protobuffer效率应该是最高的
2 100左右的客户端,2种模型都可以。
3 io_service会使用你run的线程将数据回调给你,io_service自己是不会创建线程的,如果你想效率高,可以初始化IO_SERVICE的时候写入CPU数目的线程,然后创同样数目的线程来run
4 接3,多线程run可能导致你会遇到多线程的问题,你可以使用锁或者strand的方法来解决。友情提示,调用异步send的时候要注意,在发送成功的进回调前一定得保证send的buffer有效。