亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 21067 | 回復(fù): 89
打印 上一主題 下一主題

多線程OR多進(jìn)程-訪存密集型應(yīng)用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2011-12-21 11:58 |只看該作者 |倒序?yàn)g覽
                   Linux下多線程和多進(jìn)程的優(yōu)劣我就不講了,那些都是老生常談的東西,最近項(xiàng)目做一個(gè)流數(shù)據(jù)統(tǒng)計(jì)引擎(有點(diǎn)類似數(shù)據(jù)庫的統(tǒng)計(jì)count(*)等)。項(xiàng)目是用多線程實(shí)現(xiàn)的。
具體的場(chǎng)景是這樣的, 一組線程從socket接受流數(shù)據(jù),經(jīng)過簡(jiǎn)單處理把數(shù)據(jù)送到處理線程,讓處理線程對(duì)流數(shù)據(jù)進(jìn)行處理(我們項(xiàng)目把每一類流數(shù)據(jù)具體為一類event),然后等到一定的時(shí)間把統(tǒng)計(jì)結(jié)果寫文件。

                  處理的場(chǎng)景如下:所有的處理單元用無鎖的環(huán)形緩沖區(qū)串在一起,形成一條流水線,每一個(gè)處理單元是一個(gè)線程,這樣的好處是流數(shù)據(jù)是所有處理單元共享的,可以節(jié)約內(nèi)存,然后流數(shù)據(jù)的指針在不同的處理單元串行流動(dòng)(這樣可以避免用到鎖)。

                這是一個(gè)典型的場(chǎng)景,數(shù)據(jù)的指針在流動(dòng),然后每個(gè)線程查看數(shù)據(jù)(不會(huì)修改),然后更新統(tǒng)計(jì)結(jié)果,所有的程序沒有用到鎖,按照道理來說,這樣的模型是比較好的。但是實(shí)際情況是一個(gè)處理單元的處理能力是3W個(gè)Event/s,10個(gè)處理單元形成流水線以后,處理能力只能達(dá)到3000個(gè)Event/s。這樣的結(jié)果讓我大跌眼鏡。
               
               嘗試過的解決方案:一開始以為操作系統(tǒng)的內(nèi)存數(shù)據(jù)結(jié)構(gòu)同步會(huì)影響流水線的并行性,后面嘗試在每個(gè)線程上面加一個(gè)線程池,這樣每個(gè)線程的內(nèi)存分配和釋放都是線程自己管理,甚至連STL也沒有使用,內(nèi)存完全是自己控制的,但是沒有絲毫效果。
                                        后面嘗試用多進(jìn)程,每個(gè)處理單元都是一個(gè)進(jìn)程,進(jìn)程間用管道串起來,數(shù)據(jù)在管道間傳輸,這樣的話,速度能夠基本上保持線性增加(2U 4C 超線程的服務(wù)器)1個(gè)處理單元式3W 10個(gè)處理單元大概有2.5W/處理單元 也就是總共25W的吞吐。
                                 
                  這里我看出多線程還有些什么地方有問題,訪存得問題還是緩存命中的問題,現(xiàn)在也不得而知,不知道這種模型能不能夠改進(jìn),畢竟多線程能夠共享數(shù)據(jù),所以可以共享原始的流數(shù)據(jù),可以節(jié)約很多內(nèi)存,如果改進(jìn)線程模型可以增加線性不知道又沒有高手能夠解答一下。
                 
              我在網(wǎng)上找了很多資料,版主 johnbull 曾今說過這個(gè)問題,他說多線程共享數(shù)據(jù),會(huì)造成太多的緩沖會(huì)寫(wirte-back),所以導(dǎo)致內(nèi)存子系統(tǒng)的串行化訪問,我感覺我的程序問題就在這里,不過我不懂的是,多線程共享數(shù)據(jù),但是這個(gè)數(shù)據(jù)是只讀的(沒有線程回去修改),所以我的理解是數(shù)據(jù)如果不是dirty的 那么不用wirte-back吧。。。。。。。。
            
               不知道大家有沒有關(guān)注訪存密集型應(yīng)用,特別是SMP的架構(gòu)下,內(nèi)存的訪問是最大的瓶頸吧。期待大家的解答。。
                  

