2015-06-29 50 views
2

檢查噴灑api的吞吐量。scala,spray,akka - java.lang.OutOfMemoryError:無法創建新的本機線程

場景:25個併發用戶

O的:免費的BSD

內存:2GB

沒有核心數:2

在大約13個併發用戶的我居然也得到了下面的錯誤。

[ERROR] [06/29/2015 05:01:56.407] [default-akka.actor.default-dispatcher-2]  [ActorSystem(default)] Uncaught error from thread [default-akka.actor.default-dispatcher-2] shutting down JVM since 'akka.jvm-exit-on-fatal-error' is enabled 
java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:714) 
    at scala.concurrent.forkjoin.ForkJoinPool.tryAddWorker(ForkJoinPool.java:1672) 
    at scala.concurrent.forkjoin.ForkJoinPool.deregisterWorker(ForkJoinPool.java:1795) 
    at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:117) 

阿卡和噴霧從默認的conf變化:

akka{ 
    tcp{ 
     register-timeout = 20s 
    } 
} 

spray.can { 
    request-timeout = 30 s 
    bind-timeout = 30s 
    unbind-timeout = 5s 
    registration-timeout = 30s 
} 

http.spray.can { 
    server{ 
     pipelining-limit = 50 
    } 
} 

是什麼原因造成的OutOfMemmoryError。從路由器演員拋出異常

回答

7

不能讀取頭腦,但可能你會阻止(Await.result或類似)內的演員。 ForkJoinPool自動爲每個阻止的創建一個新的線程。所以如果你有一個很長的時間塊count_of_threads == count_of_requests(+每個線程持有引用iside調用堆棧),最終導致OutOfMemory

見,Blocking Needs Careful Management

附: Here你可能會發現爲什麼Await.result(它使用裏面的scala.concurrent.blocking)導致在ForkJoinPool(甚至不管maxParallelism)無法管理的線程創建。


或者你創造了很多ActorSystem S,same page of akka documentation狀態:

An ActorSystem is a heavyweight structure that will allocate 1…N Threads, so create one per logical application.

+0

我正在Await.result裏面的演員。現在我刪除了它,並將其提供給未來。但是其他演員阻止了諸如REST調用的調用。這會是問題嗎? –

+0

在應用程序中有2個actor系統。現在做到了,似乎在工作。你能解釋一下行爲的變化嗎? –

+0

正如我所說,我無法讀懂頭腦:) - 較少的演員系統 - 較少的內存,所以它可以幫助一點。但是兩個演員系統並不足以成爲這種例外的直接原因(也許你有很多演員系統的「def」工廠 - 那麼這可能是一個問題)。你確定ActorSystem刪除有幫助還是實際上刪除了'Await.result'?回答你的第一個問題 - 阻止REST調用可能不會導致這個異常(但它仍然不好),因爲它們的阻塞是不可管理的,而'ForkJoinPool'知道沒有關於它們,所以它不會創建新的線程。 – dk14

相關問題