Re: [PATCH v2 1/3] timer: add per-installer pending lists for each lcore

From: Carrillo, Erik G <hidden>
Date: 2017-09-05 21:52:26

Hi all,

Another approach that I'd like to put out for consideration is as follows:

Let's say we introduce one flag per lcore - multi_pendlists.  This flag indicates whether that lcore supports multiple pending lists (one per source lcore) or not, and by default it's set to false.

At rte_timer_subsystem_init() time, each lcore will be configured to use a single pending list per lcore (rather than multiple).

A new API, rte_timer_subsystem_set_multi_pendlists(unsigned lcore_Id), can be called to enable multi_pendlists for a particular lcore.  It should be called after rte_timer_subsystem_init(), and before any timers are started for that lcore.

When timers are started for a particular lcore, that lcore's multi_pendlists flag will be inspected to determine whether it should go into a single list, or one of several lists.

When an lcore processes its timers with rte_timer_manage(), it will look at the multi_pendlists flag, and if it is false, only process a single list.  This should bring the overhead nearly back down to what it was originally.  And if multi_pendlists is true, it will break out the runlists from multiple pending lists in sequence and process them, as in the current patch.
	
Thoughts or comments?

Thanks,
Gabriel
-----Original Message-----
From: Ananyev, Konstantin
Sent: Tuesday, August 29, 2017 5:57 AM
To: Carrillo, Erik G <redacted>; rsanford@akamai.com
Cc: dev@dpdk.org
Subject: RE: [dpdk-dev] [PATCH v2 1/3] timer: add per-installer pending lists
for each lcore

Hi Gabriel,
quoted
Instead of each priv_timer struct containing a single skiplist, this
commit adds a skiplist for each enabled lcore to priv_timer. In the
case that multiple lcores repeatedly install timers on the same target
lcore, this change reduces lock contention for the target lcore's
skiplists and increases performance.
I am not an rte_timer expert, but there is one thing that worries me:
It seems that complexity of timer_manage() has increased with that patch
quite a bit:
now  it has to check/process up to RTE_MAX_LCORE skiplists instead of one,
also it has to somehow to properly sort up to RTE_MAX_LCORE lists of
retrieved (ready to run) timers.
Wouldn't all that affect it's running time?

I understand your intention to reduce lock contention, but I suppose at least
it could be done in a configurable way.
Let say allow user to specify  dimension of pending_lists[] at init phase or so.
Then timer from lcore_id=N will endup in
pending_lists[N%RTE_DIM(pendilng_list)].

Another thought - might be better to divide pending timers list not by client
(lcore) id, but by expiration time - some analog of  timer wheel or so.
That, I think might greatly decrease the probability that timer_manage() and
timer_add() will try to access the same list.
From other side timer_manage() still would have to consume skip-lists one
by one.
Though I suppose that's quite radical change from what we have right now.
Konstantin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help