最近要写一个多线程的应用,需要从几十块磁盘中读取数据,每次只将5块盘中的数据进行加工整合,而且磁盘的读取都是随机的,不是顺序的。加工后需要将结果写入一个大的存储中,N个T。
原来我写的是单线程的,速度好慢1分钟只能处理3G左右或者不到。业务做起来相当的费时费力,leader叫我改多线程,一时间没有好的设计,总是有一个坎过不了,leader还给我列出了高数,算算极限时间,呵呵。
两天的时间里,我在不停的想挖想,代码敲哇敲,没有认真的设计下,一番失败后,痛定思痛,先设计在写代码。
设计中,我针对N个磁盘开了N的读线程,N>=24,一个写线程,一个管理线程。每个磁盘中我将各自跳转的位置加到各自的队列里面。每个读线程设定了20个缓冲,先读线程中 不断的对这20个缓冲进行填充。
写线程 在写线程中有20个缓冲,由管理线程不断的去填充。写线程在循环中 将可用的缓冲写入目标磁盘。
管理线程,会根据条带中需要的磁盘来进行定位,从N个磁盘中取出5个,将需要的数据取出来进行异或校验。然后从可用的写缓冲中获取一个,进行设置。
昨天设计好,换了半天来试验测试。24个磁盘2个T的数据量,写入一个10多T的存储中 花费了2.5小时。一下子速度提升好多。
历史的经验教训,一定要详细的规划设计好。