論壇徽章:
11
未羊
日期:2013-12-16 12:45:4615-16賽季CBA聯(lián)賽之青島
日期:2016-04-11 19:17:4715-16賽季CBA聯(lián)賽之廣夏
日期:2016-04-06 16:34:012015亞冠之卡爾希納薩夫
日期:2015-11-10 10:04:522015亞冠之大阪鋼巴
日期:2015-07-30 18:29:402015亞冠之城南
日期:2015-06-15 17:56:392015亞冠之卡爾希納薩夫
日期:2015-05-15 15:19:272015亞冠之山東魯能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16賽季CBA聯(lián)賽之八一
日期:2016-07-22 09:41:40
2 [報(bào)告]
發(fā)表于 2011-12-21 12:07 |只看該作者
沒徹底搞清楚到底怎么個(gè)模型, 可否帖個(gè)大概代碼出來?

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2011-12-21 12:25 |只看該作者
不能確定是我提到的原因。
我懷疑是你使用“無鎖”算法造成的,無鎖雖然避免了互斥開銷,但你可能因此而不得不采用忙等方式操作,搞不好得不償失。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2011-12-21 12:35 |只看該作者
oprofile ,先找問題原因吧,

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2011-12-21 14:26 |只看該作者
代碼太多,真帖不了

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2011-12-21 14:28 |只看該作者
確實(shí)是用了忙等,不過一個(gè)線程也是忙等。多個(gè)線程一起忙等,對(duì)程序有影響么,而且機(jī)器的線程數(shù)是32線程的,10個(gè)線程應(yīng)該可以同時(shí)運(yùn)行吧。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2011-12-21 14:32 |只看該作者
確實(shí)正在用oprofile分析  不過那個(gè)工具網(wǎng)上介紹都比較淺,正在摸索

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2011-12-21 14:36 |只看該作者
hy036630 發(fā)表于 2011-12-21 14:28
確實(shí)是用了忙等,不過一個(gè)線程也是忙等。多個(gè)線程一起忙等,對(duì)程序有影響么,而且機(jī)器的線程數(shù)是32線程的, ...

忙等就是空轉(zhuǎn),空轉(zhuǎn)就是 “誓把時(shí)間片吃盡,我不干事別人也別想干”...
性能還能好?老老實(shí)實(shí)加上鎖再試試

google下“老板-雇員”算法。

論壇徽章:
0
9 [報(bào)告]
發(fā)表于 2011-12-21 14:58 |只看該作者
不好意思 可能我上面沒有說清楚
我用的是下面這個(gè)環(huán)形隊(duì)列  無鎖的實(shí)現(xiàn)一個(gè)進(jìn)程讀,一個(gè)進(jìn)程寫,沒有牽涉到其他線程。
這樣的方式把10個(gè)線程串成一條流水線,主線程把指針push到第一個(gè)線程的環(huán)形隊(duì)列,第一個(gè)線程從環(huán)形隊(duì)列里面pop出來一個(gè)數(shù)據(jù)(指針),然后處理(不會(huì)修改這個(gè)指針指向的值),然后把這個(gè)指針插入到下一個(gè)線程的隊(duì)列,下一個(gè)線程也從自己的隊(duì)列里面pop一個(gè)數(shù)據(jù),然后處理,再push到下下個(gè)線程的隊(duì)列。
所以只有一個(gè)線程的隊(duì)列滿了,push不進(jìn)去會(huì)循環(huán)的push,知道能夠push進(jìn)去,或者是隊(duì)列空了,pop出來的數(shù)據(jù)null,會(huì)繼續(xù)pop,這兩種情況下會(huì)忙等,不然是不會(huì)忙等的,而這兩種情況在測(cè)試的時(shí)候很少發(fā)生,對(duì)性能影響應(yīng)該很小。
  1. template<class T>
  2. class RingQueue {
  3. public:

  4.     RingQueue() {
  5.         cout << "RingQueue::ctor" << endl;
  6.     };

  7.     virtual ~RingQueue() {
  8.         cout << "RingQueue::destory" << endl;
  9.     };

  10.     void InitQueue() {
  11.         Push_Count = 0;
  12.         Push_Index = 0;
  13.         Pop_Count = 0;
  14.         Pop_Index = 0;
  15.         memset(List, 0, sizeof (List));
  16.     }

  17.     bool Push(const T& AData) {
  18.         if (Push_Count - Pop_Count < Max_Count) {
  19.             List[Push_Index] = AData;
  20.             Push_Count++;
  21.             if (Push_Index == High_Index)
  22.                 Push_Index = 0;
  23.             else
  24.                 Push_Index++;
  25.             return true;
  26.         } else
  27.             return false;
  28.     }
  29.     T Pop() {
  30.         T result = NULL;
  31.         if (Push_Count != Pop_Count) {
  32.             result = List[Pop_Index];
  33.             Pop_Count++;
  34.             if (Pop_Index == High_Index)
  35.                 Pop_Index = 0;
  36.             else
  37.                 Pop_Index++;
  38.         }
  39.         return result;
  40.     }

  41.     long size() {
  42.         return this->Push_Count - this->Pop_Count;
  43.     }

  44. private:
  45.     RingQueue(const RingQueue& orig);
  46.     T List[524288 * 2]; //2^19  4M�ռ�
  47.     const static unsigned long Max_Count = 524288 * 2;
  48.     const static unsigned long High_Index = 524288 * 2 - 1;
  49.     unsigned long Push_Count;
  50.     unsigned long Push_Index;
  51.     unsigned long Pop_Count;
  52.     unsigned long Pop_Index;

  53. };
復(fù)制代碼

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2011-12-21 15:02 |只看該作者
還有 google 老板-雇員 找不到{:3_199:}
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP