Темы, припаркованные с помощью HTTP-Kit
У меня на ходу несколько потоков, каждый из которых выполняет блокирующий вызов HTTP Kit. Мой код работает, но недавно он замерз примерно через 30 минут. Все мои темы застряли в следующей точке:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)
java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)
clojure.core$promise$reify__7005.deref(core.clj:6823)
clojure.core$deref.invokeStatic(core.clj:2228)
clojure.core$deref.invoke(core.clj:2214)
my_project.web$fetch.invokeStatic(web.clj:35)
Линия my_project.web.clj:35
это что-то вроде:
(let [result @(org.httpkit.client/get "http://example.com")]
(Я использую простые потоки Java, а не core.async
потому что я запускаю контекст набора одновременных клиентов Apache Kafka, каждый в своем собственном потоке. Kafka Client действительно раскручивает множество собственных потоков, тем более, что я запускаю его несколько раз, например, 5 параллельно).
Тот факт, что все мои потоки в конечном итоге припаркованы таким образом в HTTP Kit, указывает на утечку ресурсов, или некоторый код в HTTP Kit, умирающий до того, как у него появится шанс доставить, или, возможно, нехватка ресурсов.
Кажется, здесь застрял другой поток. Возможно, он блокирует все обещанные поставки.
sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:850)
sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:781)
javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624)
org.httpkit.client.HttpsRequest.unwrapRead(HttpsRequest.java:35)
org.httpkit.client.HttpClient.doRead(HttpClient.java:131)
org.httpkit.client.HttpClient.run(HttpClient.java:377)
java.lang.Thread.run(Thread.java:748)
Любые идеи, в чем может быть проблема, или указатели на то, как ее диагностировать?
1 ответ
Обычная вещь, которую нужно сделать, это настроить DefaultUncaughtExceptionHandler
, Это по крайней мере даст вам указание, если в ваших темах есть исключения.
(defn init-jvm-uncaught-exception-logging []
(Thread/setDefaultUncaughtExceptionHandler
(reify Thread$UncaughtExceptionHandler
(uncaughtException [_ thread ex]
(log/error ex "Uncaught exception on" (.getName thread))))))
Стюарт Сьерра хорошо написал об этом: https://stuartsierra.com/2015/05/27/clojure-uncaught-exceptions