日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ActiveMQ:了解内存使用情况

發(fā)布時(shí)間:2023/12/3 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ActiveMQ:了解内存使用情况 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正如最近的一些郵件列表電子郵件和從Google返回的許多信息所表明的那樣,ActiveMQ的SystemUsage尤其是MemoryUsage功能使一些人感到困惑。 我將嘗試解釋有關(guān)MemoryUsage的一些細(xì)節(jié),這些細(xì)節(jié)可能有助于理解它的工作方式。 我將不介紹StoreUsage和TempUsage,因?yàn)槲业耐乱呀?jīng)深入 介紹了這些內(nèi)容 。

您可以使用activemq.xml配置的一部分來指定SystemUsage限制,特別是圍繞代理可以使用的內(nèi)存,持久性存儲(chǔ)和臨時(shí)存儲(chǔ)。 這是ActiveMQ 5.7附帶的默認(rèn)示例:

<systemUsage><systemUsage><memoryUsage><memoryUsage limit="64 mb"/></memoryUsage><storeUsage><storeUsage limit="100 gb"/></storeUsage><tempUsage><tempUsage limit="50 gb"/></tempUsage></systemUsage> </systemUsage>

內(nèi)存使用情況

MemoryUsage似乎引起了最大的混亂,因此我在這里嘗試闡明其內(nèi)部工作原理。

當(dāng)消息傳入經(jīng)紀(jì)人時(shí),它必須走到某個(gè)地方。 它首先被解組斷絲進(jìn)入類型的ActiveMQ的命令對(duì)象ActiveMQMessage 。 目前,該對(duì)象顯然已在內(nèi)存中,但代理程序并未對(duì)其進(jìn)行跟蹤。

這使我們到達(dá)了第一點(diǎn)。

MemoryUsage實(shí)際上只是代理所需的字節(jié)數(shù)計(jì)數(shù)器,用于跟蹤消息正在使用的JVM內(nèi)存量。 這為經(jīng)紀(jì)人提供了一些監(jiān)控和確保我們不會(huì)超出極限的方法(稍后會(huì)詳細(xì)介紹)。 否則,在JVM耗盡堆空間之前,我們可能會(huì)在不知道限制的情況下接受消息。

因此,我們從線下傳來了消息。 一旦有了這些信息,代理將查看消息需要路由到哪個(gè)目的地(或多個(gè)目的地)。 一旦找到目的地,它將“發(fā)送”到那里。 目的地將增加消息的引用計(jì)數(shù)(以稍后知道消息是否被視為“活動(dòng)”)并繼續(xù)對(duì)其進(jìn)行處理。 對(duì)于第一個(gè)參考計(jì)數(shù),內(nèi)存使用量會(huì)增加。 對(duì)于最后的引用計(jì)數(shù),內(nèi)存使用量會(huì)減少。 如果目標(biāo)是隊(duì)列,它將把消息存儲(chǔ)到一個(gè)持久位置,并嘗試將其分發(fā)給使用者訂閱。 如果是主題,它將嘗試將其分發(fā)給所有訂閱。 一路走來(從最初進(jìn)入目的地到將消息發(fā)送給消費(fèi)者的訂閱),消息引用計(jì)數(shù)可以增加或減少。 只要它的引用計(jì)數(shù)大于或等于1,就會(huì)在內(nèi)存中進(jìn)行說明。

同樣,MemoryUsage 只是一個(gè)對(duì)象,它對(duì)消息的字節(jié)進(jìn)行計(jì)數(shù),以了解已使用了多少JVM內(nèi)存來保存消息。

