filecache 32m
內存映射文件 處理md5,io cpu都降下來了
254file 6.54g
多線程
線程數 cpu_count()
cpu變為38% io減為 讀取16,348 寫入 2,000
[2013-04-19 12:09:02] check is ok!
[2013-04-19 12:10:06] check is ok!
64s
單線程
[2013-04-19 11:57:00] is ok
[2013-04-19 11:57:41] is ok
41s
-----------------------------------------------------------------------------------
多線程 增加運行線程數
cpu_count()*2;
線程分布給cpu親緣性 設置一下
[2013-04-19 13:23:49] check is ok!
[2013-04-19 13:24:14] check is ok!
25s
cpu 占用53%最多峰值
cpu_count()*4;
線程分布給cpu親緣性 設置一下
[2013-04-19 13:27:57] check is ok!
[2013-04-19 13:28:19] check is ok!
22s
cpu90%峰值
cpu_count()*8;
線程分布給cpu親緣性 設置一下
[2013-04-19 13:30:44] check is ok!
[2013-04-19 13:30:51] check is ok!
7s
cpu100%峰值
cpu_count()*16
[2013-04-19 13:33:23] check is ok!
[2013-04-19 13:33:31] check is ok!
8s
cpu100%峰值
單線程:
2081 FILE
11.9G
[2013-04-24 15:32:28] is ok
[2013-04-24 15:41:31] is ok
9分鐘
磁盤到了讀取的極限 20-30m/s
cpu 未充滿 20%左右
io為瓶頸
總結:采用內存映射文件,一次性加載文件到內存塊計算md5 降io和io cpu損耗
采用線程和cpu親緣性,充分利用釋放出來的cpu計算能力。
實驗記過254哥文件6.5g 4核機器 開啟32哥線程分布到各個cpu 可以得到7秒的計算結果,比上面單線程未優化提升6倍速度,比上面多線程未優化提升9倍
一個解決方案:
一個文件: 分段md5, 特征為 md51|md52|md53……
一個連續讀取文件的線程,
每個md5作為一個任務計算。
讀取持續性讀取,到一個連續性內存,分段任務給線程池分段計算,算完全體統計一下,
如果過程中出現里面局部有一個是失敗的,那么整個數據都不用驗證了,其他任務也不用繼續了,直接認為失敗,這個概率很高。減少計算一大堆,切分粒度中一點別切太多片。每個任務結束的時候都釋放內存回收使用。
io在獨立線程, 計算md5在線程池,這樣徹底分離,重復內存持續復用。
posted on 2013-04-19 13:44
爬 閱讀(2596)
評論(5) 編輯 收藏 引用 所屬分類:
life