搜索
查看: 14702|回复: 107
收起左侧

[讨论] 再谈杀软性能测试

  [复制链接]
B100D1E55
发表于 2017-10-23 12:40:06 | 显示全部楼层 |阅读模式
本帖最后由 B100D1E55 于 2017-10-23 13:09 编辑

设计一个好的杀软,不仅是权衡误报和检出率的艺术,更是权衡性能影响和防护强度的艺术。若不是因为客户机的性能限制,我们大可每人都运行一个红伞云端的APC鉴定引擎达到传说中99.99%的侦测率。
各大测评机构的报告中总少不了杀软性能测试,但有心人会发现这些测试的结果可能自相矛盾。我在几个月前曾经写了一篇文章吐槽了一下这些性能评测自相矛盾的地方,这些结果甚至也和一些用户的日常使用体验相互矛盾。在这里我以AVC的评测细则为例来谈谈为什么我认为现在不少杀软性能评测是不合理的。

杀软对性能影响的本质
首先来谈谈为什么杀软会对本机性能造成影响。运行杀软的电脑和不运行杀软的电脑的本质区别在于计算机运行的指令不同,这里的不同不仅包含指令的量,也包含指令给计算机带来的额外影响(side-effect)

可以将一台计算机看作一个纯粹的图灵机,而计算机运行的本质是CPU(读写头)读取指令并根据指令在储存器(纸带)上进行数据操作。假定这个读写头在单位时间内能读取并运行固定量的指令,那么一个程序对性能的影响可以简单通过其运行时间来衡量。然而在当代计算机和操作系统的构建中我们不能做这样的假设。在不同时间点上CPU的指令吞吐量极为不同,而储存器也并非像单条纸带模型那样简单,而是一个多层级的模型,每个层级访问所花费的时间都不同。

个人认为:
因此估算杀软的性能的简单公式可以是:杀软子程序的指令总数/指令的吞吐速率   其中指令吞吐率随应用场景变化而变化
而杀软子程序的指令数又可以表示为:杀软子程序的指令数*触发这些子程序的次数

假设用户A经常使用的一个程序长度为10000条指令。杀软可能会给这个运行队列额外插入1000条指令,这额外的1000条指令即是性能影响的来源。这些额外指令可能是杀软实时监控扫描查询的指令,可能是HIPS的某个钩子进入了杀软自己的检查函数的指令,甚至可以是杀软对普通进程注入的子程序带来的额外指令。

当然,我们不能简单的做算数来衡量这个影响(例如有人可能会觉得计算 杀软指令数/总指令数 即可知道杀软的性能影响),从处理器微架构的角度来看不同指令带来的性能影响不同,不同指令组合带来的性能影响也不同。例如一个写的很烂的杀软,在每次库查询都导致缓存失误/分支预测失误,其带来的性能延迟可能比指令数相同但不引发这些失误的杀软差得多。此外,如果一个杀软大量额外指令是浮点指令(例如像Cylance这种神经网络模型检测不做quantization少不了浮点指令),那么在一些情况下可能比大量指令是整数指令带来的性能拖累来得小(因为操作系统内核和普通用户运行的程序往往包含整数指令,而浮点指令有自己的处理单元和寄存器,对整数程序性能影响较小)。此外,当代操作系统往往是多个进程并发,处理器也有多个核芯和复杂的调度系统,这又带来了很多影响性能的复杂因素。

根据上文两个公式,理想情况下应当整理归纳安全软件的指令热点(hotspot),测算运行这些热点的时长,最后在不同场景下收集这些热点指令触发的频度。这方法放在公司内部优化代码上是可行的,放在第三方测试机构那里显然不太现实。

非内部人士测试杀软性能,终归需要化繁为简,用最简单却又最贴近实际情况的手段来评估。

AVC性能测试的问题

AVC的主要性能测试手段在于仅衡量运行时间。从上文我们可以看到这个方法并不可靠。举一个简单的例子,很多杀软性能评测喜欢测试文件拷贝,这个是一个很典型的IO瓶颈的场景——即处理器本身不是这个测试的性能瓶颈,真正的瓶颈在于磁盘速度,而处理器大多情况下处在闲置状态。

avc.jpg
AVC测试细则暗示除了PCMark分数外,其很可能只测算了运行一些特定应用的耗时

我们来考虑一个很简单的例子:场景A中,用空闲状态的电脑拷贝500个exe文件,在没有杀软的机器A上可能处理器占用率是5%,运行时间是30s,在装有杀软的机器B上由于实时扫描的缘故可能占用率会达到30%,但由于磁盘是主要瓶颈,运行时间仍旧可能为30s (cpu等待磁盘的那些空余资源可以用来运行杀软的指令)。

这样一来,装杀软和没装杀软难道性能一样了吗?这个悖论说明测时间的方法在一些情况下并不靠谱

考虑场景B,在用户电脑上满载的情况下(例如跑游戏)的时候拷贝同样的文件,这时候我们在场景A空闲状态下测的结果就完全没意义了。因为CPU已经接近满载,杀软带来的额外CPU占用将以拖累运行时间的形式体现出来。然而AVC并没有模拟场景B这种情况,只提供运行时间的区别就没有很好的参考价值了。

更加合理的测量方法

更加合理的测量方法很直白,那就是测量系统的资源占用率和应用耗时两个维度。

总的而言,杀软单位时间内带给系统的额外负担将以系统额外的占用率体现出来。这个占用率可能是CPU的占用,也可能是内存子系统的(例如磁盘读取、内存页面交换等)占用,更可以是内存量的占用。最简单的方法就是在一些设计好的场景中,利用一些工具(例如Windows Performance Toolkit)对杀软的进程占用率、磁盘IO占用等进行侦测。

但是这种纯粹软件侦测有时候可能会漏掉一些额外的因素。例如一些杀软还在其他进程中注入了自己的子程序,如果只侦测杀软进程本身占用率,可能会忽略掉其他进程这些额外的性能负担(对于HIPS监控点密集、带有回滚备份的杀软更可能有这种问题)。
这里有两个选择:一个是统计所有相关进程的占用率和运行时间,另一种,也是我认为某种意义上可能更加简单的,即测算CPU的能耗(当代的计算机都提供了接口查询CPU和内存子系统的实时功率)。可能有人会问为什么不是功率而是功耗,这是因为现实中的计算机有功耗上限。如果一台电脑已经处在满载,那么CPU功率已经触顶,杀软带来的额外负担将无法通过功率差来体现。

根据初中物理的公式 功=功率*时间,CPU能耗即综合了占用率和时间两个维度的信息。测量CPU能耗的好处在于它包括了几乎所有可能的性能影响并且不大会对测试机性能数据产生污染。不过,能耗数据的噪声很大,因此需要一个场景应用运行足够长的时间和足够多的次数才能获取一个统计学上有意义的数值。

额外的复杂因素

这里更加复杂的是应用场景的设计。从第一部分的公式可以看到,杀软的额外指令数=杀软子程序的指令数*触发这些子程序的次数
触发这些子程序的频度在不同应用场景可能大不相同。例如有一些扫描向杀软可能只挂钩文件访问函数并且扫描引擎活动率高,而另一些HIPS向杀软更多监控syscall,而文件扫描监控比较轻量。那么在IO负载高的情况下,前者可能会有较大性能拖累,而在一些特定的应用场景下可能后者会出现较大性能折损。怎样合理的设计应用场景才能覆盖用户日常使用的情况也是一门学问。

简单的测试
普通用户也至少能进行一些简单的能耗测试。例如在支持Connected Standby的Windows移动设备上,Windows提供了内置的性能测量工具sleepstudy,可以导出系统空闲状态的能耗。在年初创意者更新后更是可以看到每个进程对应的能耗。

sleepstudy.png
举个简单例子。我在年初的时候曾经测试过火绒的待机能耗。安装后的第一次待机火绒进程能耗极高,说明其系统占用率高,后续待机发现进程能耗显著降低。这可以侧面反映出火绒做了一定的缓存工作,因此在缓存结束后(第一次待机之后)性能影响降低,相应的能耗也显著降低。

之前也测过其他一些厂商的产品只能说不测不知道一测吓一跳。有一些很多用户认为的轻量级产品待机时并没那么“轻量”,能耗甚至和系统一些主要进程有的一拼。当然由于年代久远各家杀软都在更新,而我当年的测试数据也遗失了,这里就不再口水。感兴趣且有条件的用户可以自己测一测,看看自己测得的结果是否和自己平时使用的情形吻合,是否和AVC的测试结果相差很大。
参考其他一些第三方测试也有一些帮助。例如VB100去年还测算了每个杀软的内存占用和CPU占用,不过他们只考虑了扫描的场景。总而言之,各个评测的结果相互补足对方在场景设计/测量方法上的不足可以帮助用户得出更有参考价值的结论。

打造真正的高性能程序

微软的一篇博客其实是一个很好的例子。为了打造更加省电的浏览器Edge,他们非常严谨地测算了不同场合下CPU和GPU的占用率,甚至在一些非常细节的地方进行了省电优化(例如减少Edge工具栏图标的动画帧数以减少GPU的负载),不知道杀软开发者们是否也这么做了。


至少据我所知ESET有做一些性能优化,他们明确表示过对其自家扫描引擎进行了各种细致的优化(包括将一些函数和子程序替换成手写的汇编语句以进一步提升性能),而sleepstudy的待机测试中其ekrn.exe能耗也几乎可以忽略不计。但是我个人经验表明一些特定应用可能会触发ESET高占用率(例如运行大的编译项目)从而拖累整机性能,这再一次说明了测试场景设计的重要性。同样产品,不同用户的体验可能大不相同,毕竟应用场景不同

