性能測試工具的 Coordinated Omission 問題

很早之前就看過 Gil 大神的一篇文章 Your Load Generator Is Probably Lying To You - Take The Red Pill And Find Out Why岛心,里面提到了性能測試工具 coordinated omission 的問題来破,但當時并沒有怎么在意。這幾天有人在我們自己的性能測試工具 go-ycsb 上面問了這個問題忘古,我才陡然發(fā)現(xiàn)徘禁,原來我們也有。

什么是 coordinated omission

首先來說說什么是 coordinated omission 問題髓堪,對于絕大多數(shù) benchmark 工具來說送朱,通常都是這樣的模型 - 啟動多個線程,每個線程依次的發(fā)送 request干旁,接受 response驶沼,然后繼續(xù)下一次的發(fā)送。然后我們記錄的 latency 通常就是 response time - request time争群。這個看起來很 make sense回怜,但實際是有問題的。

一個簡單的例子祭阀,當我們去 KFC 買炸雞(或者也可以來個高大上的 - 去星巴克買咖啡)鹉戚,然后我們排在了一個隊伍后面鲜戒,前面有 3 個人专控,開始 2 個人都好快,30 秒搞定遏餐,然后第三個墨跡了半天伦腐,花了 5 分鐘,然后到我了失都,30 秒搞定柏蘑。對于我來說,我絕對不會認為我的 latency 是 30 秒粹庞。而是會算上排隊的時間 2 x 30 + 300咳焚,加上服務時間 30 秒,所以我的總的時間耗時是 390 秒庞溜。這里不知道大家看到了區(qū)別了沒有革半,就是市面上大多數(shù)的性能測試工具,其實用的是服務時間流码,但并沒有算上等待時間又官。

再來看一個例子,假設我們需要我們的性能測試工具按照 10 ops/sec 的頻繁發(fā)送請求漫试,也就是我們希望每 100 ms 發(fā)送一個六敬,前面 9 個請求每個請求都是 50 us 就返回了,但第 10 個請求持續(xù)了 1 s驾荣,而后面的又是 50 us外构。我們可以明顯的看到普泡,在 1 s 那個時候,系統(tǒng)出現(xiàn)了卡頓审编,但這時候我們其實只有 1 個請求發(fā)上去劫哼,并沒有很好的對系統(tǒng)進行測試。

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 還是沒解決上面說的第二個問題炸枣,如果系統(tǒng)真的出現(xiàn)了卡主,測試客戶端仍然會跟著卡主弄唧,因為是同步發(fā)送請求的适肠。在網(wǎng)上搜索了一下,看到了一篇 Paper Coordinated Omission in NoSQL Database Benchmarking候引,里面提到了將同步改成異步的方式侯养,也就是說,我每次的任務是一個 Future澄干,首先根據(jù) target 按照頻率發(fā) Future 就行逛揩,至于這個 Future 啥時候完成,后面再說傻寂。而且因為是異步的息尺,所以并不會卡主后面的請求。因為這個代碼是 Scala 的疾掰,我看 Java 已經(jīng)夠吃力了搂誉,所以也就懶得深入了。

Go YCSB

那么具體到 go-ycsb静檬,我們如何解決這個問題呢炭懊?我現(xiàn)在唯一能想到的就是利用 Go 的 goroutine并级,按照一定的頻率去生成 goroutine,執(zhí)行測試侮腹。當然 Go 自身也會有調度的開銷嘲碧,這里也需要排除。如果要測試的服務出現(xiàn)了卡頓父阻,就會導致大量的 Goroutine 沒法釋放愈涩,最終 OOM。雖然這樣子看起來比較殘暴加矛,但這才是符合預期的履婉。

這個只是一個想法,具體還沒做斟览,一個原因就是懶毁腿,另一個原因是不同于其他語言,Go 的 goroutine 其實天生就能開很多苛茂,所以通常我都是上千并發(fā)進行測試的已烤,假設我們有 1000 個并發(fā),按照 1 ms 一次的頻率妓羊,其實也就等同于每個 Goroutine 依次發(fā)送了胯究。當然,有總比沒有好侍瑟,如果你對這塊感興趣唐片,歡迎給我們提交 PR丙猬,或者給我發(fā)郵件詳細討論 tl@pingcap.com涨颜。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市茧球,隨后出現(xiàn)的幾起案子庭瑰,更是在濱河造成了極大的恐慌,老刑警劉巖抢埋,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弹灭,死亡現(xiàn)場離奇詭異,居然都是意外死亡揪垄,警方通過查閱死者的電腦和手機穷吮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來饥努,“玉大人捡鱼,你說我怎么就攤上這事】崂ⅲ” “怎么了驾诈?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵缠诅,是天一觀的道長。 經(jīng)常有香客問我乍迄,道長管引,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任闯两,我火速辦了婚禮褥伴,結果婚禮上,老公的妹妹穿的比我還像新娘漾狼。我一直安慰自己噩翠,他們只是感情好,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布邦投。 她就那樣靜靜地躺著伤锚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪志衣。 梳的紋絲不亂的頭發(fā)上屯援,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天,我揣著相機與錄音念脯,去河邊找鬼狞洋。 笑死,一個胖子當著我的面吹牛绿店,可吹牛的內容都是我干的吉懊。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼假勿,長吁一口氣:“原來是場噩夢啊……” “哼借嗽!你這毒婦竟也來了?” 一聲冷哼從身側響起转培,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恶导,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后浸须,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惨寿,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年删窒,在試婚紗的時候發(fā)現(xiàn)自己被綠了裂垦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡肌索,死狀恐怖蕉拢,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤企量,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布测萎,位于F島的核電站,受9級特大地震影響届巩,放射性物質發(fā)生泄漏硅瞧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一恕汇、第九天 我趴在偏房一處隱蔽的房頂上張望腕唧。 院中可真熱鬧,春花似錦瘾英、人聲如沸枣接。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽但惶。三九已至,卻和暖如春湿蛔,著一層夾襖步出監(jiān)牢的瞬間膀曾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工阳啥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留添谊,地道東北人。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓察迟,卻偏偏與公主長得像斩狱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扎瓶,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理爆阶,服務發(fā)現(xiàn)狭园,斷路器算利,智...
    卡卡羅2017閱讀 134,657評論 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架规揪,建立于...
    Hsinwong閱讀 22,403評論 1 92
  • 在我們談論協(xié)程(Goroutines)泄漏之前,我們先看看并發(fā)編程的概念乍赫。并發(fā)編程處理程序的并發(fā)執(zhí)行。多個連續(xù)流任...
    范彬2017閱讀 6,332評論 0 7
  • 11陆蟆、為了讓視覺錘更有效雷厂,需要重新尋找語言釘 紅十字會起初叫“傷員救濟國際委員會”,但這些詞(傷員叠殷、救濟改鲫、國際、委...
    翟旭說閱讀 1,055評論 1 4
  • 感恩上午陰天無雨,度過了忙碌的一上午像棘。 感恩對面新開的博愛丸子店稽亏,讓我在錯過午飯時間的時候,還能吃上熱氣騰騰的丸子...
    米朵天天閱讀 118評論 0 3