activemq 性能测试_ActiveMQ性能测试
activemq 性能測試
我們使用ActiveMQ作為消息傳遞層–發送大量需要低延遲的消息。 通常它可以正常工作,但是在某些情況下我們已經看到性能問題。 在花了太多時間測試我們的基礎結構之后,我想我已經學到了有關ActiveMQ的一些有趣的東西:它可能真的很慢。
盡管一般來說,消息通過ActiveMQ傳輸不會出現問題,但是我們注意到,當我們收到大量消息時,就會開始看到延遲。 好像我們正在達到某個消息速率限制–當我們超過該消息速率限制時,消息將被延遲,僅在該限制處傳遞。 從ActiveMQ貼上消息的時間戳起,我們可以看到代理正在快速接受消息,但是發送給使用者的時間有所延遲。
我設置了一個測試工具來復制問題,這很容易。 但是,我在測試系統中測得的吞吐量似乎很低:每秒2500條消息。 對于一個非常簡單的消費者而言,基本上什么也不做,因此沒有理由將吞吐量如此之低。 為了進行比較,在完全相同的設置中使用定制的消息傳遞層,我們達到了每秒15,000條消息。 第二個難題是在生產中,我們看到的消息速率僅為250消息/秒。 為什么測試系統比生產系統快10倍?
我開始嘗試消除可能性:
- ActiveMQ上的并發負載沒有區別
- 更改生產者流量控制設置沒有影響
- 更改使用者的預取限制只會使行為變得更糟(我們將數據寫入非持久性主題,因此默認的預取限制很高)
- 似乎沒有組件受到帶寬或CPU限制
作為實驗,我嘗試將使用者與代理人和生產者移動到同一臺服務器上:消息吞吐量增加了一倍。 將使用者移動到具有更高ping時間的服務器上:消息吞吐量驟降。
這導致了一個洞察力:ActiveMQ代理的行為恰好好像“一次”發送給消費者的數據量受到限制。 我特別意識到,網絡上未確認的數據量似乎受到限制。 如果連線較長,則數據到達使用者的時間更長,而確認返回的時間也更長:因此,代理每秒發送的數據更少。
這種行為突出了我們的第一個錯誤。 我們使用Spring Integration處理用戶端的消息路由,在一年前對Spring進行了升級,我們在該版本中獲得的更改之一是更改了消息驅動通道適配器確認JMS消息的方式。 以前我們的消息是自動確認的,但是現在確認模式是“事務處理”的。 這意味著我們必須在將確認發送給代理之前完成整個消息處理鏈。
這就解釋了為什么生產系統(對消息有用的工作)具有比測試系統低得多的數據速率。 不僅是消息必須經過1毫秒的ping時間,消費者還沒有發送完確認消息,直到消費者完成了對消息的處理,這可能還要花費幾毫秒的時間。
但是更糟糕的是,交易確認似乎完全阻止了用戶預取數據! 我們通過事務處理確認所看到的吞吐量是一次在線上一個未確認的消息。 如果我們將消費者移到更遠的地方,我們的吞吐量將直線下降。 即,代理在收到之前的確認之前不會發送新消息。 與其代替消費者從經紀人那里預取數百條消息并依次處理它們,而是經紀人耐心地一次發送一條消息! 難怪我們的表現糟透了。
通過spring集成配置更改可以輕松解決此問題。 在測試系統中,我們的消息吞吐量從2500消息/秒增加到10,000消息/秒。 不錯的進步。
但是我很好奇,我們仍然看到經紀人的行為,好像網上未確認數據的數量受到限制嗎? 因此,我將使用者移動到相距較遠的服務器上進行測試。 結果? 是! 代理仍然限制網絡上未確認的數據量。 即使自動確認了消息,對于經紀人將不會看到確認而發送的數據量也有一個硬性上限。
帽子的大小呢? 約64KB。 是的,在2018年,我的消息傳遞層一次只能傳輸64KB的數據。 當經紀人和消費者超級親密時,這很好。 但是,將消費者與代理之間的ping時間增加到10ms,我們的消息速率將下降到5,000消息/秒。 在100毫秒的往返行程中,我們的消息速率為500消息/秒。
這種行為感覺就像應該控制預取限制:但是,我們看到的消息(不超過60條1kB消息)比預取限制所暗示的要少得多。 到目前為止,我還沒有找到有關“消費者窗口大小”是否存在的任何確認。 也沒有任何特別修改行為的方法。 使用方上TCP套接字緩沖區大小的增加將傳輸中的數據量增加到大約80KB,但沒有增加。
我很困惑,很多人使用ActiveMQ,并且肯定有人會注意到像這樣的數據上限嗎? 但是,也許大多數人使用ActiveMQ時,消費者和經紀人之間的ping時間非常短,根本就不會注意到它?
但是,人們必須在全球分布式部署中使用ActiveMQ –為什么沒人能看到這一點?
翻譯自: https://www.javacodegeeks.com/2018/09/activemq-performance-testing.html
activemq 性能測試
總結
以上是生活随笔為你收集整理的activemq 性能测试_ActiveMQ性能测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抠图的边缘怎么处理(抠图的边缘怎么处理a
- 下一篇: jdk8 bug_JDK Bug系统浪费