突破性能CI

性能CI

什么是性能CI

性能CI可简单定义为CI(Continuous Integration)集成性能测试用例。主要用于监控系统运算速度、存储容量或网络I/O是否满足系统设置指标,而非发现故障。

性能测试通常包括:负载测试(Load Test)、压力测试(Stress Test)、容量测试(Volume Test)、峰值测试(Spike Test)等非功能型测试。


http://www.testingperformance.org/definitions/

性能CI的价值

性能优化的博弈

一方面,Donald Knuth告诉我们“过早的优化是万恶之源”,

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil. Yet we should not pass up our opportunities in that critical 3%. - Computer Programming as an Art(1974) P671.

当然,我并无意挑起性能狂人与设计大师们的战争,但凡有些性能优化经验的同学定能理解其中要义,过早的优化至少会带来如下问题:

  • 忽略整体设计
  • 陷入局部优化
  • 破坏可读性
  • 增加偶发复杂度

另一方面,对于遗留系统,发现性能问题往往为时已晚。会带来:

  • 定位成本高
  • 优化难度大
  • 波及影响多
  • 测试成本高

所以,我们期望做到:

  1. 开发人员专注于设计、编码
  2. 提交代码出现性能问题及时告警
  3. 可视化性能数据,并可链接到劣化代码
  4. 提供定位信息协助分析

性能CI面临的主要问题

  1. 性能用例的有效性不高

    简言之,监控的场景不能包含性能劣化路径。表现为内场表现良好,外场表现糟糕;局部性能良好,系统性能糟糕。

  2. 性能用例部署、执行时间较长

    CI要求更早、更快的反馈。性能测试受制于物理环境、仪表资源、采样周期等限制,通常自动化部署困难,用例执行时间长。

  3. 性能测试数据的稳定性

    判决让人信服的前提是准确。由于不同的构建机器、不同的部署环境、不同的用例配置、不同组件间的干扰、性能指示器数据的波动等原因,性能测试数据出很大波动性,导致难以判决劣化是由于合入代码还是波动所致。

  4. 自动化准确识别劣化点

    劣化阈值设置过大可能漏掉某些劣化点,设置过小可能产生误报,准确识别劣化点困难。另外,由于诸多约束,很多判断需要人为干预,完全自动化较困难。

解决思路与方法

通过对性能CI面临主要问题的分析,核心要解决有效性、高效性、稳定性、扩展性四方面的问题。

性能CI核心问题
  1. 提高性能测试用例的有效性
  • 业务价值驱动,识别劣化路径

    “程序的性能特质倾向高度的非直觉性”,性能优化靠猜是极其不告谱的。性能劣化路径的识别亦如此,我们需要根据系统在真实部署环境的业务场景,选择用例,确定用例部署优先级。

  • 解耦系统内不同组件间的干扰

    在一定程度上,可以对复杂系统的各个组件的性能分开验证,可以考虑牺牲一些不关注组件的真实性,换取关注组件的稳定性。

  • 自动准确识别性能劣化点并分级告警

    自动准确的识别劣化点,是判定性能CI是否有效的关键指标。需要动态找到某个阈值作为置信区间,我们可以参考异常检测方法。常见的异常检测方法有:极值分析,概率统计建模,线性回归模型,信息论模型,高维孤立点检测等。下面介绍一种实测中比较有效实时告警的方法:

    Mean(N) ± SD(N),其中N表示样本容量,Mean表示平均值,SD表示标准差。样本容量选取过去一段时间产生的样本,不能选取过去的所有样本,否则置信区间无法收敛。

    分级告警是指可以定义实时告警、触顶告警等不同级别告警。

    数据告警
    • 实时告警:以过去一段时间的样本作为实时告警模型的输入并生成置信区间,当前数据超出该区间则告警。
    • 触顶告警:以某个初始基准值作为参考,设置可以容忍的最大劣化/优化阈值并生成置信区间,当前数据超出该区间则告警。触顶告警一般用于实时告警无法捕捉到的、缓慢增加的劣化的场景,触顶告警一旦触发,预示需要启动专项优化了。
  1. 提高性能测试用例的高效性
  • 测试用例分级部署

    分级部署是指将性能测试用例分级部署在单元测试,集成测试,系统测试等不同阶段。用例间相互补充,可以更高效的利用测试资源,减少用例执行时间。

  • 测试用例并行部署

    如果测试用例部署环境充足,考虑并行部署用例,可以大大缩短用例执行时间,简化用例部署场景。

  • 不同构建按不同粒度监控

    如果做不到用户每次提交在给定的时间窗内给出执行结果,可以考虑将多次提交打包成一次构建执行,出现告警后打包提交逐单回退验证(需要部署镜像环境用于回退单验证)。

  • 寻求慢速性能指标的替代指标

    如果在用性能指示器的采样周期较长,在不影响稳定性的前提下,考虑寻求其他更快速性能指标进行替换。性能指标包括:CPU Utilization,Latency,IPC(Or CPI),Cycles,Instructions,CacheMiss.

  1. 提高性能测试数据的稳定性
  • 部分模拟环境代替真实物理环境

    真实物理环境相对于模拟环境更脆弱,更不易控制,在分级部署原则的指导下,对于不关注组件,可是考虑使用模拟环境代替真实物理环境。

  • 增加系统内其他组件的稳定性

    复杂系统是由多个组件组成,系统性能表现为它们共同作用的结果,通过打桩等手段,提高不关注组件的稳定性,有利于提高被监控组件的稳定性。

  • 增大样本容量(冗余)

    冗余是提高稳定性最常用的方法,挑战在于在样本量增加情况下,如何不增加执行时间。推荐使用Latency,IPC等指标代替CPU使用率。

  • 多维度样本参照(相关性)

    具有相关性、不同维度的性能数据相互参照,提高判定的准确性。

  • 寻求波动性能指标替代指标

    系统性越强的性能指示器(例如CPU使用率)波动性越大,考虑使用一些可被拆分、组合的指示器(例如函数时延,Cycles等)替代。

  1. 提高性能用例的扩展性
  • 抽象出框架与API接口
    良好的扩展性基于对操作的抽象、良好的分层、稳定的API接口,性能CI对日志数据的操作可以抽象为数据采集、数据处理、数据持久化、数据可视化四层,每层定义清晰的API接口,性能用例仅需要新增配置即可。

    四层结构
  • 工作环境与测试环境分离
    工作环境负责及时反馈性能劣化点,镜像环境负责对劣化点优化的验证,二者并行工作


    A/B环境

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生x阅读 15,967评论 3 119
  • 因缘际会认识了易效能时间管理课,带着孩子去人生地不熟的地方上课。一切只是为了让孩子有时间的概念,一转眼鑫宝90天践...
    LANGFANG阅读 116评论 0 1
  • 此次战争是萧道成有生以来遇到的最艰难的战争,敌人准备万全、自己临阵磨枪,虽然他满口承诺、信心满满、勇气可嘉,但在关...
    惘然生烟阅读 533评论 0 3
  • 经常发现一件事情很重要必须要做,但等到去处理的时候发现已经过了时间,内心一万只草泥马在奔腾 不是因为不想做而不去做...
    自由算法阅读 683评论 1 1