tunnel upstream is unusably slow

Ortwin Glück odi at odi.ch
Thu Apr 3 04:10:39 EDT 2014



On 02.04.2014 18:17, David Woodhouse wrote:
> On Wed, 2014-04-02 at 17:58 +0200, Ortwin Glück wrote:
>> I have just noticed that this is a regression in kernel 3.14! Works fine
>> in 3.12 and 3.13.
>>
>> Sorry to bother you. I will bisect and speak to kernel folks.
> 
> Does it go away if you
> 
> echo 0 > /proc/sys/net/ipv4/tcp_autocorking

No. That was my first idea too :-)

> 
>>
>>>> No.     Time     Source                Destination           Protocol    Length Info
>>>>    1100 0.214    tun-local             tun-remote            SSHv2    1280   Encrypted request packet len=1228
>>>>    1101 0.000    SSL-local             SSL-remote            TLSv1    1126   Application Data
>>>>    1102 0.000    SSL-local             SSL-remote            TLSv1    328    Application Data
>>>
>>> A packet is 'sent' over the tun interface. OpenConnect immediately sends
>>> it. It takes *two* packets to send it, since your MTU inside the tunnel
>>> is larger than your MTU outside the tunnel. 
>>
>> No matter what value I pass to --mtu I always end up with 2 packets -
>> just their sizes change. What do you suggest?
> 
> Hm, that's odd. You pass a *much* smaller MTU value and you actually see
> smaller packets like 1000 bytes on the tun device? And they're *still*
> split into multiple packets on the wire for the public network?

Yes they would be split into one larger and a smaller chunk.

> Does that misbehaviour *also* persist with 3.13?

In 3.13 that looks entirely different. Here I get nice huge frames
(chopped up by the NIC with segmentation offload)

18:31:10.798668 IP SSL-local.40251 > SSL-remote.https: Flags [.], seq
2471220:2475508, ack 84847, win 65535, length 4288


> Btw, you mentioned the fact that OpenConnect allocates packets for each
> connection and copies data around. That's true only for the SSL
> connection; we expect to be using compression there so I don't bother
> with the zero-copy on that path. For DTLS the path is a lot more
> efficient and *shouldn't* involve data copies. We allocate a buffer in
> advance while we're waiting for data to arrive on the tun or dtls
> socket, we receive into that buffer and then send from it.

OK, nice!



More information about the openconnect-devel mailing list