On 10/21/2014 10:14 AM, Philippe Gerum wrote:
> On 10/20/2014 10:24 PM, Ronny Meeus wrote:
>> Hello
>>
>> we are using the xenomai-forge mercury core together with the pSOS
>> interface.
>> What I observe is that our application is spending a lot of time in the
>> timer-handling.
>> Please note that the application consists of a lot of threads (>150) that
>> use things like pSOS event timers (periodic and one-shot) etc.
>>
>> When a timer is used by the application 2 things basically happen:
>> - a Linux timer is started that sends a signal to the internal Timer thread.
>> - the timer is added to a sorted list (sorted on timeout value).
>>
>> When the internal timer thread is receiving the signal generated by the
>> Linux kernel, it scans through the list and expires all the timers for
>> which the timeout is elapsed. In case of a periodic timer, it is added
>> again to the sorted list at the correct location.
>>
>> In this implementation, in fact a double timer processing is needed: once
>> in the timerlist (inside Xenomai) and once in Linux.
>>
>> Just as a test I have changed the code so that the internal timer process
>> ticks with a fixed rate of 10ms (based on 1 Linux timer) and it just
>> performs the same action as before: handle all timers that are expired. In
>> this way the timer handling is done only once: inserting in the sorted
>> list. By doing this the load of our application is reduced a lot.
>> I understand that this approach has also disadvantages:
>> - less accurate (10ms precision)
>> - in case there is a low amount of timers with a long timeout, the overhead
>> of the polling might also be big.
>>
>> Questions:
>> - are any improvement planned in this area?
>> - do other people also observe this high load?
>>
>> Any thoughts/ideas for improvements are welcome.
>>
> 
> To observe the same load, one would have to run 150 timers in parallel,
> each serving a separate thread, which is may not be the best approach
> performance-wise, although I understand that coping with the original
> design is likely a prerequisite anyway.
> 
> We have to keep threaded timers, since application handlers may run
> async-unsafe code indirectly through calls to the emulator. So the
> options I can see involve processing timers less frequently as you
> experimented, or decreasing the insertion time of each timer.
> 
> Although the first option cannot be generalized, we could provide a way
> to tune the internal timer thread to wake up periodically as you did
> instead of running event-driven. This would work for applications
> running over emulators with tick-based clocks, which only need coarse
> timing. This "batching" option would be enabled on a per-application
> basis, using a command line switch for instance.
> 
> The second option which is already queued to the todo list, is about
> introducing a smarter algorithm for dealing with a large number of
> outstanding timers in Copperplate, instead of a plain list as currently.
> We have this code already for dealing with Cobalt timers, we still have
> to move it to userland.
> 
I believe the bheap.h binary heaps implementation can be used directly
in user-space. You may want to add realloc of the bheap at insertion to
cope with different number of timers instead of having a hard limit,
this should require minimal changes (allocate the buckets array
separately from the bheap object, which would also remove the weird
macros wrapping).

-- 
                                                                Gilles.

_______________________________________________
Xenomai mailing list
Xenomai@xenomai.org
http://www.xenomai.org/mailman/listinfo/xenomai

Reply via email to