cpu-utilization-1024x327.png
微软Edge周年更新前/后的CPU占用率对比

我记得很早以前有人提到说测杀软性能应该看游戏的帧率。虽然看上去这个论点很荒谬,但仔细想想实际上有那么一点道理。游戏让计算机处于高负载状态,而此时杀软的性能拖累将从程序额外耗时体现出来,即帧延迟。当然这终归只是一种特定的应用场景罢了。


以上都是这几天无聊的时候想的一些东西,欢迎讨论。

P.S. 这篇几天前就写完了,但是因为某些原因发的时候被吞了好几次,心好累





评分

参与人数 9分享 +3 魅力 +1 人气 +9 收起 理由
翼风Fly + 1
ELOHIM + 1 版区有你更精彩: )
屁颠屁颠 + 3 + 1 + 1 版区有你更精彩: )
潘基炫 + 1 版区有你更精彩: )
fireherman + 1 感谢提供分享

查看全部评分

驭龙
发表于 2017-10-23 13:42:15 | 显示全部楼层
其实我就一直喜欢Edge,性能上速度快占CPU也比较理想,安全性也可以的
iamLMH
发表于 2017-10-23 13:42:24 来自手机 | 显示全部楼层
本帖最后由 iamLMH 于 2017-10-23 13:46 编辑

快速的看完两遍,很好奇楼主的行业或者兴趣是不是IC这方面的,因为噪声这词出现在信号方面多,计算机那个比喻和微机或单片机的很相似。
如有不对请轻锤_(:з」∠)_
我就是XXX
发表于 2017-10-23 14:29:41 | 显示全部楼层
本帖最后由 我就是XXX 于 2017-11-5 17:43 编辑

终于看到这样的文章了,一款软件,尤其是安软这类的,对于机器的性能影响也是权衡这款软件是否优秀的重要指标之一。

PS:像现在的很多游戏,后期根本没有太多优化,对硬件占用极大。像《巫师3》这样的优化好的大作真的不多了。
cloud01
头像被屏蔽
发表于 2017-10-23 15:08:18 | 显示全部楼层
现在的电脑性能提高很多,软件也提高很多资源占用,貌似相对性能提升并不是很多。顶帖
HEMM
发表于 2017-10-23 16:18:42 | 显示全部楼层
驭龙 发表于 2017-10-23 13:42
其实我就一直喜欢Edge,性能上速度快占CPU也比较理想,安全性也可以的

但素它的插件支持也是醉了,且很多网站支持不便,还是得IE........

强烈谴责WD的性能和EMET集成的不人性化设置,嘻嘻~
驭龙
发表于 2017-10-23 16:24:24 | 显示全部楼层
HEMM 发表于 2017-10-23 16:18
但素它的插件支持也是醉了,且很多网站支持不便,还是得IE........

强烈谴责WD的性能和EMET集成的不人 ...

我上的网站Edge都支持的不错,我基本上不用插件
Jerry.Lin
发表于 2017-10-23 16:38:59 | 显示全部楼层
本帖最后由 191196846 于 2017-10-23 16:40 编辑

正想问问这个问题呢

以前看AV-TEST 和AV-Comparative 发现他们的性能测试的结果--对ESET这家差距非常大

一般是AV-TEST 倒数 AV-C 正数(AV-TEST 的performance score 和AV-C的 performance test)

想问下相比之下哪一家会比较准些呢

以我自己使用ESET的经验来看,确实挺流畅的呢……
HEMM
发表于 2017-10-23 16:48:16 | 显示全部楼层
驭龙 发表于 2017-10-23 16:24
我上的网站Edge都支持的不错,我基本上不用插件

有些网站必须用其他浏览器,EDGE可能是过于安全,淘汰了些旧的支持。这些死网站就不更新你说肿么办?
插件爆内存,IE也是插件醉了,大微把口子拉的异常的紧,制作第三方插件的人无法做到最好支持。这个平台喜欢严格把控~
bbs2811125
发表于 2017-10-23 17:28:04 | 显示全部楼层
性能测试以自己感受为主,防护率个人测试无法拿到大量样本所以看一下各家的测试结果也是一个简单的参考。但是性能测试的环境往往是无法复制的,所以我一般看测评都习惯性的忽略掉性能测试。亲自上手试试看是否顺手、是否卡机——新版的Avira我的使用体验就非常糟糕
对于误报也是如此,对于电脑小白最好就建议少用或不用破解,并且用误报控制相对好的杀软;而对于有经验的老司机误报高点影响倒是不大,毕竟可以根据自身的经验决定是否应该运行。
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛|卡饭乐购| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 苏ICP备07004770号 ) GMT+8, 2020-1-20 00:19 , Processed in 0.136943 second(s), 21 queries .

快速回复 返回顶部 返回列表