怎么合理的规划一个软件系统内部线程的数量
如何合理的规划一个软件系统内部线程的数量?
数据处理的软件当中,尤其是实时数据处理系统软件,不可避免的要进行多线程设计。这里就涉及到一个问题,线程的数量和CPU数量的关系,以及数据处理的并行程度问题。
在目前主流的中低端服务器上,典型配置都是一颗4核的CPU运转。那么应该如何的考虑设计自己的线程数量呢?我手头的项目由于需要进行处理分析数据入库(ORACLE DB/SQL SERVER DB)的分支很多(大概5~10个分支需要进行入库处理),采用了多线程,但是我也困惑到底多少个线程数量会比较合理,如果并发线程太多也可能会导致软件系统的处理效能下降。我现在的想法是每个分支一个线程单独处理,如果一个线程内部处理1个以上的数据入库,就可能导致阻塞等待发生,有可能会不满足数据处理的要求。
请各位DX结合经验谈谈这个问题吧,谢谢。
------解决方案--------------------
每个线程处理一个分支吧, 线程多少无所谓, 逻辑清楚更重要
------解决方案--------------------
我目前做的项目里面还是针对功能来实现线程的
对每一个监控设备启动一个线程
还有一些就是发消息执行功能的
传递信息的线程
基本没有考虑你的这个问题
可能也是软件优化问题了
------解决方案--------------------
一般是CPU*2;
------解决方案--------------------
还是根你要处理的事情有关,测试一下,动态改变线程的个数,看看各个关键资源的变化:CPU,内存,处理的总时间等等.来确定最理想的状态.
------解决方案--------------------
------解决方案--------------------
一般多线程应用,大规模计算用的少。主要是为了协调cpu运算,内存IO,磁盘IO,外围设备IO,网络IO,进行多路处理的任务。所以cpu内核数量虽然只有2-4个,但实际上,负责低速IO设备的线程可以多一些。因为cpu和内存的IO速度远远超过,线程数量此时取决于怎样充分发挥低速IO的最高极限。
如果是大规模数学运算,浮点运算,那么4核,4个线程算合理的,通常也不会超过10个线程
------解决方案--------------------
你的程序对几个数据库操作就开几个线程,每个线程对应一个队列,从队列中取任务来处理,其它线程把要处理的任务添加到队列里面。
------解决方案--------------------
按功能划分,考虑系统的整体性能
------解决方案--------------------
差不多是这个思路,不过我感觉vector是多余的,而且vector的效率比较低,如果要每500项数据做一次处理,可以用一个长度为500的数组代替vector。
------解决方案--------------------
除了线程操作,还可以考虑,如何优化数据库,使访问数据库效率更高,操作文件IO如何更有效..
------解决方案--------------------
------解决方案--------------------
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
数据处理的软件当中,尤其是实时数据处理系统软件,不可避免的要进行多线程设计。这里就涉及到一个问题,线程的数量和CPU数量的关系,以及数据处理的并行程度问题。
在目前主流的中低端服务器上,典型配置都是一颗4核的CPU运转。那么应该如何的考虑设计自己的线程数量呢?我手头的项目由于需要进行处理分析数据入库(ORACLE DB/SQL SERVER DB)的分支很多(大概5~10个分支需要进行入库处理),采用了多线程,但是我也困惑到底多少个线程数量会比较合理,如果并发线程太多也可能会导致软件系统的处理效能下降。我现在的想法是每个分支一个线程单独处理,如果一个线程内部处理1个以上的数据入库,就可能导致阻塞等待发生,有可能会不满足数据处理的要求。
请各位DX结合经验谈谈这个问题吧,谢谢。
------解决方案--------------------
每个线程处理一个分支吧, 线程多少无所谓, 逻辑清楚更重要
------解决方案--------------------
我目前做的项目里面还是针对功能来实现线程的
对每一个监控设备启动一个线程
还有一些就是发消息执行功能的
传递信息的线程
基本没有考虑你的这个问题
可能也是软件优化问题了
------解决方案--------------------
一般是CPU*2;
------解决方案--------------------
还是根你要处理的事情有关,测试一下,动态改变线程的个数,看看各个关键资源的变化:CPU,内存,处理的总时间等等.来确定最理想的状态.
------解决方案--------------------
------解决方案--------------------
一般多线程应用,大规模计算用的少。主要是为了协调cpu运算,内存IO,磁盘IO,外围设备IO,网络IO,进行多路处理的任务。所以cpu内核数量虽然只有2-4个,但实际上,负责低速IO设备的线程可以多一些。因为cpu和内存的IO速度远远超过,线程数量此时取决于怎样充分发挥低速IO的最高极限。
如果是大规模数学运算,浮点运算,那么4核,4个线程算合理的,通常也不会超过10个线程
------解决方案--------------------
你的程序对几个数据库操作就开几个线程,每个线程对应一个队列,从队列中取任务来处理,其它线程把要处理的任务添加到队列里面。
------解决方案--------------------
按功能划分,考虑系统的整体性能
------解决方案--------------------
差不多是这个思路,不过我感觉vector是多余的,而且vector的效率比较低,如果要每500项数据做一次处理,可以用一个长度为500的数组代替vector。
------解决方案--------------------
除了线程操作,还可以考虑,如何优化数据库,使访问数据库效率更高,操作文件IO如何更有效..
------解决方案--------------------
------解决方案--------------------
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------