这个程序, 有 io 和 cpu 两个各自可能是瓶颈, 如果两个动作互相等待, 那么性能也会上不去.
从 io 的角度看, 性能好的做法应该是:
首先读一批 cab, 然后删除这批 cab, 然后写一批文本文件, 从文件系统布局来看, 这样有最大的可能连续读写的机会多, 磁头来回绕的几
率最小.
用多线程/多进程来做, 就应该分为 io线程和解压线程, 中间应该有很大的 buffer.
另外, 如果不打算运行在 P3 600 之类的慢机器上的话, 我很怀疑解压 cab 这一块, 需要用多线程/多进程, 因为解压 cab 的
cpu 开销应该不大的, 只需要 io 线程和 解压线程并发就好了.
sagasw schrieb:
> 09年末的几天在改写一份代码,从单线程、单进程改到多进程,目的是想提高处理速度,
> 但是收效非常不明显,甚至还有些效率降低的问题,想跟大家咨询一下,如何改进?
>
> 我们的代码是基于Windows的(所以Linux那些技术是没法用的),主要完成这样一系列工作。
>
> 1,从cab中解压缩一系列文本文件(大约三四万个)到临时目录,解压以后大概700M,这个文本文件的数量只会越来越多。
> 2,我的程序解析(动作a)文本文件,判断是否满足一定的条件,然后需要注册一些信息到注册表中(动作b)。
> 3,从临时目录中删除(动作c)。
>
几方面:看cpu的cache miss怎么样,写操作是怎么样的,有没有读写依赖。Windows注册表应该是带锁的,把要写Windows注册表的
东西放到自己的本地队列里面,结束的时候用一个线程把这两个队列里面的东西写进去就可以了。
On Jan 4, 12:34 am, sagasw <sag...@gmail.com> wrote:
> 磁盘IO只有几个地方,1)解析开始时读取读入所有内容。2)解析出错时写log。
> 1)的时间相比整个解析需要的时间要短很多,基本上不需要优化。2的时间应该也非常短,因为最后写出来的log不过就十几k。
> 如果解析结果成功的话,是不需要写log的。
> 而且为了尽可能减少磁盘操作,也去掉了删除文件这个动作,速度一样没有改进。
>
> 解压cab是我提的一个多余条件,实际上它在这次优化是不需要考虑的一个单独过程。主要操作就是这个
> *"程序解析(动作a)文本文件,判断是否满足一定的条件,然后需要注册一些信息到注册表中(动作b)"*
>
> 现在主流的台式机机型应该都是双核了吧(什么p3
> 600客户那里不可能有的),我的疑问就是,对于双核机器,单进程单线程的应用改成多进程多线程并发,IO很少主要是cpu运算,应该有一定的速度提高,可结果 是非常不明显,
> 准备build一个安装版本,做一次完整比较。
>
> ------------------------------------
> C++, Lua, living in Dalianhttp://sunxiunan.com/http://twitter.com/sagasw
> ------------------------------------
>
> 2010/1/4 pvoid <fredche...@gmail.com>
sagasw schrieb:
> 磁盘IO只有几个地方,1)解析开始时读取读入所有内容。2)解析出错时写log。
> 1)的时间相比整个解析需要的时间要短很多,基本上不需要优化。2的时间应该也非常短,因为最后写出来的log不过就十几k。
有测试短很多吗? 测试是开机之后第一次读取, 还是第二次读取?
> 如果解析结果成功的话,是不需要写log的。
> 而且为了尽可能减少磁盘操作,也去掉了删除文件这个动作,速度一样没有改进。
>
> 解压cab是我提的一个多余条件,实际上它在这次优化是不需要考虑的一个单独过程。主要操作就是这个
> *“程序解析(动作a)文本文件,判断是否满足一定的条件,然后需要注册一些信息到注册表中(动作b)”*
>
> 现在主流的台式机机型应该都是双核了吧(什么p3
> 600客户那里不可能有的),我的疑问就是,对于双核机器,单进程单线程的应用改成多进程多线程并发,IO很少主要是cpu运算,应该有一定的速度提高,可结果是非常不明显,
> 准备build一个安装版本,做一次完整比较。
microsoft 的 gimage 程序, 就是 cpu bound 代码和 io bound 代码在一个线程内串行, 结果 cpu 用不
满, 硬盘也用不满, 速度也不理想, 你的程序不会也是如此吗 ?
一方面是经验的问题。
另一方面,做好profiling才是解决问题之道。
performance的问题千奇白怪,做profiling比经验可靠一万倍。
--
Cheers,
Oliver Yang
Twitter: http://twitter.com/yangoliver
Blog: http://blog.csdn.net/yayong
--------------------------------------------------------------------
An OpenSolaris Developer
以前曾经因为硬盘每秒钟读的能力不够, 想过, 用一堆的 usb hub, 接200个 u 盘来增加每秒钟读的能力 :)
以前曾经因为硬盘每秒钟读的能力不够, 想过, 用一堆的 usb hub, 接200个 u 盘来增加每秒钟读的能力 :)
我觉得呢, 已经做好的程序, 分析瓶颈, profiling 是不二之道.
如果还处于设计阶段, 就需要有判断能力了, 哪些地方多半是不值得花力气的, 哪些地方要留好 scale up 能力的, 免得做完了再来改, 就
比较吃力了.
On Jan 5, 10:23 am, Kenny Yuan <yuankain...@gmail.com> wrote:
> 某些设计良好的总线协议+设备应该能差不多达到,USB的设备,我个人还没听说过有不打折的,一般还是大折扣
>
> 附件是某个差劲的串行信号眼图。
>
> 2010/1/5 Tinyfool <tinyf...@gmail.com>
>
>
>
> > 关键问题是,总线够不够,理论上当然没问题,但是实际上会有哪个硬件可以达到这个需求的要求么?我怀疑
>
> > 另外,用这么复杂的方法的话,确实不如ssd,或者把缓存做好点之类的
>
> > 2010/1/5 Kenny Yuan <yuankain...@gmail.com>
>
> >> USB设备的稳定性让人怀疑这种方案能不能行
>
> >> 而且USB设备的多级串联问题很多,200个也快达到设备数量的上限了(256),不知道能不能真的都接上
> >> 这么多设备去分本来就不大的总线带宽(480 MBit/sec,实际上至少打8折,打4-6折的下位芯片都挺多的),速度上也不会太强
> >> 每秒的IO操作数量经过了几级HUB之后下降得也很厉害
> >> 还有一个有意思的现象:在常用的Win平台下,200个U盘是没法同时使用的(没有盘符了,设备会列出,但是驱动器不显示)
>
> >> SSD倒是能够解决你的问题 :)
>
> >> 2010/1/5 redsea <red...@gmail.com>
>
> >>> 以前曾经因为硬盘每秒钟读的能力不够, 想过, 用一堆的 usb hub, 接200个 u 盘来增加每秒钟读的能力 :)
>
> >> --
> >> Kenny Yuan
> >> C++, UI, LISP, MMA, Psychology and Automobile.
> >> BLOG: CS巴别塔(Computer Science Babel)
> >> URL1:http://csbabel.wordpress.com/
> >> URL2:http://blog.csdn.net/yuankaining/
>
> > --
> > Tinyfool的开发日记http://www.tinydust.net/dev/
> > 代码中国网http://www.codechina.org
> > myTwitter:http://twitter.com/tinyfool
>
> --
> Kenny Yuan
> C++, UI, LISP, MMA, Psychology and Automobile.
> BLOG: CS巴别塔(Computer Science Babel)
> URL1:http://csbabel.wordpress.com/
> URL2:http://blog.csdn.net/yuankaining/
>
> eye.png
> 93KViewDownload
你这示波器采样得有10Gb吧?
On Jan 5, 10:23 am, Kenny Yuan <yuankain...@gmail.com> wrote:
> 某些设计良好的总线协议+设备应该能差不多达到,USB的设备,我个人还没听说过有不打折的,一般还是大折扣
>
> 附件是某个差劲的串行信号眼图。
>
On Jan 5, 10:55 am, Tinyfool <tinyf...@gmail.com> wrote:
> 程序员用示波器,无敌了...
>
> 2010/1/5 Shuo Chen <giantc...@gmail.com>
>
> > 你这示波器采样得有10Gb吧?
>
> > On Jan 5, 10:23 am, Kenny Yuan <yuankain...@gmail.com> wrote:
> > > 某些设计良好的总线协议+设备应该能差不多达到,USB的设备,我个人还没听说过有不打折的,一般还是大折扣
>
> > > 附件是某个差劲的串行信号眼图。
>
> --
Kenny Yuan schrieb:
> USB设备的稳定性让人怀疑这种方案能不能行
> 而且USB设备的多级串联问题很多,200个也快达到设备数量的上限了(256),不知道能不能真的都接上
> 这么多设备去分本来就不大的总线带宽(480 MBit/sec,实际上至少打8折,打4-6折的下位芯片都挺多的),速度上也不会太强
主板有好多个 usb 口, 可以每个口接 40 个 :)
当初的需求, 每个记录大概只有20个字节, 但是每秒钟可能有几十万个请求, 内存不够大, 存不下上百G 的数据.
> 每秒的IO操作数量经过了几级HUB之后下降得也很厉害
> 还有一个有意思的现象:在常用的Win平台下,200个U盘是没法同时使用的(没有盘符了,设备会列出,但是驱动器不显示)
当然用 linux, 想着 fs 都不用, 直接在 raw 设备上工作.
记录可能一天只更新一次, 但是要读很多次.
> SSD倒是能够解决你的问题 :)
ssd 的 iops 可能都不够 :)
主板有好多个 usb 口, 可以每个口接 40 个 :)
当初的需求, 每个记录大概只有20个字节, 但是每秒钟可能有几十万个请求, 内存不够大, 存不下上百G 的数据.
当然用 linux, 想着 fs 都不用, 直接在 raw 设备上工作.
记录可能一天只更新一次, 但是要读很多次.
ssd 的 iops 可能都不够 :)
Kenny Yuan schrieb:
> 几十万的话USB肯定不行,USB的IO操作都是论ms的,而且默认root hub只有一个(除非你再外接PCI2USB)
ms 只是 latency 而已吧 ? 几个 ms 的 latency 可以接受, 只要吞吐够就可以了.
硬盘其实是 iops 支持不了这么多的吞吐啊.
> 单个Intel的SSD有3万还是5万的IOPS来着?(E,不是M)
> PCI Express的SSD能有近10万的IOPS
> 再加上内存做cache,也差不多了
>
> 如果这个都满足不了的话,应该去找用内存做存储设备的厂商来帮忙
> 但有个问题值得注意:这个问题有没有别的解决方案?一定要这样解决么?(有种坏味道在蔓延)
本来用 x86 机器, 上 32G 内存做 cache, 后面用 ssd, 应该没有问题的.
只是, 老板提出要用 network processor, 那东西容易卖高价, 那个板子只有 512m 内存, 容量太小了, 存储设备的
iops 不够, 就不行了. 板子还只能做 pcie 的 slave, 不能做 master; 唯一的一个 sata 口好像又不支持
port multiplier, 我只能想出这个主意了.
在上个公司写过一些异步的代码,感觉和最早学习写windows的消息循环是一样的,想成一个状态机就简单了。对于有些实在不支持异步的api,再用线
程去包装一下放到异步循环里。
On Jan 5, 8:41 am, 莫华枫 <longshank...@gmail.com> wrote:
> 最近跟着老许 <http://blog.csdn.net/xushiweizh>做并发,学习到几个要点。
> longshank...@gmail.comhttp://blog.csdn.net/longshanks/
> wave开通
如果考虑dns这种应用
一般域名有十几个字节
www.google.com
ip记录有一条或多条,大部分是ip条,只考虑ipv4,每个ip是4个字节
加起来是20个左右的字节
如果先用完美哈希函数(
就是没有冲突的哈希函数,也就是,函数 H 将 N 个 KEY 值映射到 M 个整数上,
参见 http://blog.csdn.net/chixinmuzi/archive/2007/08/05/1727195.aspx
)
离线计算域名的并生成hash函数
那么,线上对于大部分域名只需要保存一个char[4] ipv4的数组就可以了(对于多ip的,可以用另外形式保存,并在此作标志位)。
完美哈希函数的缺点是不方便动态生成这个函数,所以需要外加一个缓冲区来应对更改,并定期重新生成。
查询的方式便是
查缓存 -》 计算hash 得到 offset -》 ip_array[offset] -> 返回ip,或继续查找多个ip
这种方式的好处就是在小内存上,缓存到的东西更多。
最后感谢 http://www.douban.com/people/changsheng/ 提供完美哈希函数的思路
域名的应用没有办法完美 hash 的, 量太大了, 而且是动态的.
加上要上控制策略, 之前的代码是一遍扫描, 同时针对多个 section 计算出多个 hash 值, 例如 www.google.com, 一
趟扫描, 其实计算了 www, www.google, google.com 几个 hash 值的.
jiang yu schrieb: