[ovs-dev] Flow Control and Port Mirroring Revisited
Rick Jones
rick.jones2 at hp.com
Mon Jan 24 19:01:45 UTC 2011
Michael S. Tsirkin wrote:
> On Mon, Jan 24, 2011 at 10:27:55AM -0800, Rick Jones wrote:
>
>>>Just to block netperf you can send it SIGSTOP :)
>>>
>>
>>Clever :) One could I suppose achieve the same result by making the
>>remote receive socket buffer size smaller than the UDP message size
>>and then not worry about having to learn the netserver's PID to send
>>it the SIGSTOP. I *think* the semantics will be substantially the
>>same?
>
>
> If you could set, it, yes. But at least linux ignores
> any value substantially smaller than 1K, and then
> multiplies that by 2:
>
> case SO_RCVBUF:
> /* Don't error on this BSD doesn't and if you think
> about it this is right. Otherwise apps have to
> play 'guess the biggest size' games. RCVBUF/SNDBUF
> are treated in BSD as hints */
>
> if (val > sysctl_rmem_max)
> val = sysctl_rmem_max;
> set_rcvbuf:
> sk->sk_userlocks |= SOCK_RCVBUF_LOCK;
>
> /*
> * We double it on the way in to account for
> * "struct sk_buff" etc. overhead. Applications
> * assume that the SO_RCVBUF setting they make will
> * allow that much actual data to be received on that
> * socket.
> *
> * Applications are unaware that "struct sk_buff" and
> * other overheads allocate from the receive buffer
> * during socket buffer allocation.
> *
> * And after considering the possible alternatives,
> * returning the value we actually used in getsockopt
> * is the most desirable behavior.
> */
> if ((val * 2) < SOCK_MIN_RCVBUF)
> sk->sk_rcvbuf = SOCK_MIN_RCVBUF;
> else
> sk->sk_rcvbuf = val * 2;
>
> and
>
> /*
> * Since sk_rmem_alloc sums skb->truesize, even a small frame might need
> * sizeof(sk_buff) + MTU + padding, unless net driver perform copybreak
> */
> #define SOCK_MIN_RCVBUF (2048 + sizeof(struct sk_buff))
Pity - seems to work back on 2.6.26:
raj at tardy:~/netperf2_trunk$ src/netperf -t UDP_STREAM -- -S 1 -m 1024
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost
(127.0.0.1) port 0 AF_INET : histogram
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
124928 1024 10.00 2882334 0 2361.17
256 10.00 0 0.00
raj at tardy:~/netperf2_trunk$ uname -a
Linux tardy 2.6.26-2-amd64 #1 SMP Sun Jun 20 20:16:30 UTC 2010 x86_64 GNU/Linux
Still, even with that (or SIGSTOP) we don't really know where the packets were
dropped right? There is no guarantee they weren't dropped before they got to
the socket buffer
happy benchmarking,
rick jones
PS - here is with a -S 1024 option:
raj at tardy:~/netperf2_trunk$ src/netperf -t UDP_STREAM -- -S 1024 -m 1024
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost
(127.0.0.1) port 0 AF_INET : histogram
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
124928 1024 10.00 1679269 0 1375.64
2048 10.00 1490662 1221.13
showing that there is a decent chance that many of the frames were dropped at
the socket buffer, but not all - I suppose I could/should be checking netstat
stats... :)
And just a little more, only because I was curious :)
raj at tardy:~/netperf2_trunk$ src/netperf -t UDP_STREAM -- -S 1M -m 257
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost
(127.0.0.1) port 0 AF_INET : histogram
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
124928 257 10.00 1869134 0 384.29
262142 10.00 1869134 384.29
raj at tardy:~/netperf2_trunk$ src/netperf -t UDP_STREAM -- -S 1 -m 257
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to localhost
(127.0.0.1) port 0 AF_INET : histogram
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
124928 257 10.00 3076363 0 632.49
256 10.00 0 0.00
More information about the dev
mailing list