The locking that is done for the blacklist timing seems to degrade
performance significantly Felix is under stress with multiple firing
handler callbacks for each event. I'd like to discuss an alternative
approach with less locking that still guarantees proper event ordering
per the OSGi spec. Basically instead of using the CyclicBarriers
(Rendezvous) on a per handler basis we could use a count down latch to
only await after all handlers are complete. Then instead of using a
stopwatch based timer the JMX Current Thread Cpu Time which counts CPU
time for the application code and any IO performed on it's behalf
filtering out time context switching between threads to provide proper
blacklisting. I've created FELIX-4638 with a patch.
Here are my test results.
Baseline(Event Admin 1.4.2):
15 Threads
100000 Async Events per Thread
7 Active Handlers per Event
For a total of 10500000 Handler Events Executed in 40000 - 45000ms
With the same parameters above but a CountDownLatch I see the execution
time drop to around 25000ms. The improvement is noticeable because the
stress test includes 7 active handlers per event. The improvement is
less noticeable with applications that only register one or 2 handlers
for an active event such as in the PerformanceTestIT. Thoughts on
changing how this locking occurs? Concerns with using the JMX timings?
- Bob