[Oisf-users] Question about cpu-affinity

Eric Leblond eric at regit.org
Fri Mar 2 11:03:04 UTC 2018


Hi,

On Fri, 2018-03-02 at 11:51 +0100, Victor Julien wrote:
> On 02-03-18 11:48, Victor Julien wrote:
> > On 02-03-18 11:35, Eric Leblond wrote:
> > > Hi Cooper,
> > > 
> > > On Thu, 2018-03-01 at 08:12 -0800, Cooper F. Nelson wrote:
> > > > Hi Eric,
> > > > 
> > > > I hope you don't mind me copying you directly, as I saw you
> > > > were the
> > > > author of the threading/cpu-affinity module.
> > > 
> > > That was long ago ;)
> > > 
> > > > I'm wondering if it is currently possible when using multiple
> > > > interfaces
> > > > to 'interleave' the threads so that they are evenly distributed
> > > > across
> > > > all cores.  For example, consider a system with 16 cores and
> > > > two
> > > > interfaces, configured with 8 threads each.
> > > > 
> > > > Can you do something like this?
> > > > 
> > > >   - detect-cpu-set
> > > > 
> > > >         cpu: [ 0, 2, 4, 6, 8, 10, 12, 14, 1, 3, 5, 7, 9, 11,
> > > > 13, 15 ]
> > > > 
> > > >         mode: "exclusive"
> > > > 
> > > > The idea is we want the first 8 threads allocated to 0-14, even
> > > > cores
> > > > only.  The next 8 threads being allocated to 1-16, odd cores
> > > > only. 
> > > > Lets
> > > > assume we are using RSS in this example.
> > > > 
> > > > I had a look at the code and while it appears that this how you
> > > > have
> > > > implemented it, I'm not 100% certain, so I wanted to verify.
> > > 
> > > I don't think this will work. The CPU set is an unordered.
> > > Suricata
> > > build the CPU set as a map then it start by 0, get next CPU in
> > > the set
> > > (testing if 0 is in then switching to 1 and checking if it is in
> > > the
> > > set).
> > > 
> > > So with current code, the only way to do what you want is to have
> > > a
> > > ["all"] CPU set in exclusive mode in the affinity and an ugly af-
> > > packet 
> > > configuration like:
> > > 
> > >   af-packet:
> > >     - interface: eth0
> > >       threads: 1
> > >       cluster-id: 99
> > >     - interface: eth1
> > >       threads: 1
> > >       cluster-id: 98
> > >     - interface: eth0
> > >       threads: 1
> > >       cluster-id: 99
> > >     - interface: eth1
> > >       threads: 1
> > >       cluster-id: 98
> > >     ...
> > >     -
> > > default:
> > >       #set every global variable here
> > > 
> > 
> > Wonder how hard it would be to hide this kind of detail. E.g.
> > something
> > like:
> > 
> > af-packet:
> >   - interface: eth0
> >     cluster-id: 99
> >     numa-node: 0
> >   - interface: eth1
> >     cluster-id: 98
> >     numa-node: 1
> > 
> > It would immediately bring up the issue of how to exclude cores,
> > etc. So
> > might not be trivial.
> > 
> 
> Or maybe allow defining named cpu sets and allow assigning those to
> af-packet interface configs:
> 
> - cpu-set
>   name: af-packet-eth0
>   cpu: [ 0, 2, 4, 6, 8, 10, 12, 14]
>   mode: "exclusive"
> - cpu-set
>   name: af-packet-eth1
>   cpu: [1, 3, 5, 7, 9, 11, 13, 15 ]
>   mode: "exclusive"
> 
> 
> 
> af-packet:
>   - interface: eth0
>     cluster-id: 99
>     cpu-set: "af-packet-eth0"
>   - interface: eth1
>     cluster-id: 98
>     cpu-set: "af-packet-eth1"

I like this second proposal better. From what I've seen a few packet
capture APIs are using the numa node in the capture params, maybe we
could combined both approach.

++
-- 
Eric Leblond <eric at regit.org>



More information about the Oisf-users mailing list