uima-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jörn Kottmann <kottm...@gmail.com>
Subject UIMA AS client CPU load
Date Wed, 26 Aug 2009 12:23:09 GMT
Hi everyone,

to put some load on one of our UIMA AS system I wrote
a small tool which uses the client API to send CASes to
a processing pipeline.

This tool has an endless loop which waits for work
to arrive and then sends it to the processing pipeline.

It basically looks like this:

text = getNextDocument() // returns plain text which should be analyzed

CAS cas = uimASEngine.getCAS();
cas.setDocumentText(text)
uimaAsEngine.sendCAS(cas)

When the tool is started there is usually lots of work waiting
and all available CASes are sent out to the service. It takes a while
until the first CAS is completly processed. Now the
tool gets a new text and waits for a new CAS inside getCAS().

Now I wonder why waiting for a CAS inside getCAS() puts 95 to 100 % CPU 
load
on one core on my client machine.

I looked at the place where it waits in 
BaseUIMAAsynchronousEngineCommon_impl
around line 536 in getCAS().

Here is the wait loop:
      while (running) {
        try {
          // Wait until the CAS producer adds the CAS to the 
CasQueueEntry and
          // signals CAS availability.
          entry.getSemaphore().acquire();
          if (entry.getCas() == null) {
            continue;
          } else {
            return entry.getCas();
          }
        } finally {
          entry.getSemaphore().release();
        }  
      } // while

For me it looks like that if entry.getCAS() returns null it immediately
tries again and polls entry.getCAS() as often as possible.

Jörn


Mime
View raw message