On 02/12/2019 03:32 PM, Eric Dumazet wrote:
>
>
> This patch brings a serious performance penalty.
>
> ss command now uses two system calls per ~4KB worth of data
>
> recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
> msg_iov(1)=[{NULL, 0}], msg_controllen=0, msg_flags=MSG_TRUNC},
> MSG_PEEK|MSG_TRUNC) = 3328 <0.000120>
> recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
> msg_iov(1)=[{"h\0\0\0\24\0\2\0@\342\1\0\322\0\6\0\n\1\1\0\250\253\276@&\7\370\260\200\231\16\6"...,
> 3328}], msg_controllen=0, msg_flags=0}, 0) = 3328 <0.000108>
> recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
> msg_iov(1)=[{NULL, 0}], msg_controllen=0, msg_flags=MSG_TRUNC},
> MSG_PEEK|MSG_TRUNC) = 3328 <0.000086>
> recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000},
> msg_iov(1)=[{"h\0\0\0\24\0\2\0@\342\1\0\322\0\6\0\n\10\2\0002A\266S&\7\370\260\200\231\16\6"...,
> 3328}], msg_controllen=0, msg_flags=0}, 0) = 3328 <0.000121>
>
>
> So we are back to a very pessimistic situation.
>
I guess this patch will solve the issue :
diff --git a/lib/libnetlink.c b/lib/libnetlink.c
index
ced33728777a17e0905e76acb904ac4709707488..309b5b3787e3d8f8c47f035d270ae2b4df01703e
100644
--- a/lib/libnetlink.c
+++ b/lib/libnetlink.c
@@ -442,6 +442,8 @@ static int rtnl_recvmsg(int fd, struct msghdr *msg, char
**answer)
if (len < 0)
return len;
+ if (len < 32768)
+ len = 32768;
buf = malloc(len);
if (!buf) {
fprintf(stderr, "malloc error: not enough buffer\n");