性能测试工具的 Coordinated Omission 问题

很早之前就看过 Gil 大神的一篇文章 Your Load Generator Is Probably Lying To You - Take The Red Pill And Find Out Why,里面提到了性能测试工具 coordinated omission 的问题,但当时并没有怎么在意。这几天有人在我们自己的性能测试工具 go-ycsb 上面问了这个问题,我才陡然发现,原来我们也有。

什么是 coordinated omission

首先来说说什么是 coordinated omission 问题,对于绝大多数 benchmark 工具来说,通常都是这样的模型 - 启动多个线程,每个线程依次的发送 request,接受 response,然后继续下一次的发送。然后我们记录的 latency 通常就是 response time - request time。这个看起来很 make sense,但实际是有问题的。

一个简单的例子,当我们去 KFC 买炸鸡(或者也可以来个高大上的 - 去星巴克买咖啡),然后我们排在了一个队伍后面,前面有 3 个人,开始 2 个人都好快,30 秒搞定,然后第三个墨迹了半天,花了 5 分钟,然后到我了,30 秒搞定。对于我来说,我绝对不会认为我的 latency 是 30 秒。而是会算上排队的时间 2 x 30 + 300,加上服务时间 30 秒,所以我的总的时间耗时是 390 秒。这里不知道大家看到了区别了没有,就是市面上大多数的性能测试工具,其实用的是服务时间,但并没有算上等待时间。

再来看一个例子,假设我们需要我们的性能测试工具按照 10 ops/sec 的频繁发送请求,也就是我们希望每 100 ms 发送一个,前面 9 个请求每个请求都是 50 us 就返回了,但第 10 个请求持续了 1 s,而后面的又是 50 us。我们可以明显的看到,在 1 s 那个时候,系统出现了卡顿,但这时候我们其实只有 1 个请求发上去,并没有很好的对系统进行测试。

YCSB

对于第一个排队的例子,为了更好的计算 latency,YCSB 引入了一个 intended time 的概念。也就是会记录下操作实际的排队时间。它使用了一个 local thread 变量,在 throttle 的时候,记录:

private void throttleNanos(long startTimeNanos) {
    //throttle the operations
    if (_targetOpsPerMs > 0)
    {
        // delay until next tick
        long deadline = startTimeNanos + _opsdone*_targetOpsTickNs;
        sleepUntil(deadline);
        _measurements.setIntendedStartTimeNs(deadline);
    }
}

然后每次操作的时候,使用 intended time 计算排队时间:

public Status read(String table, String key, Set<String> fields,
                 Map<String, ByteIterator> result) {
    try (final TraceScope span = tracer.newScope(scopeStringRead)) {
        long ist = measurements.getIntendedtartTimeNs();
        long st = System.nanoTime();
        Status res = db.read(table, key, fields, result);
        long en = System.nanoTime();
        measure("READ", res, ist, st, en);
        measurements.reportStatus("READ", res);
        return res;
    }
}

需要注意,只有 YCSB 开启了 target,intended time 才有作用。

这也就是我当初在看 YCSB 代码的时候,一直没搞明白为啥会有两种时间,而且也不知道 intended time 到底是什么鬼,后来重新回顾了 coordinated omission,才清楚。也就是说 YCSB 通过 intended time 来计算排队时间。

但其实 YCSB 还是没解决上面说的第二个问题,如果系统真的出现了卡主,测试客户端仍然会跟着卡主,因为是同步发送请求的。在网上搜索了一下,看到了一篇 Paper Coordinated Omission in NoSQL Database Benchmarking,里面提到了将同步改成异步的方式,也就是说,我每次的任务是一个 Future,首先根据 target 按照频率发 Future 就行,至于这个 Future 啥时候完成,后面再说。而且因为是异步的,所以并不会卡主后面的请求。因为这个代码是 Scala 的,我看 Java 已经够吃力了,所以也就懒得深入了。

Go YCSB

那么具体到 go-ycsb,我们如何解决这个问题呢?我现在唯一能想到的就是利用 Go 的 goroutine,按照一定的频率去生成 goroutine,执行测试。当然 Go 自身也会有调度的开销,这里也需要排除。如果要测试的服务出现了卡顿,就会导致大量的 Goroutine 没法释放,最终 OOM。虽然这样子看起来比较残暴,但这才是符合预期的。

这个只是一个想法,具体还没做,一个原因就是懒,另一个原因是不同于其他语言,Go 的 goroutine 其实天生就能开很多,所以通常我都是上千并发进行测试的,假设我们有 1000 个并发,按照 1 ms 一次的频率,其实也就等同于每个 Goroutine 依次发送了。当然,有总比没有好,如果你对这块感兴趣,欢迎给我们提交 PR,或者给我发邮件详细讨论 tl@pingcap.com

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

推荐阅读更多精彩内容