BT 下载器下载的安装文件被杀毒软件卡住的问题
我们代理的游戏狂刃 客户端用 NSIS 制作成一个 exe 安装包,有 1G 左右。一开始,我们是购买又拍和七牛这种的云服务分发客户端。从用户的下载速度来看可以满意,但费用有点高。所以我们打算另外开发一个采用 BT 协议的下载器,这也是 MMO 客户端分发给客户的标配了。
rainfiel 同学在一个多月前主动领了这个任务,对 BT 的开源库考察一番后使用 libtorrent 开发这个下载器。
最近在测试的时候发现了一个问题,成功下载完安装包后,如果系统安装有 卡巴斯基 或 360 等杀毒软件,就会在调用 ShellExecute 第一次运行安装包时被卡住很久(长达几分钟)。用进程管理器查看,发现是杀毒软件一直在扫描刚下载的 exe 文件。
一开始怀疑是由于某些 bug 导致文件被锁死了。然后试图退出下载程序,重新启动新进程去打开安装包,这样不解决问题。但是,如果把下载文件用程序复制一遍再运行文件的拷贝却不会被卡住。
有网友说可能是 Windows 的 Alternative Data Streams 引起的。我们 google 了一下,找到了这样一篇文章 。文中提到去掉 ADS 的方法也是复制一遍文件,但是通过工具检测却没有发现 ADS 的痕迹。
最后检查 libtorrent 的配置参数才发现,原来是因为它默认把下载文件创建成了 Sparse file 。根据 wikipedia 的说法,Loading executables on Windows (exe or dll) which are sparse takes a much longer time, since the file cannot be memory mapped and not cached. 。这应该是根本原因了。
只是几分钟的扫描时间也过长了点,为什么杀毒软件需要几分钟时间才能加载分析完一个 1G 左右的 exe (远超过复制一遍文件的时间),我猜测是因为 NSIS 其实只是把一组文件打了个包,而杀毒软件期望解包分析包内的文件导致的。杀毒软件若实现的不恰当,解包过程针对 sparse file 随机读性能很低,导致了扫描时间远大于复制一遍文件再扫描的时间。
Comments
Posted by: smile | (8) November 11, 2016 11:32 PM
Posted by: 业务云笔记 | (7) October 15, 2013 10:21 AM
Posted by: 好笔头业务云笔记 | (6) September 26, 2013 10:42 AM
Posted by: www | (5) September 10, 2013 10:31 AM
Posted by: wstc | (4) September 9, 2013 07:23 PM
Posted by: mz | (3) September 9, 2013 03:57 PM
Posted by: dwing | (2) September 9, 2013 10:30 AM
Posted by: Smite | (1) September 8, 2013 10:51 PM