完成端口与线程池的几点疑问

keyforone 2011-04-12 09:37:31
最近在看一些关于如何提升Socket服务器性能的资料,看到完成端口模型,给我的第一感觉就是方便易用,虽然做的初始化工作可能有点多,当然线程池也是我关注的一点,上网看了一些相关的帖子之后,发现不少人使用完成端口模型来实现自己的线程池,那我就有如下疑问了:
1、完成端口本身就是利用重叠IO的思想基于同步消息队列以及线程池技术来实现这么一个“生产者-消费者”模型,既然它已经是对线程池的一个封装了,为何还有人利用完成端口模型来构建线程池呢?利用完成端口,已经完全可以实现跟使用线程池相同的效率了,我怎么感觉是多此一举,当然也许是我的理解有误。
2、目前我正在做一个Socket通信服务器,客户端应该有5000~10000个左右,基于完成端口做的,我在工作者线程中收取到客户端发送的数据之后是直接做业务处理的(业务处理也在工作者线程中),但是有的业务处理需要较长的处理时间,并且一旦客户端的请求数量突发性的增大,那么服务器的响应性就非常差了,虽然可以通过设置增加工作者线程数量以及并发线程数量来提高一定的响应性,但是这个值是难以确定的,小弟在此请教各位,该如何设计才能在尽量减少内存消耗的前提下提高服务器的吞吐能力呢?
...全文
139 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dskit 2011-04-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 keyforone 的回复:]
回 dskit:
假如现在有4个工作者线程都处于活动状态,最大的并发量也设置为4,如果这时候需要处理的任务有很多,而工作者线程又忙于处理当前的业务,这些业务处理基本是没有阻塞性操作的,只是处理时间长一点,那这时候的CPU使用率应该是很高的吧,因为线程一直是出于忙碌状态的。
我的设想是在工作者线程取出数据之后,先对数据做一些预处理,然后利用自定义的线程池接着处理耗时的操作,这样的做法应该……
[/Quote]

个人认为:

1. 数据的预处理在任何恰当的地方都应该使用,不管是不是在线程池技术中。
2. 如果你的工作线程很快处理完数据,总有办法尽快的发送响应,优先将工作线程分配给响应发送或周期性发送响应等。
3. 说句跟线程池技术无关的话,提高性能的关键在于问题本身的复杂度或算法,考虑性能首先根据20:80原则,找到消耗80%资源的代码针对性进行优化,找一种万能的方法不太现实。

luciferisnotsatan 2011-04-13
  • 打赏
  • 举报
回复
windows核心编程 第5版
keyforone 2011-04-13
  • 打赏
  • 举报
回复
dskit君怎么不出来了?
keyforone 2011-04-13
  • 打赏
  • 举报
回复
求靠谱而又详细的回答
ifengshow 2011-04-12
  • 打赏
  • 举报
回复
关注下
愤怒的泡面 2011-04-12
  • 打赏
  • 举报
回复
我这段时间也在学习完成端口和线程池技术,关注,帮顶!
keyforone 2011-04-12
  • 打赏
  • 举报
回复
回 dskit:
假如现在有4个工作者线程都处于活动状态,最大的并发量也设置为4,如果这时候需要处理的任务有很多,而工作者线程又忙于处理当前的业务,这些业务处理基本是没有阻塞性操作的,只是处理时间长一点,那这时候的CPU使用率应该是很高的吧,因为线程一直是出于忙碌状态的。
我的设想是在工作者线程取出数据之后,先对数据做一些预处理,然后利用自定义的线程池接着处理耗时的操作,这样的做法应该是可以很大程度的提高消息的接受速度,但是响应速度就不确定了,不知是否可行?
苍蝇①号 2011-04-12
  • 打赏
  • 举报
回复
换个好点的服务器吧
当然要是有兴趣的话也可以试试MP
dskit 2011-04-12
  • 打赏
  • 举报
回复
尽量减少内存消耗的前提下提高服务器的吞吐能力,

只有一种可能,就是尽可能利用当前状况下剩余的CPU使用率。
那只有将工作进一步分解为更小的任务了,然后分配到更多的线程上了。
delphiwcdj 2011-04-12
  • 打赏
  • 举报
回复
关注下
1,也许是为了方便管理,将资源更好的归纳提高使用效率
2,池技术不是万能的,有些时候只有通过更换平台,重构系统才可以从根本上提高服务性能和质量。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