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
爬 阅读(2562)
评论(5) 编辑 收藏 引用 所属分类:
life