ScaleArc: 使用 sysbench 對資料庫進行壓力測試

類別: IT

ScaleArc最近租用了Percona並對資料庫流量管理產品執行各種測試。這篇文章是由Uday Sawant(ScaleArc)和我進行了基準測試的結果。你可以在這裡下載PDF 報告。

這次基準的目標是識別ScaleArc軟體自身可能的開銷和使用快取潛在的好處,對sysbench的主幹版本進行基準測試。基於這個理由,我們使用一個非常小的資料集合,這樣會更快得出測試結果,而我們都知道快取在查詢資料開銷費用很大的情況下會發揮很大的作用。我們更傾向於在接下來的話題中介紹 real-world application的好處。如果你是在Silicon Valley領域的,請務必參加這前所未有的開源鑑賞日——我很樂意在這篇文章中把我的發現與你分享。這是免費的,但由於篇幅有限,所以你得先 註冊。 我這一週也都會提供 Percona Live MySQL Conference and Expo

sysbench_image1.2

在這摘要圖中我們可以看到,依據吞吐量(只讀的基準,和讀取最多的應用的有關),ScaleArc沒有顯著的開銷,說明快取發揮了潛在巨大的好處。

sysbench_image2

這個情況和響應時間非常類似。ScaleArc沒有新增任何明顯的開銷,說明快取在響應時間上同樣發揮了巨大的好處。

如果是特定的工作負荷(這裡是只讀的sysbench),使用快取意味著大致3倍增長的吞吐量以及縮減了80%的響應時間。

總而言之,ScaleArc是一個無論在效能方面還是功能方面很好的產品。我絕對會推薦它。

關於ScaleArc for MYSQL

ScaleArc for MySQL是一個軟體應用,放置在應用程式和資料庫之間,用於改善程式的可用性和效能。它不需要修改程式或者資料庫,並提供:

  • 縱向擴充套件 - 透明的連線池和多路技術,基於TTL的透明快取,峰值保護

  • 透明橫向擴充套件 - 讀寫分離,負載均衡,查詢路由,資料拆分

  • 自動的高可用性 - 自動故障轉移

  • 實時的可行性分析

基準設定

客戶端電腦上執行像sysbench的基準測試軟體作為基準。

CPU: 2 x Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz (6核, 關閉晶片多執行緒)

記憶體:64G

我們使用兩個客戶機。兩個客戶機的結果分別繪製,因此在資料庫或者ScaleArc軟體上有相同的工作負載是可見的。

資料庫伺服器

CPU: 2 x Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz (6核, 關閉晶片多執行緒)

記憶體:64G

執行MySQL Community Edition 5.6.15

MySQL配置

sysbench_image3

資料庫的快取池特意設定為較小,這樣資料庫將會很容易產生磁碟密集型的工作負載。

請注意下面的設定在生產環境是不推薦的

sysbench_image4我們用這些設定驅動資料庫節點到峰值效能,避免任何在生產系統中可能的開銷。在典型的生產設定中,這些都沒有設定,binary logging是啟用的,這將近一步減少ScaleArc軟體的開銷。

ScaleArc軟體應用

CPU: 1 x Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz (6核, 關閉晶片多執行緒)

記憶體:64G

執行ScaleArc for MySQL 3.0

網路

電腦之間通過10G網路連線。

[[需要為伺服器增加ScaleArc的詳細配置]]

測量

所有的的測量工作都在一個完全放置在記憶體中的非常小的資料庫上進行。

sysbench_image5

在這些基準中,我們期望資料庫和ScaleArc都是計算密集型的。如遇到磁碟密集型的工作負載,在這個基準測試中ScaleArc將會有更好的表現。假如查詢是更昂貴的(他們不得不訪問硬碟儲存),開銷的百分比會更小,查詢快取將更大。

我們測量三種不同的設定,都有隻讀和讀寫的用例。他們是:

  • 直接連線到資料庫

  • 通過ScaleArc連線資料庫,ScaleArc僅作為一個通過器(因此它對MySQL有線協議來說是一個負載均衡器,所有MySQL的機制仍然有效)。請注意,這個設定在實際的生產環境中是沒有意義的。這個設定的目的是表明使用ScaleArc的潛在開銷和暴露ScaleArc軟體的潛在限制。[[你能說說在現實世界中會發生什麼嗎?例如:你將用ScaleArc均衡多臺伺服器的負載,這將提升效能並允許你彙集多臺伺服器的效能]]

  • 通過ScaleArc連線資料庫,允許ScaleArc快取資料。ScaleArc是基於TTL的快取,意味著一個讀查詢的結果將快取在ScaleArc中。如果讀查詢在快取到期前再次請求,這個查詢將不再訪問資料庫伺服器,而是直接讀取ScaleArc中的快取。一旦查詢快取的計時器到期,查詢將再次訪問資料庫。當然,快取僅適用於讀操作,而不是在一個顯式事務中(開啟自動提交併且沒有執行START TRANSACTION語句)。正因為如此,在只讀用例中,在快取基準期間我們使用–oltp-skip-trx引數。在這種情況的基準測試中,TTL設定為1小時,因為我們想讓ScaleArc軟體的快取飽和。對一些應用來說1小時的TTL是不切實際的,但是對另一些應用來說有些查詢甚至可以設定1天的TTL。[[你能新增ScaleArc的TTL從1秒到199天]]在這個用例中,我們想要測量快取的效能,因此我們想在整個基準測試期間,查詢被快取,甚至系統在遇到很少的查詢時,顯示出潛在的收益。

基於TTL的快取

注意到快取的有效期是用TTL值控制是很重要的-其他的都是無效的,[[請看最後的註釋]]因此在查詢結果改變而快取沒有到期的時候,是有可能讀取到舊資料的。對很多應用來說讀取到獨立的舊資料是沒有問題的,對一個正規的非同步的從伺服器,當它的資料滯後於主伺服器(它總是在有些地方滯後的)時,會發生讀取舊資料的情況。否則,ScaleArc的快取就非常類似於MySQL的查詢快取,MySQL的查詢快取不會遇到讀取舊資料的問題,它有一個簡單的失效機制(如果表被寫入資料,屬於給定表的快取將被重新整理)。當MySQL快取正在重新整理的時候,查詢快取的互斥將生效,甚至在那些正在讀取的資料塊上。因為互斥,內建的查詢快取很普遍的變成了效能瓶頸。ScaleArc的快取是不會遇到這個問題的。

注意到ScaleArc在預設的情況下是不快取任何資料是很重要的。另外,除了等待TTL過期之外,還有一些其他方法可能讓快取失效。

  • 呼叫API(你能呼叫一個API使用查詢模板規則清除快取)

  • 查詢註釋(你能在查詢的前面放置/*wipe*/的註釋,用於重新整理快取)

  • 不快取(你能傳送註釋/*nocache*/,對特定的查詢不快取其查詢結果)

只讀
Sysbench吞吐量

sysbench_image6

在少量執行緒區域(32個以內),由於經過ScaleArc我們發現TPS值有著顯著的下降。這沒有什麼可大驚小怪的,其原因是網路損耗。因為scalearc是一個軟體應用,它增加了資料庫與應用程式之間的跳數,這樣便產生了延遲。如果執行緒數比較多(32個以上),它的影響開始變得越來越小,但效能幾乎相同,令人印象非常深刻。這意味著伴隨著對這些機器的優化[[你可以新增“在那些跑最多應用的機器上”的理念]],ScaleArc只增加了非常小(幾乎測不到)的開銷。

Sysbench響應時間

sysbench_image7

這張圖包含了前面基準測試的響應時間。在4096執行緒的時候,閱讀真的很難,系統過載,響應時間超過了最大的吞吐量區。因為有多個數量等級,響應時間在這張圖是不可讀的。

sysbench_image8

接下來的這張圖和上面的圖是相同的,除了Y軸被限制在250ms,因此在上面可見的區域在這張圖上就不可見了。我們看到的開銷和吞吐量圖幾乎是一樣的,這就意味著ScaleArc自身引入了不可估量的低延遲(這解釋了用例中的差異,當並行性很低的時候)。通常連線資料庫服務的應用程式都大量使用了多執行緒(在MySQL中,每個查詢總是使用一個單獨的執行緒,換句話說,就是在查詢內部沒有並行性)。當通過ScaleArc連線資料庫的時候,在32個執行緒以上時,延遲會更低(基於CPU的數量,確切的臨界點是有差異的)。其中的原因是ScaleArc本身使用一個事件迴圈來連線MySQL,因此在高併發時,能安排傳送到MySQL的流量。

CPU利用率

sysbench_image9

最後但並非最不重要的,此圖包含了不同的設定的CPU利用率。左側顯示直接連線到資料庫的CPU利用率,右側顯示通過ScaleArc連線的CPU利用率。在這兩個用例中,資料庫伺服器的CPU都是瓶頸。可以看到客戶端節點的CPU空閒狀態超過75%(為了提高可得性僅繪製客戶端1的資料,實際上客戶端2的資料是相同的)。從32執行緒開始,在資料庫伺服器上藍色條(user CPU利用率)相對於綠色條(sys CPU利用率)是比較高的。從64個執行緒開始,實際上CPU的空閒狀態是0,直到系統過載。在右側,我們可以看到,ScaleArc在這個負載的時候仍然有50%的CPU空閒,這就意味著實際上我們能通過ScaleArc在另外執行一組相同的基準測試,知道CPU完全被佔用。在這兒,我們在討論sysbench在3000 tps的情況。一個更有趣的事情要注意的是ibd比較高的系統時間。這也是因為ScaleArc連線到資料庫的方式(見前面的圖表)。

sysbench_image10這些現成來自於單一的客戶端,這意味著在CPU利用率50%的時候ScaleArc能每秒解析84000條語句,這是令人影響深刻的。請注意,在這種情況下ScaleArc軟體是按照工作負載型別調整的,這意味著我們有更多的查詢處理執行緒。在遇到快取的時候,我們有更多的快取處理執行緒。

快取對只讀工作負載的影響

Sysbench吞吐量

下面的圖表將對比使用快取和不使用快取的情況

sysbench_image11

前面的TPS圖包含了每秒的讀取次數(因為我們使用了–oltp-skip-trx引數進行測量),因此在前面的設定中大致3000個事務產生了42000次讀取(每個事務14次讀取)。在圖表的左側,可以看見綠色的帶快取的吞吐量,在圖表的右側,可以看見紅色(直接連線資料庫)的和藍色(通過ScaleArc連線資料庫)的不使用快取的吞吐量。可見快取大幅的提升了速度,但是當ScaleArc超載(8192個客戶端執行緒,每個客戶端4096的執行緒)時,效能變得有些不一致,這是可以理解的,考慮到ScaleArc在很少的核心上是怎樣執行的。在圖表中,圓點是半透明的,這意味著色彩是明亮在具有多個樣本的區域。即使在過載情況下,兩個客戶端的大多數樣本仍然在每秒100K+讀取次數的區域,這意味著即使在重負載時,效能下降的也非常優美。

Sysbench響應時間

sysbench_image12

在工作負載無快取的情況下,當系統過載時,響應時間非常大導致不可讀。但是過載的響應時間是可見的,使用快取不會使響應時間變得更差。

sysbench_Image13

在工作負載無快取的情況下,這張圖表是前面圖表的放大版。Y軸最大值為100ms。從這張圖可見,快取有助於提高響應時間,有更低的併發和更好的吞吐量。這是可以理解的,當快取命中的時候,ScaleArc可以直接返回結果,客戶端(在我們的例子中是指sysbench)不需要連線資料庫,因此節省了來回和資料庫處理的時間。另外值得一提的是資料來自於記憶體中[[我們不能明白接下來的部分]],這並不重要,如果我們命中了ScaleArc的資料庫快取.當ScaleArc使用快取的時候,響應時間更低,因為避免了資料來回的時間和潛在的資料庫工作(比如分析SQL語句)時間。這意味著快取對資料的訪問是有利的即使資料庫本身有快取池。當相對昂貴的查詢如集合和查詢在硬碟上時,快取的幫助是最有效的。

