怎么合理的规划一个软件系统内部线程的数量

如何合理的规划一个软件系统内部线程的数量?
数据处理的软件当中,尤其是实时数据处理系统软件,不可避免的要进行多线程设计。这里就涉及到一个问题,线程的数量和CPU数量的关系,以及数据处理的并行程度问题。

在目前主流的中低端服务器上,典型配置都是一颗4核的CPU运转。那么应该如何的考虑设计自己的线程数量呢?我手头的项目由于需要进行处理分析数据入库(ORACLE DB/SQL SERVER DB)的分支很多(大概5~10个分支需要进行入库处理),采用了多线程,但是我也困惑到底多少个线程数量会比较合理,如果并发线程太多也可能会导致软件系统的处理效能下降。我现在的想法是每个分支一个线程单独处理,如果一个线程内部处理1个以上的数据入库,就可能导致阻塞等待发生,有可能会不满足数据处理的要求。

请各位DX结合经验谈谈这个问题吧,谢谢。

------解决方案--------------------
每个线程处理一个分支吧, 线程多少无所谓, 逻辑清楚更重要
------解决方案--------------------
我目前做的项目里面还是针对功能来实现线程的
对每一个监控设备启动一个线程
还有一些就是发消息执行功能的
传递信息的线程

基本没有考虑你的这个问题
可能也是软件优化问题了
------解决方案--------------------
一般是CPU*2;
------解决方案--------------------
还是根你要处理的事情有关,测试一下,动态改变线程的个数,看看各个关键资源的变化:CPU,内存,处理的总时间等等.来确定最理想的状态.
------解决方案--------------------
探讨
还是根你要处理的事情有关,测试一下,动态改变线程的个数,看看各个关键资源的变化:CPU,内存,处理的总时间等等.来确定最理想的状态.

------解决方案--------------------
一般多线程应用,大规模计算用的少。主要是为了协调cpu运算,内存IO,磁盘IO,外围设备IO,网络IO,进行多路处理的任务。所以cpu内核数量虽然只有2-4个,但实际上,负责低速IO设备的线程可以多一些。因为cpu和内存的IO速度远远超过,线程数量此时取决于怎样充分发挥低速IO的最高极限。

如果是大规模数学运算,浮点运算,那么4核,4个线程算合理的,通常也不会超过10个线程
------解决方案--------------------
你的程序对几个数据库操作就开几个线程,每个线程对应一个队列,从队列中取任务来处理,其它线程把要处理的任务添加到队列里面。
------解决方案--------------------
按功能划分,考虑系统的整体性能
------解决方案--------------------
差不多是这个思路,不过我感觉vector是多余的,而且vector的效率比较低,如果要每500项数据做一次处理,可以用一个长度为500的数组代替vector。
------解决方案--------------------
除了线程操作,还可以考虑,如何优化数据库,使访问数据库效率更高,操作文件IO如何更有效..
------解决方案--------------------
探讨
vector这里如果不用,那么就要进入临界,直接操作deque的数据进行入库处理,后续的数据如果需要进入deque,不是就要阻塞了么?这里,大侠怎么看?实际效果,我也没有对比过,只是按照我这个思路实现而已。您说的没错,使用数组确实更优,辅助一个counter对进入数组的数据进行计数,到数就入库。

还请指点不用省去vector或者数组,直接操作deque的细节考究。谢谢!

------解决方案--------------------
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。
------解决方案--------------------
探讨
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。

------解决方案--------------------
探讨
引用:
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。


如果断电或是强制关闭程序的话,而且还没有攒够100条,这时候的数据是不是就。。。。



------解决方案--------------------
探讨
引用:
引用:
引用:
你现在是每次向deque插入一个record指针,我的意思是动态分配一个数组,把每个record指针先保存到这个数组里面,等攒够了一批(例如100个records)后,把数组指针插入deque,然后触发事件。处理线程每次从deque中取出一个数组指针,然后进行处理该数组中保存的一批records。


如果断电或是强制关闭程序的话,而且还没有攒够100条,这时候的数据是不是就。。。。


灾难性的故障导致内存中缓存的队列或者数据丢失是难免的。所以设计上应提供到文件的cache机制,文件的IO要快于数据库IO,内存中的队列首先快速的写入cache中,有cache机制的延迟写入数据库,而不是从内存直接到数据库。

设计上,还应提供,立即写入队列,立即写入cache,立即写入数据库的开关。这样能在最大程度上减少因为灾难性故障导致的数据丢失。通过这些选项,可以在不同的运行环境中,提供给用户更多的选择。