From: Anton Aksola <hidden> Date: 2016-09-16 07:22:29
The calling of netns_map_init() before command parsing introduced
a performance issue with large number of namespaces.
As commands such as add, del and exec do not need to iterate through
/var/run/netns it would be good not no build the cache before executing
these commands.
Example:
unpatched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m16.832s
user 0m1.350s
sys 0m15.029s
patched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m3.859s
user 0m0.132s
sys 0m3.205s
Signed-off-by: Anton Aksola <redacted>
---
ip/ipnetns.c | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
From: Nicolas Dichtel <hidden> Date: 2016-09-16 09:13:14
Le 16/09/2016 à 09:22, Anton Aksola a écrit :
The calling of netns_map_init() before command parsing introduced
a performance issue with large number of namespaces.
As commands such as add, del and exec do not need to iterate through
/var/run/netns it would be good not no build the cache before executing
these commands.
Example:
unpatched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m16.832s
user 0m1.350s
sys 0m15.029s
patched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m3.859s
user 0m0.132s
sys 0m3.205s
Signed-off-by: Anton Aksola <redacted>
---
There is still some differences:
$ cat test.batch
netns add foo
netns set foo 1234
netns list-id
Before your patch:
$ ip -b test.batch
nsid 1234 (iproute2 netns name: foo)
After your patch:
$ ip -b test.batch
nsid 1234
On Fri, Sep 16, 2016 at 12:13 PM, Nicolas Dichtel
[off-list ref] wrote:
Le 16/09/2016 à 09:22, Anton Aksola a écrit :
quoted
The calling of netns_map_init() before command parsing introduced
a performance issue with large number of namespaces.
As commands such as add, del and exec do not need to iterate through
/var/run/netns it would be good not no build the cache before executing
these commands.
Example:
unpatched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m16.832s
user 0m1.350s
sys 0m15.029s
patched:
time seq 1 1000 | xargs -n 1 ip netns add
real 0m3.859s
user 0m0.132s
sys 0m3.205s
Signed-off-by: Anton Aksola <redacted>
---
There is still some differences:
$ cat test.batch
netns add foo
netns set foo 1234
netns list-id
Before your patch:
$ ip -b test.batch
nsid 1234 (iproute2 netns name: foo)
After your patch:
$ ip -b test.batch
nsid 1234
Would it be useful to add test for this case into testsuite/ ?
Regards,
Vadim Kochan
From: Anton Aksola <hidden> Date: 2016-09-16 13:18:04
On Fri, Sep 16, 2016 at 11:13:11AM +0200, Nicolas Dichtel wrote:
There is still some differences:
$ cat test.batch
netns add foo
netns set foo 1234
netns list-id
Before your patch:
$ ip -b test.batch
nsid 1234 (iproute2 netns name: foo)
After your patch:
$ ip -b test.batch
nsid 1234
Nicolas,
This seems to be caused by netns_add calling unshare(CLONE_NEWNET).
If we initialize the socket for nsid after that it doesn't seem to work.
Unfortunately I'm not an expert in these details. Should we separate the
socket and cache initialization to different functions and call the
socket init in the beginning of do_netns() as before? What do you think?
I made a quick patch and it seems to work in batch mode now.
BR,
Anton
From: Nicolas Dichtel <hidden> Date: 2016-09-16 15:43:09
Le 16/09/2016 à 15:18, Anton Aksola a écrit :
[snip]
Nicolas,
This seems to be caused by netns_add calling unshare(CLONE_NEWNET).
If we initialize the socket for nsid after that it doesn't seem to work.
Unfortunately I'm not an expert in these details. Should we separate the
socket and cache initialization to different functions and call the
socket init in the beginning of do_netns() as before? What do you think?
Seems good.
I made a quick patch and it seems to work in batch mode now.
What is the result of that sequence?
$ ip netns add bar
$ ip netns set bar 5678
$ ip -b test.batch
nsid 1234 (iproute2 netns name: foo)
nsid 5678 (iproute2 netns name: bar)
$