CPU使用率

sysbench_image14

與之前的情況類似,上圖顯示了各部件的CPU使用率。在快取工作負載的情況下,客戶端本身被更多的使用(因為它得到的響應越快,形成的通訊速度也必須更快)。有了這種工作負載,當只用一個客戶端時,我們會達到CPU的效能瓶頸。資料庫也同樣有趣。有快取時,它基本不使用CPU。這是因為如果一個查詢通過哦快取獲取資料,就不需要通過資料庫呼叫,因此資料庫的CPU使用率很低。換言之,使用快取有助於解除安裝資料庫。如果解除安裝在ScaleArc圖上可見,那麼,當快取使用時,託管ScaleArc的伺服器的CPU使用率會很高。對於這個基準測試,ScaleArc軟體被調整來處理快取工作負載,也就意味著更多的快取處理執行緒。

讀寫操作

對於讀寫操作基準,我們必須建立oltp_nontran.lua,除了在事務之外讀取且只在事務中寫資料外,它與olrp.lua的sysbench基準測試一樣,因此,快取會對讀取有影響。剩下的基準設定與只讀用例一樣。[[你能補充說,如果某人使用多個MySQL實現讀寫分離,ScaleArc的效能相對於直接到資料庫的會有顯著改善嗎?]]

Sysbench吞吐量

sysbench_image15

與只讀用例類似,在低併發情況下,ScaleArc的工作負載來自額外的網路往返。在最優併發時,工作負載幾乎不可測量(點繪基本上相互貼近)。

Sysbench響應時間

sysbench_image16

sysbench_image17

這與只讀用例的響應時間非常相似。同樣的,第二幅圖是第一幅的放大版,最大為250毫秒。

CPU使用率

sysbench_image18

CPU使用率圖顯示,在這種情況下,資料庫伺服器的CPU是一個瓶頸。有趣的是,ScaleArc使用的CPU比只讀用例更少。這是可理解的,因為現在一個事務也包含寫操作,這導致在資料庫端花銷更大,但在ScaleArc端,他們只是到路由的語句。

快取對讀寫工作負載的影響

現在測量快取是很有趣的,因為工作負載不再僅僅是大量的讀操作,而且還有大量的寫入操作。

sysbench_image19

對於30000次的讀操作,我們得到了8500次的寫操作。顯然快取不如只讀工作負載中一樣有效,因為寫操作是不能被快取的,而且當基準執行緒在進行寫操作的時候是不能同時處理讀操作的。請注意這意味著大致25%的流量是寫操作,一個典型的帶有從伺服器的橫向擴充套件應用是沒有如此高的讀寫比例的。

Sysbench吞吐量

sysbench_image20

第一張圖顯示了在中的吞吐量方面,快取仍然是有效的。

Sysbench響應時間

sysbench_image21

sysbench_image22

與只讀時的例子類似,快取對提升響應時間也有效,因為它降低了讀取時對工作負荷的需求。

CPU utilization

sysbench_image24

這個測試確實給了不開快取時資料伺服器的CPU不小壓力。快取啟用時,與只讀時的情況類似,客戶端的工作量有所增加(但不多),但資料庫伺服器的CPU使用率明顯下降。在最後一行,ScaleArc在使用快取時的CPU的利用率雖然還是稍高,但相比下來它仍然不是很高。

這些試驗顯然表明,即使寫比例高我們依舊能夠從快取中受益。

結論
工程總是在做著正確的權衡。如果一個人想要的功能要一個協議級的負載平衡器,像ScaleArc,其代價應該考慮7層的開銷和抉擇後帶來的工作量。ScaleArc的工程團隊做了大量工作為了最大限度地減少這種開銷。ScaleArc本身已經是可調的了,它可以很好的服務不同的負載型別(如果快取很關鍵,ScaleArc可以調整開啟快取——如果查詢重寫,ScaleArc也可以隨之調整)。

ScaleArc: 使用 sysbench 對資料庫進行壓力測試原文請看這裡