1. 程式人生 > >EQueue 2.0 效能測試報告

EQueue 2.0 效能測試報告

前言

最近用了幾個月的時間,一直在對EQueue做效能優化。到現在總算告一段落了,現在把一些優化的結果分享給大家。EQueue是一個分散式的訊息佇列,設計思路基本和阿里的RocketMQ一致,只是是用純C#寫的,這點大家應該都知道了。

之前EQueue 1.*版本,訊息持久化是使用SQLServer的,之前也想做效能測試,但發現效果不理想。所以放棄了測試,轉為專心對訊息持久化這塊進行優化。之前的持久化設計是通過Sql Bulk Copy的方式非同步批量持久化訊息。但是當資料庫伺服器和Broker本身部署在不同的伺服器上時,持久化訊息也會走網絡卡,消耗頻寬,影響訊息的傳送和消費的TPS。而如果資料庫伺服器部署在Broker同一臺伺服器上,則因為SQLServer本身也會消耗CPU以及記憶體,也會影響Broker的訊息傳送和消費的TPS。所以,經過考慮後,最終決定狠下心來,採用終極方案來持久化訊息,就是通過本地順序寫檔案的方式來持久化訊息。支援非同步刷盤和同步刷盤兩種方式。採用檔案儲存後,EQueue可以輕易的支援大量訊息的堆積,你的硬碟有多大,就能堆積多少量的訊息。

到現在為止,經過不斷的測試,功能上我認為已經比較穩定了,效能也基本滿足我的要求。另外,EQueue單純的訊息持久化模組(MessageStore)以及TCP通訊層的效能是非常高的。MessageStore我設計時,儘量獨立一些,因為我發現寫檔案和讀檔案的設計是通用的,以後可以被複用到其他專案,所以我設計時,確保持久化模組的通用性;而TCP通訊層,也是也是一樣,通用和高效。目前我自己寫的通訊層(在ECommon類庫中)可以輕鬆把網絡卡壓滿。

關於EQueue 2.0檔案持久化版本的具體設計,我下一篇文章會具體介紹,本文主要是想分享一下EQueue 2.0的效能測試結果。為大家在使用到線上環境前做架構選型給出效能方面的參考。

測試目的

測試單個EQueue Broker伺服器的傳送訊息、消費訊息的效能。

硬體環境

全部採用UCloud雲主機進行測試。一臺Broker,4臺Client機器。Broker的配置為8核16G記憶體,120G的SSD硬碟,Client的配置為4核8G記憶體,普通硬碟。所有伺服器作業系統均為Windows Server 2012。具體如下圖所示:

測試場景1

1臺生產者、1臺消費者、1臺Broker,非同步刷盤,每隔100ms刷一次盤。

訊息大小(位元組)  傳送TPS  消費TPS  傳送網路吞吐量  消費網路吞吐量 Broker磁碟寫入吞吐量  Broker CPU
Broker記憶體 Producer CPU Producer記憶體 Consumer CPU Consumer記憶體
 128  56400  56400  10MB  13MB  13MB  35%  35%  30%  12%  30%  13%
 512  41000  41000  22MB  25MB  25MB  32%  35%  30%  13%  30%  13%
 1024  29000  29000  30MB  34MB  34MB  32%  35%  27%  12%  25%  13%
 2048  20000  20000  41MB  43MB  43MB  30%  35%  27%  12%  25%  13%

測試場景2

2臺生產者、2臺消費者、1臺Broker,非同步刷盤,每隔100ms刷一次盤。

訊息大小(位元組)  傳送總TPS  消費總TPS  傳送總網路吞吐量  消費總網路吞吐量 Broker磁碟寫入吞吐量  Broker CPU Broker記憶體 Producer CPU Producer記憶體 Consumer CPU Consumer記憶體
 128  50000  50000  8.6MB  11MB  11MB  46%  35%  19%  13%  19%  13%
 512  40000  40000  21MB  24MB  24MB  48%  35%  19%  13%  19%  13%
 1024  31200  31200  32MB  35MB  35MB  47%  35%  19%  13%  19%  13%
 2048  23000  23000  48MB  51MB  51MB  45%  35%  19%  13%  19%  13%

結束語

一些說明

  1. 因為EQueue的Producer傳送訊息時,本地會有快取佇列。所以Producer傳送訊息採用的執行緒數對傳送TPS並無什麼影響。所以,我上面的測試中並沒有考慮傳送執行緒數;
  2. Broker的記憶體使用我們是可以控制的,我測試時配置為當記憶體使用到達40%時,開始自動清理記憶體,所以上面的測試結果,記憶體使用都不會超過40%;
  3. 因為消費者從Broker拉取訊息時,EQueue的設計在記憶體足夠的情況下,總是會將需要消費的訊息快取在非託管記憶體,所以消費者拉取訊息時,總是從記憶體獲取訊息的。所以Broker沒有磁碟的讀取;且由於這個設計,消費者消費訊息不會成為瓶頸,假設當前Broker上存在大量訊息可以被消費,然後我們開一個Consumer,那消費速度是非常快的,1K大小的訊息,10W TPS沒有問題。所以,訊息的消費不會成為瓶頸,除非消費者自己內部處理訊息的程式碼太慢。這種情況下,消費者需要增加Consumer機器,確保消費速度跟得上傳送速度。
  4. 上面的測試結果是基於UCloud的虛擬機器,由於我沒有物理機,所以不知道物理機上的效能。有條件的朋友我非常希望能幫忙測試下哦。像這種重要的分散式訊息佇列伺服器,是應該部署在物理機上的。另外,我測試時,Producer和Consumer伺服器使用的是普通的虛擬機器,儘量真實的模仿一般應用的虛擬機器配置。

測試結論

從上面的測試結果可知:

  1. 隨著訊息體的不斷增大,傳送訊息的TPS不斷降低,一般我們的訊息大小為1KB,在有兩個傳送者客戶端時,EQueue的傳送訊息TPS大概為31000。我覺得效能上應該滿足大部分需求場景了。如果一個系統平均每秒產生31200個訊息,一天是86400秒。那一天的訊息量是27億。這個數字已經很大了,呵呵。相信國內大部分網站都沒有這麼大的規模。當然我們不能這麼簡單的來算,實際的系統肯定有高峰期的,實際大家要根據自己的系統的高峰期傳送訊息的TPS來衡量具體要部署多少臺EQueue Broker伺服器。線上環境使用時,我們不能把Broker壓滿的,要給其有足夠的處理餘量,比如高峰期傳送TPS為10W,每臺Broker最大能承受3W,那我們至少要分配6臺機器,確保應付可能出現的高峰。這樣才能應付特別高的高峰。
  2. 大家可以看到上面的資料中,開兩個生產者,兩個消費者,訊息大小為2KB時,Broker的進出總網路流量為99MB,這個資料還沒有到達千兆網絡卡的總流量(125MB)。目前,我只申請了5臺機器,4個客戶端機器。但實際我們的應用的叢集,客戶端機器應該會更多,我不知道當客戶端機器增加時,能否把Broker的網絡卡壓滿,如果壓不滿,則說明Broker本身的設計實現已經到達瓶頸了,也就是說EQueue Broker本身設計上可能還有效能優化的空間。
  3. 在上面的效能資料情況下,所有伺服器的CPU,記憶體使用穩定,符合預期。在穩定性方面,我在個人筆記本上同時傳送和消費訊息,連續執行1天沒有問題;也有其他網友幫忙測試了穩定性,執行幾天也沒有問題。各項指標均正常。所以我認為目前EQueue的穩定性應該問題不大了。
  4. Broker的訊息持久化,採用的是順序寫檔案的方式;目前的測試結果來看,完全還沒達到寫檔案的瓶頸;如果我們單獨測試寫檔案模組的效能,可以輕鬆達到300MB每秒,而我們的千兆網絡卡最大流量也只有125MB。所以,訊息持久化不會再成為很大的瓶頸了,但寫檔案的響應時間本身也會影響Broker對外的TPS,目前的響應時間為60ms,我感覺是比較慢的,不知道是否是虛擬機器的原因,不知道物理機上會如何。我覺得SSD硬碟,寫入檔案的響應時間不會這麼慢的。
  5. 最後一點,當Broker的客戶端增加時,Broker的CPU的使用也會相應增加一點。這個可以理解,因為TCP長連線的數量多了一倍。而生產者和消費者伺服器的CPU記憶體的使用都非常穩定,符合預期。

相關推薦

EQueue 2.0 效能測試報告

前言 最近用了幾個月的時間,一直在對EQueue做效能優化。到現在總算告一段落了,現在把一些優化的結果分享給大家。EQueue是一個分散式的訊息佇列,設計思路基本和阿里的RocketMQ一致,只是是用純C#寫的,這點大家應該都知道了。 之前EQueue 1.*版本,訊息持久化是使用SQLServer的

Mono 3.2.3 TCP吞吐效能測試報告

在前幾天簡單地測試了一下Mono 3.2.3 TCP處理的穩定性,有同學問Mono 3.2.3的TCP處理性有怎樣,以下是針對Mono 3.2.3TCP在吞吐方面的效能測試.主要測試分兩種場分別是連線互動密集度高和低的兩種情況的處理效能指標. 測試環境描述 服務端:    cpu:e4300 1.7g

Ansible API 2.0測試

default roo ges ria toolbar bsp ict eve uem 因項目需要使用到ansible api,根據修改官方文檔提供的使用範例,經過多次測試,現將能用的代碼分享給大家,大家只需根據自己的實際環境修改該代碼即可。 官方文檔:htt

測試報告效能測試報告模版1

  目錄 一、文件目錄 二、模版下載 三、文件內容 四、測試環境軟硬體配置資料獲取 一、文件目錄 二、模版下載 我的資源下載地址:【測試報告】效能測試報告模版1 三、文件內容 四

Odoo:全球第一免費開源ERP權威效能測試報告完整版(絕對珍藏)

Odoo平臺簡介   Odoo(以前叫OpenERP)是世界排名第一的開源ERP系統,最早由比利時一家公司開發,經過十幾年發展,目前全世界Odoo的使用者超過2百萬人,Odoo被翻譯成幾十種語言,Odoo社群活躍的開發人員超過5000人。從2012年開始,美國著名IT雜誌Info

jmeter介面效能測試2)----效能測試全過程

依然使用上一篇文章的介面 在上一篇文章我們已經添加了http請求、斷言、檢視結果樹。在開始之前我們在新增聚合報告(執行緒組》新增》監聽器》聚合報告)。 除錯好介面後開始執行效能測試 1.設定執行緒組:根據實際需要設定 1. 執行緒數:虛擬使用者數。一個虛擬使用者佔用一個程序或執

HBase基準效能測試報告

作者:範欣欣 本次測試主要評估線上HBase的整體效能,量化當前HBase的效能指標,對各種場景下HBase效能表現進行評估,為業務應用提供參考。本篇文章主要介紹此次測試的基本條件,HBase在各種測試場景下的效能指標(主要包括單次請求平均延遲和系統吞吐量)以及對應的資源利用情況,並對各種測試結果進行分析。

Uiautomator2.0生成測試報告

最近學習uiautomator2.0,原來可以直接生成測試報告,同時也比較美觀,下面請看。 在Android Studio中新建 一個專案 在app/下的build.gradle下,dependencies中增加對Uiautomator的支援: { ... andr

推薦書單2.0測試工程師進階之路

18年年初,寫過一篇部落格:推薦書單1.0:測試工程師成長之路。裡面包含了軟體測試基礎方法論、UI自動化測試、效能測試、python、協議、資料庫、中介軟體、泛產品經理相關的一些書單。 今年我也算看了一些書,型別比較雜,散文小說、雞湯、邏輯思維、社科等等型別,技術類的大概佔比一半左右,其中中介軟體和後臺相關

效能測試報告---參考資料整理

轉 https://www.cnblogs.com/fnng/archive/2011/11/20/2255161.html轉 https://www.cnblogs.com/veggiegfei/p/6109412.html

達爾文流媒體伺服器(Darwin Streaming Server)(DSS)併發效能測試報告

【轉自】http://blog.csdn.net/xiejiashu/article/details/40919565 原標題:《Darwin Streaming Server效能測試報告》 為了驗證Darwin Streaming Server在流媒體點播上的效能,Eas

apache kafka系列之效能測試報告(虛擬機器版)

測試方法 在其他虛擬機器上使用 Kafka 自帶 kafka-producer-perf-test.sh 指令碼進行測試 Kafka 寫入效能 嘗試使用 kafka-simple-consumer-p

100億MongoDB瓦片出圖 效能測試報告

測試報告word版下載:http://pan.baidu.com/s/1o8SI8Y2 1. 測試目的 本測試報告是LINUX平臺上,SuperMap iServer 9D對放於不同的MongoDB伺服器上的100億張MongoDB瓦片釋出為地圖服務後的出圖測試,來驗證M

Spark升級到2.0測試stream-kafka測試報java.lang.NoClassDefFoundError: org/apache/spark/Logging錯誤

- 最近從Spark 1.5.2升級到2.0之後,執行測試程式碼spark-stream-kafka報以下錯誤: java.lang.NoClassDefFoundError: org/apache/spark/Logging at java.lang.ClassLo

jmeter(二十六)生成HTML效能測試報告

效能測試工具Jmeter由於其體積小、使用方便、學習成本低等原因,在現在的效能測試過程中,使用率越來越高,但其本身也有一定的缺點,比如提供的測試結果視覺化做的很一般。 不過從3.0版本開始,jmeter引入了Dashboard Report模組,用於生成HTML型別的視覺化圖形報告(3.0版本的Dashbo

C#分散式訊息佇列 EQueue 2.0 釋出啦

前言 最近花了我幾個月的業餘時間,對EQueue做了一個重大的改造,訊息持久化採用本地寫檔案的方式。到現在為止,總算完成了,所以第一時間寫文章分享給大家這段時間我所積累的一些成果。 昨天,我寫過一篇關於EQueue 2.0效能測試結果的文章,有興趣的可以看看。 為什麼要改為檔案儲存? SQL

【直播預告】:Java Spring Boot開發實戰系列課程【第12講】:Spring Boot 2.0效能監控實戰與Actuator機制解析

主講人:徐雷(阿里雲棲特邀Java專家)徐雷,花名:徐雷frank;資深架構師,MongoDB中文社群聯席主席,吉林大學計算機學士,上海交通大學碩士。從事了 10年+開發工作,專注於分散式架構,Java Spring Boot、Spring Cloud、MongoDB、Redis。 喜歡專研技術問題,擅長講

Android 效能測試報告工具 battery-historian試用

Github 地址: https://github.com/google/battery-historian  Getting Started If you are new to the Go programming language: Follow the in

Numa對MySQL多例項效能測試報告

目的 由於MySQL採用了執行緒模式,對於NUMA特性的支援並不好。如果單機執行多個MySQL例項,可以將MySQL繫結在不同的CPU節點上,並且採用繫結的記憶體分配策略,強制在本節點內分配記憶體,這樣既可以充分利用硬體的NUMA特性,又避免了單例項MySQL對多核CPU利用率不高的問題。 測試環境:   

記憶體資料庫fastdb的效能測試報告

【從我原來blog搬來的】 IBM AIX 伺服器上 <一>利用SUBSQL介面手工進行測試 ----------<Some test Data>----------------------------------------- 1.Record(i