所以,現(xiàn)在我們對(duì)這些的MemoryUsage是什么樣一個(gè)基本的了解,讓我們?cè)谝粚?duì)夫婦的事情仔細(xì)看看:

  • MemoryUsage層次結(jié)構(gòu)(我可以在策略條目上配置的此目標(biāo)內(nèi)存限制是多少?)?
  • 生產(chǎn)者流控制
  • 在目標(biāo)和訂閱(生產(chǎn)者和消費(fèi)者)之間分配內(nèi)存使用情況?
  • 主代理內(nèi)存,目標(biāo)內(nèi)存,訂閱內(nèi)存

    代理加載后,它將創(chuàng)建自己的SystemUsage對(duì)象(或使用配置中指定的對(duì)象)。 眾所周知,SystemUsage對(duì)象具有與之關(guān)聯(lián)的MemoryUsage,StoreUsage和TempUsage。 內(nèi)存組件將稱為代理的主內(nèi)存。 它是一個(gè)使用對(duì)象,用于跟蹤總體(目標(biāo),預(yù)訂等)內(nèi)存。

    創(chuàng)建目的地后,目的地將創(chuàng)建自己的SystemUsage對(duì)象(它將創(chuàng)建自己的單獨(dú)的Memory,Store和Temp Usage對(duì)象),但會(huì)將其父對(duì)象設(shè)置為代理的主SystemUsage對(duì)象。 可以單獨(dú)調(diào)整目標(biāo)的內(nèi)存限制(但不能調(diào)整“存儲(chǔ)”和“臨時(shí)”,它們?nèi)詫⑽山o父級(jí))。 設(shè)置目標(biāo)的內(nèi)存限制:

    <destinationPolicy><policyMap><policyEntries><policyEntry queue=">" memoryLimit="5MB"/></policyEntries></policyMap> </destinationPolicy>

    因此,可以將目標(biāo)使用情況對(duì)象用于更好地控制MemoryUsage,但對(duì)于所有使用情況計(jì)數(shù),它始終與主內(nèi)存協(xié)調(diào)。 此功能可用于限制目標(biāo)保留的消息數(shù)量,以使單個(gè)目標(biāo)無法餓死其他目標(biāo)。 對(duì)于隊(duì)列,它也會(huì)影響商店光標(biāo)的高水位線。 隊(duì)列具有用于持久消息和非持久消息的不同游標(biāo)。 如果我們達(dá)到高水位線(目標(biāo)內(nèi)存限制的閾值),則不會(huì)再緩存任何郵件以準(zhǔn)備發(fā)送,并且可以根據(jù)需要將非持久性消息清除到臨時(shí)磁盤(如果
    StoreCursor將使用FilePendingMessageCursor…否則,它將僅使用VMPendingMessageCursor而不會(huì)清除到臨時(shí)存儲(chǔ))。

    如果您沒有為單個(gè)目標(biāo)指定內(nèi)存限制,則目標(biāo)的SystemUsage將委派給父目標(biāo)(Main SystemUsage),以獲取所有使用計(jì)數(shù)。 這意味著它將對(duì)所有與內(nèi)存相關(guān)的計(jì)數(shù)有效地使用代理的Main SystemUsage。

    另一方面,消費(fèi)者訂閱對(duì)自己的SystemUsage或MemoryUsage計(jì)數(shù)器沒有任何概念。 他們將始終使用代理的Main SystemUsage對(duì)象。 需要注意的主要事情是,使用FilePendingMessageCursor進(jìn)行訂閱(例如,對(duì)于主題訂閱)時(shí),直到達(dá)到光標(biāo)高水位標(biāo)記(默認(rèn)為70%)時(shí),消息才會(huì)交換到磁盤上。這意味著將需要達(dá)到70%的主內(nèi)存。 可能要花一會(huì)兒時(shí)間,并且很多消息都可以保留在內(nèi)存中。 而且,如果您的訂閱是保存大多數(shù)此類消息的訂閱,則交換到磁盤可能需要一段時(shí)間。 當(dāng)主題一次將消息分發(fā)到一個(gè)訂閱時(shí),如果一個(gè)訂閱由于將消息交換到磁盤而停止,則準(zhǔn)備接收消息的其余訂閱也會(huì)感到速度變慢。

    您可以將主題的訂閱的光標(biāo)水位線設(shè)置為低于默認(rèn)值:

    <destinationPolicy><policyMap><policyEntries><policyEntry topic="FOO.BAR.>" cursorMemoryHighWaterMark="30" /></policyEntries></policyMap> </destinationPolicy>

    對(duì)于感興趣的人...當(dāng)消息到達(dá)目標(biāo)時(shí),將在消息上設(shè)置MemoryUsage對(duì)象,以便當(dāng)Message.incrementReferenceCount()可以增加內(nèi)存使用量(第一次引用時(shí))。 因此,這意味著它是由目標(biāo)的內(nèi)存使用情況(以及主內(nèi)存)所引起的,因?yàn)槟繕?biāo)的內(nèi)存在使用情況發(fā)生變化時(shí)也會(huì)通知其父級(jí),并且會(huì)繼續(xù)這樣做。 唯一會(huì)改變的是消息是否交換到磁盤上。 交換時(shí),其引用計(jì)數(shù)將減少,其內(nèi)存使用量將減少,并且一旦進(jìn)入磁盤,它將丟失其MemoryUsage對(duì)象。 因此,當(dāng)它恢復(fù)活力時(shí),哪個(gè)MemoryUsage對(duì)象將與該對(duì)象相關(guān)聯(lián),并且將在哪里對(duì)其進(jìn)行計(jì)數(shù)? 如果將其交換到隊(duì)列的存儲(chǔ)中,則在重組時(shí),它將再次與目標(biāo)內(nèi)存使用量相關(guān)聯(lián)。 如果已將其交換到預(yù)訂中的臨時(shí)存儲(chǔ)(如FilePendingMessageCursor中的臨時(shí)存儲(chǔ)),則在重新構(gòu)成時(shí),它將不再與目標(biāo)的內(nèi)存使用量相關(guān)聯(lián)。 它將與訂閱的內(nèi)存使用量(即主內(nèi)存)相關(guān)聯(lián)。

    生產(chǎn)者流控制

    跟蹤消息使用的內(nèi)存的最大勝利是生產(chǎn)者流控制(PFC) 。 PFC默認(rèn)情況下處于啟用狀態(tài),當(dāng)達(dá)到使用限制時(shí),基本上會(huì)減慢生產(chǎn)者的速度。 這可以防止代理超出其限制并耗盡資源。 對(duì)于同步發(fā)送的生產(chǎn)者或指定了生產(chǎn)者窗口的異步發(fā)送,如果達(dá)到系統(tǒng)使用率,則代理將阻止該單個(gè)生產(chǎn)者,但不會(huì)阻止連接。 取而代之的是它將消息暫時(shí)擱置以等待空間可用。 一旦消息被存儲(chǔ),它將僅發(fā)送回ProducerAck。 在此之前,客戶端應(yīng)該阻止其發(fā)送操作(不會(huì)阻止連接本身)。 ActiveMQ 5.x客戶端庫(kù)可以為您處理此問題。 但是,如果在沒有生產(chǎn)者窗口的情況下發(fā)送了異步發(fā)送,或者如果生產(chǎn)者的行為不正確并且忽略了ProducerAcks,則PFC實(shí)際上會(huì)在到達(dá)內(nèi)存時(shí)阻塞整個(gè)連接。 如果您的使用者共享同一連接,則可能導(dǎo)致死鎖。

    如果生產(chǎn)者流控制已關(guān)閉,則必須更加注意如何設(shè)置系統(tǒng)使用率。 當(dāng)生產(chǎn)者流控制關(guān)閉時(shí),它的基本含義是“經(jīng)紀(jì)人,無論消費(fèi)者是否能跟上進(jìn)展,您都必須接受所有傳入的消息”。 這可用于處理到達(dá)目的地的傳入消息的峰值。 如果您曾經(jīng)看到日志中的內(nèi)存使用嚴(yán)重超出了您設(shè)置的限制,則可能是PFC已關(guān)閉,這是預(yù)期的行為。

    分割經(jīng)紀(jì)人的主存

    所以……我之前說過,目的地的內(nèi)存使用代理的主內(nèi)存作為父代,而訂閱沒有自己的內(nèi)存計(jì)數(shù)器,它們僅使用代理的主內(nèi)存。 好吧,這在默認(rèn)情況下是正確的,但是如果找到原因,則可以進(jìn)一步調(diào)整內(nèi)存的劃分和限制方式。 這里的想法是,您可以將代理的主內(nèi)存劃分為“生產(chǎn)者”和“消費(fèi)者”部分。

    生產(chǎn)者部分將用于與進(jìn)入代理的消息相關(guān)的所有事物,因此將在目的地中使用。 因此,這意味著,當(dāng)一個(gè)目標(biāo)上創(chuàng)建了自己的MemoryUsage,它將使用生產(chǎn)者內(nèi)存作為其母公司,以及生產(chǎn)者的內(nèi)存將使用代理的主存儲(chǔ)器的一部分 。

    另一方面,消費(fèi)者部分將用于與向消費(fèi)者分發(fā)消息有關(guān)的所有事情。 這意味著訂閱。 與其直接使用代理的主內(nèi)存進(jìn)行預(yù)訂,不如使用使用方內(nèi)存(它是主內(nèi)存的一部分)進(jìn)行訂閱。 理想情況下,消費(fèi)者部分和生產(chǎn)者部分將等于整個(gè)經(jīng)紀(jì)人的主內(nèi)存。

    要在生產(chǎn)者和使用者之間分配內(nèi)存,請(qǐng)?jiān)谥?lt;broker/>元素上設(shè)置splitSystemUsageForProducersConsumers屬性:

    <broker splitSystemUsageForProducersConsumers='true'>

    默認(rèn)情況下,這會(huì)將代理的主內(nèi)存使用量分為生產(chǎn)者60%和消費(fèi)者40%。 要進(jìn)一步調(diào)整,請(qǐng)?jiān)谥鞔碓厣显O(shè)置producerSystemUsagePortion和consumerSystemUsagePortion :

    <broker splitSystemUsageForProducersConsumers='true' producerSystemUsagePortion='70' consumerSystemUsagePortion='30'>

    你有它。 希望這可以為代理的MemoryUsage帶來一些啟發(fā)。

    參考: ActiveMQ:在Christian Posta Software博客上,從我們的JCG合作伙伴 Christian Posta 了解內(nèi)存使用情況 。

    翻譯自: https://www.javacodegeeks.com/2012/12/activemq-understanding-memory-usage.html

    總結(jié)

    以上是生活随笔為你收集整理的ActiveMQ:了解内存使用情况的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。