簡體   English   中英

如何估計或計算ArrayBlockingQueue的大小

[英]How to estimate or calculate the size of the ArrayBlockingQueue

作為標題,在我的模塊中,我有一個阻塞隊列來傳遞我的數據。 服務器可以生成的數據是大量的日志信息。 為了避免影響服務器的性能,我編寫了多線程客戶端來使用這些數據並將它們保存在數據緩存中。 因為數據可以每分鍾大量生成,所以我很困惑,我應該初始化隊列多少大小。 而且我知道我可以設置我的隊列策略,如果生成更多數據,我可以省略溢出部分。 但是我在隊列中創建了多少大小,以便盡可能多地保存這些數據。

你能給我一些建議嗎?據我所知,它與我的服務器JVM堆棧大小和我的JVM中的單個日志記錄數據有關?

使它“盡可能大”。 例如,如果您可以使用高達1Gb的內存,則將其大小分配為1Gb除以隊列中對象的平均字節數。

如果我必須選擇一個“合理”的數字,我會從10000開始。 原因是,如果它增長到大於那個,那么增大它並不是一個好主意並且不會有太大幫助,因為顯然日志記錄要求超過了你的記錄能力,所以是時候退出了客戶端。

通過實驗“調整”通常是最好的方法,因為它取決於您的應用程序的配置文件:

  • 如果應用程序的活動中存在高點和低點,則更大的隊列將幫助“平滑”服務器上的負載
  • 如果您的應用程序具有相對穩定的負載,則較小的隊列是合適的,因為較大的隊列僅在客戶端被阻止時延遲不可避免的點 - 您最好將其縮小並將更多資源(更多日志記錄線程)用於消耗工作。

另請注意,非常大的隊列可能會影響垃圾回收響應以釋放內存,因為它必須在每次運行時遍歷更大的堆(隊列中的所有對象),從而增加CPU和內存的負載。

您希望盡可能減小尺寸,而不會過多地影響吞吐量和響應速度。 要評估這一點,您需要設置一個測試服務器並使用典型負載點擊它以查看會發生什么。 請注意,您可能需要從多台計算機上點擊它以在服務器上加載實際負載,因為從一台計算機上命中它可能會因測試客戶端計算機上的CPU核心數和其他資源而限制負載。

坦率地說,我只需要調整10000的大小並調整工作線程的數量而不是隊列大小。

對磁盤的連續寫入速度相當快(每秒容易20MB)。 您可能最好不要將數據寫入磁盤而不必擔心內存需求,而不是將數據存儲在RAM中。 然后,您的客戶可以從文件而不是RAM中讀取數據。

要知道java對象的大小,可以使用任何java profiler。 YourKit是我的最愛。

我認為真正的問題不是隊列的大小,而是當事情超出計划容量時你想要做的事情。 ArrayBlockingQueue將簡單地阻塞你的線程,這可能是也可能不是正確的。 您的選擇通常是:

1)根據為此目的提交的內存阻塞線程(使用ArrayBlockingQueue)2)將錯誤返回到“上面的層”並讓該層決定做什么...可能會向客戶端發送錯誤3)你能扔掉嗎?一些數據...說很久以前就已經排隊了。 4)一旦溢出RAM容量,就開始寫入磁盤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM