Commit Graph

53948 Commits

Author SHA1 Message Date
Asias He
ead391491d net: Add rx test in tcp_server 2014-11-10 10:01:05 +02:00
Gleb Natapov
2a56c52fcb net: distribute udp packets according to address pair 2014-11-09 18:17:54 +02:00
Gleb Natapov
c64e1e27fb net: move connid out of tcp to be reused for udp 2014-11-09 18:17:44 +02:00
Gleb Natapov
25da340e07 net: remove rx feedback from proxy net device
99941f0c16 did that for virtio, do the
same for proxy here.
2014-11-09 18:07:14 +02:00
Gleb Natapov
136a56859f net: limit the number of packets that are waiting to be sent to another cpu
If packet arrive faster than they can be forwarded we can run out of
memory.
2014-11-09 18:06:22 +02:00
Nadav Har'El
fcce304908 collectd: Don't use the network stack before it is set up
The current code (this will change soon with my reactor patches)
constructs a default (Posix) network stack before reactore::configure()
reassigns it to the requested network stack.

It turns out there is one place we use the network stack before calling
reactore::configure(), which ends up using the Posix stack even though
we want the native stack - this is both silly and plainly doesn't work on
the OSv setup.

The problem is that app_template.hh tries to configure scollectd before
the engine is started. This calls scollectd::impl::start() which calls
engine.net().make_udp_channel(). When this happens this early, it creates
a Posix socket...

This patch moves the scollectd configuration to after the engine is
started. It makes sense to me: As far as I understand, scollectd is all
about sending packets (diagnostic packets), and it's kind of silly to
start sending packets before starting the machinary which allows us to
send packets.

Signed-off-by: Nadav Har'El <nyh@cloudius-systems.com>
[avi: use customary indentation, remove unneeded make_ready_future()]
2014-11-09 17:46:09 +02:00
Tomasz Grabiec
39a688d173 memcache: udp: remove dead code 2014-11-09 17:03:37 +02:00
Tomasz Grabiec
6611160db1 smp: fix distributed::stop()
One problem was that 'inst' was const, another was that the vector was
not cleared which made ~distributed() to complain.
2014-11-09 16:47:16 +02:00
Tomasz Grabiec
48d57a6cd9 core: make distributed::start() capable of forwarding references 2014-11-09 16:34:14 +02:00
Tomasz Grabiec
b6511ce3f4 core: add future::discard_result()
Use when you don't want to care about the result and just want to
return a future<>.

The current implementation may not be the most optimal way to do it
but it can be improved later if there's need.
2014-11-09 16:33:34 +02:00
Tomasz Grabiec
761d6119ef posix: simplify uses of setsockopt 2014-11-09 16:33:33 +02:00
Tomasz Grabiec
bf774e1b92 posix: make setsockopt accept value via universal reference
It's more convenient for users that way. If someone wants to pass a
reference, we use a reference. If he passes an r-value, we accept it
and use parameter l-value instead.
2014-11-09 16:33:33 +02:00
Gleb Natapov
2ac24ced66 smp: smp queues idle polling
This patch adds "smp queue polling before going idle" to the reactor.
It allows to avoid signalfd overhead in case receiver thread is not idle
when message is sent. With this patch on top of two other patches from
me that are still waiting to be committed I see 450120 Requests/sec with
wrk and "httpd -c 2 --network-stack native" with native stack. With one
cpu the result is 316002, so we have around 40% scaling. The bottleneck
in this test is cpu 0 which takes 100% cpu time.
2014-11-09 16:26:27 +02:00
Avi Kivity
f265fe5ecd xen: allow disabling the split-event-channel feature for debugging 2014-11-09 16:19:37 +02:00
Avi Kivity
59a7eeeea0 dhcp: retry
Some bridges delay forwarding until some time has passed, which requires
DHCP retries.
2014-11-09 16:13:25 +02:00
Avi Kivity
adc97c0162 dhcp: filter out DHCP failures
If we don't, we start the system before we have an IP address, and when
we actually do get the IP address, we fail an assert on the _config promise,
which was already fulfilled.
2014-11-09 15:03:07 +02:00
Avi Kivity
5bb13601fe xen: wrap in "xen" namespace
Names like "port" are too generic for the global namespace.
2014-11-09 14:41:01 +02:00
Avi Kivity
fede31896c xen: mark port's constructor as explicit
Prevent accidental construction.
2014-11-09 14:36:06 +02:00
Avi Kivity
14968812fe xen: remove port::operator int()
It's dangerous as it can be invoked in unexpected places.
2014-11-09 14:34:25 +02:00
Avi Kivity
16b0013c6b xen: add port destructor
De-register from the port list.

Add a FIXME for unbinding the port from Xen.
2014-11-09 13:34:30 +02:00
Avi Kivity
46aac42704 xen: make 'port' a value object
Makes it easier of users to manage its lifetime.
2014-11-09 13:30:52 +02:00
Avi Kivity
f5a2dcd9ec xen: simplify evtchn port management
By switching from a map of a list of semaphores to a multimap of ports,
we have less indirection and things become more straightforward.
2014-11-09 13:14:23 +02:00
Avi Kivity
8857412365 xen: fix explicitly-disabled split event channel feature
In case the hypervisor supports the split event channel feature, but
advertises it as disabled, we must not assume it works.
2014-11-09 12:08:49 +02:00
Avi Kivity
b2af728f0e xen: provide xenstore::read_or_default()
This is useful for features that are provided incrementally, so may not
be present on all hypervisors.  If the value is not present, return a
user-provided default, which also has a system-provided default (0).
2014-11-09 12:07:31 +02:00
Glauber Costa
9a8cde5170 xen: have a list of semaphores per event channel
We current have one port per event channel. We need to have a list of
semaphores that will all be made ready when an interrupt kicks in. This is
useful in the case where both tx and rx are bound to the same event channel.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-09 11:54:10 +02:00
Glauber Costa
7ae3ab57d4 xen: change process_interrupts to take a port, rather than a semaphore
If we do that, plus make it an instance method, we should be able to use
make_ready_port. This is consistent with the userspace implementation and
from that point any changes there will be propagated to both.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-09 11:54:10 +02:00
Glauber Costa
ab3d02e347 xen: use a port class instead of an integer to represent an event channel
The representation of an event channel as an integer poses a problem, in which
waiting on an integer port doesn't work well when the same event channel is
assigned for both tx and rx. The future will be ready for one of the sides, but
we won't process the other.

One alternative is to have conditions in the future processing, and in case the
event channels are bound to the same port, process both events. But a better
solution is to use a class to represent the bound ports, and instances of those
classes will have their own pending methods.

Infrastructure will be written in a following patch to make sure that all
listeners to the same port will be made ready when an interrupt kicks in

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-09 11:54:08 +02:00
Glauber Costa
4dcc48c306 evtchn: allow to retrieve instance without parameters
gntalloc already has a method like this, code it for evtchn as well.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-09 11:54:07 +02:00
Glauber Costa
9cd9fda570 xen: don't take split feature for granted
The backend may be completely silent about the existence of the split channels feature.
In that case, trying to read through the template directly would cause an exception,
since we can't convert the empty string.

The backend-id, OTOH, is guaranteed to exist and wasn't using the template signature.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-09 11:54:06 +02:00
Avi Kivity
467ff9cbe2 xen: fix grant refernce leaks
We copy our grant reference into a temporary, so free_ref() does not
clear the real entry, causing an assert() to trigger later on.

Fix by capturing the grant reference entry by reference.

With this, the xen network driver survives multiple trips around the ring.
2014-11-07 14:26:00 +02:00
Avi Kivity
ee7ec972eb xen: request tx notification on tx completion
Otherwise, we never learn that transmission has completed and never
recycle ring entries.

This is still a little lame as we don't do any batching.
2014-11-07 14:26:00 +02:00
Avi Kivity
8a29d4a78a xen: replenish rx ring entries
Keep recycling free ring entries back into the receive ring so we can
receive more than 256 packets.

The code is a little lame at the moment since it writes the index and
notifies the host for every frame, but that can be adjusted later.
2014-11-07 14:25:58 +02:00
Avi Kivity
8dff32eea5 xen: simplify free grant table ref id management
There is no reason to wait when pushing back a free id - there is nothing
that could possibly block there.

Switch from a queue<> to an std::queue<> and use a semaphore to guard
popping from the queue.
2014-11-07 13:09:24 +02:00
Asias He
dbfd636a0b net: Fix proxy_net_device option parse
Running tcp stream test with --smp > 1, sometimes the server sends TSO
frame, sometimes it does not. If we set --smp = 1, the server always
sends TSO frame. This is because the proxy device does not parse all the
features in the opts. We should copy the _hw_features from the real
device but it is not easy. For now, we simply duplicate the parse code.
2014-11-07 11:17:33 +02:00
Asias He
ff674d3e0e tcp: Avoid unnecessary ACK
E.g. Avoid Dup ACK in packet #981

979 4.115432000 192.168.66.123 -> 192.168.66.100 TCP 20406
    [TCP Window Full] 10000 > 50112 [ACK] Seq=10675905 Ack=801512443 Win=3737600 Len=20352

980 4.119002000 192.168.66.100 -> 192.168.66.123 TCP 54
    [TCP ZeroWindow] 50112 > 10000 [ACK] Seq=801512443 Ack=10696257 Win=0 Len=0

981 4.119063000 192.168.66.123 -> 192.168.66.100 TCP 54
    [TCP Dup ACK 979#1] 10000 > 50112 [ACK] Seq=10696257 Ack=801512443 Win=3737600 Len=0

982 4.137244000 192.168.66.100 -> 192.168.66.123 TCP 54
    [TCP Window Update] 50112 > 10000 [ACK] Seq=801512443 Ack=10696257 Win=40704 Len=0
2014-11-07 11:17:33 +02:00
Asias He
5b994fb4f0 tcp: Fix _data_received_promise and _all_data_acked_promise
We should clear it right after we set value, otherwise we might set
value more than once.
2014-11-07 11:17:31 +02:00
Raphael S. Carvalho
3878d387f0 memcache: udp: allocate conversation state
Fix UDP for memcache with native stack

memcached: apps/memcached/memcached.cc:807:
void memcache::assert_resolved(future<>): Assertion `f.available()'
failed.

Tomek writes:
UDP path relied on the fact that handle() could not block, because
the output stream does not block, and passed references to variables
which live on stack. Since you now can block in handle_get(), this
no longer holds. We should chnage that, ie allocate conversation
state like we do in TCP.

Signed-off-by: Raphael S. Carvalho <raphaelsc@cloudius-systems.com>
2014-11-06 18:21:56 +02:00
Asias He
784bf7a7e2 tests: Rename class http_server to tcp_server 2014-11-06 17:06:10 +02:00
Tomasz Grabiec
26361873bc test_ascii_parser: fix potential use-after-free error 2014-11-06 15:48:31 +02:00
Asias He
1e40660248 net: Switch to optional for _data_received 2014-11-06 14:50:16 +02:00
Asias He
14130ab1e8 net: Fix TCP sending of bulk data
Fix tcp_server tx test. We still have more to do.

Native stack:
$ go run client-txtx.go
Bytes Received(MiB):  1000
Total Time(Secs):  1.567927562
Bandwidth(MiB/Sec):  637.7845662234746

Posix stack:
$ go run client-txtx.go
Bytes Received(MiB):  1000
Total Time(Secs):  1.014354958
Bandwidth(MiB/Sec):  985.8481906291427

Note: client-txtx uses 100 concurrent connections.
2014-11-06 14:50:12 +02:00
Asias He
2a582fd1a6 net: fix tso maximum packet size
With TSO enabled, we can see a Ethernet frame larger than 64K on tap
device. This makes wireshark unable to handle. It complains:

   The capture file appears to be damaged or corrupt.
   (pcapng_read_packet_block: cap_len 65549 is larger than
   WTAP_MAX_PACKET_SIZE 65535.)
2014-11-06 14:50:11 +02:00
Asias He
2e9366ba24 tests: Add send test to tcp_server
$ printf "txtx" | nc 192.168.66.123 10000

Server will send a large mount of data to client for TCP tx testing.
Currently, it sends 10MB of char 'X'.
2014-11-06 14:49:53 +02:00
Avi Kivity
4df81e0fba Merge branch 'glommer/xen' of github.com:cloudius-systems/seastar-dev
From Glauber:

"This is all the xen work I have. There is still improvements to be made with
the ring management, memory allocation, and other areas."
2014-11-06 12:45:30 +02:00
Glauber Costa
6c0aaa126c xen: grant recycle
handle buffer recycles. Right now it is very simple: allocate a new receive
buffer after a succesful receival, and mark the tx spot free when we get the tx
event notification.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:22:15 +01:00
Glauber Costa
3d0f2de8bb xen: method to end a grant operation
Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:21:30 +01:00
Glauber Costa
0a1f5f9e73 xen: defer grant table operations
Instead of returning a reference to a grant that is already present in an
array, defer the initialization. This is how the OSv driver handles it, and I
honestly am not sure if this is really needed: it seems to me we should be able
to just reuse the old grants. I need to check in the backend code if we can be
any smarter than this.

However, right now we need to do something to recycle the buffers, and just
re-doing the refs would lead to inconsistencies. So the best by now is to close
and reopen the grants, and then later on rework this in a way that works for
both the initial setup and the recycle.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:21:30 +01:00
Glauber Costa
722926d545 xen: factor out allocation of a single rx entry
I'll need this code later to refill the buffer, so factor this out

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:21:30 +01:00
Glauber Costa
01c861fba4 xen: don't increment producer index in receive path
Right now, we allocate the whole index, and notify the backend that we have
produced nr_ents indexes. If we do that, we cannot increment the producer index
when we receive a new package. This would make the index overflow, and
basically, it is the responsible for the biggest part of the slowdown we are
seeing.

Before this patch, we're seeing 2s RTT for pings. After the patch:

64 bytes from 192.168.100.79: icmp_seq=1 ttl=64 time=0.437 ms
64 bytes from 192.168.100.79: icmp_seq=2 ttl=64 time=0.431 ms
64 bytes from 192.168.100.79: icmp_seq=3 ttl=64 time=0.475 ms

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:21:29 +01:00
Glauber Costa
ae1122bfc8 xen: manage index list
Aside from managing the grant references, we also need to manage the positional
indexes in the array. We need to keep track of which indexes are free, and
which are used. Because we need the actual position number to fill xen's data
structures, I figured we could use a queue and then fill it up with all the
integers in our range. The queue is already futurized, so that's easy.

Signed-off-by: Glauber Costa <glommer@cloudius-systems.com>
2014-11-06 11:21:29 +01:00