簡體   English   中英

MongoDB Java驅動程序中的死鎖

[英]Deadlock in mongodb java driver

我有5個線程(還有來自碼頭網絡服務器的許多線程)的多線程Java應用程序,其中一些不時讀取/寫入mongodb。 有些寫操作很費力,我讀了20萬個mongodb對象,但是它們並不是連續發生的,而是每幾分鍾發生一次。 幾個小時后,應用程序完美運行,但是后來我看到了這種情況:

在此處輸入圖片說明

據我了解,Mongo沒有做任何工作:

在此處輸入圖片說明

這是我的jstack輸出:

https://gist.github.com/stiv-yakovenko/06b0d235fd2c32d839788edf56aaa6cd

您會看到所有線程都在等待一個線程,而該線程又在等待mongo,而mongo什么也不做 在出現問題之前,健康的情況是沒有線程在等待其他任何人,因為負載並不高,無法阻塞所有內容。 在mongo之前,我使用mapdb來存儲相同的數據,但我從未遇到過類似的問題。

我已經看到多個線程在等待mongo的情況,所以我決定將所有mongodb調用都放在同一個ReentrantLock(true)下。 我希望rootcause太多的線程想要訪問mongo,但這無濟於事。 我不知道該怎么辦,試圖用簡單的代碼重現問題,但是我做不到。 有任何想法嗎?

UPD:這是jstat的輸出,是請求的評論者之一:

在此處輸入圖片說明

好吧,最后證明這是一個垃圾收集。 我最終使用了G1垃圾收集器。 但這還不夠,因為它無法提供所需的延遲(盡管已經很接近)。 我必須將應用程序分為兩部分,一部分用於進行大量垃圾產生計算,另一部分用於低延遲Web響應。

暫無
暫無

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

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