測試載入器
壓力器
壓力器使用Table Store內部使用的壓力測試工具進行資料的批量並發寫入,底層基於Table StoreJava SDK的BatchWrite操作完成。
預分區工具
使用Table Store內部使用的壓力測試工具,配置好表名和分區數等資訊,進行表格的自動建立和預分區。
速率統計器
增量的即時消費速率統計基於Tunnel Java SDK完成,在傳入的Callback中加入下圖中類似的速率統計邏輯,進行速率和消費總行數的即時統計。
樣本
private static final Gson GSON = new Gson();
private static final int CAL_INTERVAL_MILLIS = 5000;
static class PerfProcessor implements IChannelProcessor {
private static final AtomicLong counter = new AtomicLong(0);
private static final AtomicLong latestTs = new AtomicLong(0);
private static final AtomicLong allCount = new AtomicLong(0);
@Override
public void process(ProcessRecordsInput input) {
counter.addAndGet(input.getRecords().size());
allCount.addAndGet(input.getRecords().size());
if (System.currentTimeMillis() - latestTs.get() > CAL_INTERVAL_MILLIS) {
synchronized (PerfProcessor.class) {
if (System.currentTimeMillis() - latestTs.get() > CAL_INTERVAL_MILLIS) {
long seconds = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - latestTs.get());
PerfElement element = new PerfElement(System.currentTimeMillis(), counter.get() / seconds, allCount.get());
System.out.println(GSON.toJson(element));
counter.set(0);
latestTs.set(System.currentTimeMillis());
}
}
}
}
@Override
public void shutdown() {
System.out.println("Mock shutdown");
}
}
測試方案
使用Tunnel進行資料同步時,在單Channel間是串列同步(串列是為了保障使用者資料的有序性),不同Channel間是相互並行的。在增量情境下,Channel數和表的分區數是相等的。由於Tunnel的整體效能和表的分區數有很大的關聯性,所以在本次的效能測試中,將主要考慮不同分區數(Channel數)對於Tunnel增量的同步速率的影響。
測試單位
本次測試主要包含以下幾項指標。
說明
本次效能測試不是產品能力的極限,是從實際使用角度出發進行的效能測試。
測試結果
該部分主要概述各個情境下的指標測試結果,測試的細節可以參見測試細則部分。
QPS和延遲
下圖展示的是各個情境下每秒同步的資料行數和同步1000行資料所需的時間。從圖中我們看出QPS的增長和分區數的增加呈線性關係。
在本次測試中,單機同步64分區情境下,將千兆的網卡成功打爆(參見測試細則部分),導致只有57萬的QPS。兩台機器對64分區進行同步後,平均QPS成功達到了78萬行左右,約等於單機-32分區情境下(42萬)的兩倍速率。而在最後的兩台機器-128分區情境下,Tunnel增量同步處理的QPS也成功達到了100萬行。

系統資源消耗
下圖展示的是各個情境下CPU和記憶體的消耗情況,CPU基本上和分區數呈線性關係。
在單機-單分區情境下,消耗的CPU為0.25個單核CPU。2台機器-128個分區的情境下,當同步QPS達到100萬行時,消耗的CPU也僅為10.2個單核CPU。從記憶體消耗方面看。在分區數較少時,CPU和分區數呈線性關係,而在分區數增加較多(32個和64個)時,單機記憶體消耗基本維持在5.3 GB左右。

網路總頻寬消耗
下圖展示的是增量同步處理消耗的總頻寬,從圖中我們可以看出頻寬和Channel數的線性關係(略單機-16分區情境)。
在單機-64分區情境下,我們可以看到頻寬總消耗為125 MBps,已經成功把千兆網卡打爆,而在換成2台機器-64分區進行資料消費後,我們發現64分區真正的輸送量為169 MBps,和單機-32分區的86 MBps的兩倍近乎相等。而在兩台機器-128分區的100萬QPS情境中,總輸送量也達到了220 MBps。

總結
通過這次對於增量效能的實際測試,我們發現了單分區(或分區數較少)的速率主要取決於伺服器端的讀盤等延遲,本身機器資源的消耗很小。而隨著分區數增長,Tunnel增量的整體吞吐也進行了線性增長直至達到系統的瓶頸(本文中是網路頻寬)。最後,在單機資源被打滿的情況下,我們也可以通過添加新的機器資源進一步的提升系統整體的輸送量,有效驗證了Tunnel具備良好的水平擴充性。