Haengende Loader wegen LinkedBlockingQueue

Forum for developers

Haengende Loader wegen LinkedBlockingQueue

Beitragvon Quix0r » Mi Jan 04, 2012 8:54 am

Ich habe wieder den Fall gehabt, dass alle Loader-Prozesse (siehe Attribut 'input' in Klasse WorkflowProcessor) gehangen haben und sich nur durch eine InterruptedException loesten.

Hier mal ein Beispiel-Thread (die Zeilennummern bitte ggf. ignorieren, da sie aus meiner Repository kommen oder meine mergen):
Code: Alles auswählen
"Thread-213859" prio=10 tid=0x00007ff89c045800 nid=0xfe8 waiting on condition [0x00007ff8a022f000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000000cd2dcc28> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:186)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043)
    at java.util.concurrent.LinkedBlockingQueue.put(LinkedBlockingQueue.java:349)
    at net.yacy.kelondro.workflow.WorkflowProcessor.enQueue(WorkflowProcessor.java:154)
    at net.yacy.search.Switchboard.toIndexer(Switchboard.java:1684)
    at de.anomic.crawler.CrawlQueues$Loader.run(CrawlQueues.java:664)

   Locked ownable synchronizers:
    - None

So sahen auch alle anderen Loader-Threads aus. Ich habe dazu mal die Doku von Java hinzugezogen und bin dabei auf folgenden interessanten Absatz gestossen:
Note that you cannot always tell if an attempt to insert an element will succeed by inspecting remainingCapacity() because it may be the case that another thread is about to insert or remove an element.

Quelle: http://docs.oracle.com/javase/6/docs/ap ... Queue.html

Ich schaetze, dass die Queue voll laeuft und schlage daher vor, dass bevor ein weiteres Element eingefuegt wird, remainingCapacity() - XXX abgefragt wird, ist dies unter einer Grenze gefallen, muss davon ausgegangen werden, dass der Queue bald voll wird und das Einfuegen weiterer Elemente sollte herabgebremst werden.

Noch etwas interessantes weiss dieser Poster:
Forget polling. There's no way to guarantee a good tradeoff between latency and CPU cost.

LinkedBlockingQueue and ArrayBlockingQueue may not be the best performers. They use ReentrantLock, which currently performs worse than a plain synchronized block. It's possible for a synchronized LinkedList with wait()/notify() to perform better.

ConcurrentLinkedQueue is a top performer for multiple threads and it never blocks. If you have a single dedicated thread calling poll(), you can easily suspend and resume that one thread using LockSupport. LockSupport's performance depends on the OS kernel.

If all of this sounds too complicated, use LinkedBlockingQueue or ArrayBlockingQueue. They're simple and they may improve in a future JVM.

Quelle: http://www.velocityreviews.com/forums/t ... queue.html
Quix0r
 
Beiträge: 1347
Registriert: Di Jul 31, 2007 9:22 am
Wohnort: Krefeld

Zurück zu YaCy Coding & Architecture

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast

cron