About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Documentation / networking / rds.txt

Custom Search

Based on kernel version 4.8. Page generated on 2016-10-06 23:18 EST.

2	Overview
3	========
5	This readme tries to provide some background on the hows and whys of RDS,
6	and will hopefully help you find your way around the code.
8	In addition, please see this email about RDS origins:
9	http://oss.oracle.com/pipermail/rds-devel/2007-November/000228.html
11	RDS Architecture
12	================
14	RDS provides reliable, ordered datagram delivery by using a single
15	reliable connection between any two nodes in the cluster. This allows
16	applications to use a single socket to talk to any other process in the
17	cluster - so in a cluster with N processes you need N sockets, in contrast
18	to N*N if you use a connection-oriented socket transport like TCP.
20	RDS is not Infiniband-specific; it was designed to support different
21	transports.  The current implementation used to support RDS over TCP as well
22	as IB.
24	The high-level semantics of RDS from the application's point of view are
26	 *	Addressing
27	        RDS uses IPv4 addresses and 16bit port numbers to identify
28	        the end point of a connection. All socket operations that involve
29	        passing addresses between kernel and user space generally
30	        use a struct sockaddr_in.
32	        The fact that IPv4 addresses are used does not mean the underlying
33	        transport has to be IP-based. In fact, RDS over IB uses a
34	        reliable IB connection; the IP address is used exclusively to
35	        locate the remote node's GID (by ARPing for the given IP).
37	        The port space is entirely independent of UDP, TCP or any other
38	        protocol.
40	 *	Socket interface
41	        RDS sockets work *mostly* as you would expect from a BSD
42	        socket. The next section will cover the details. At any rate,
43	        all I/O is performed through the standard BSD socket API.
44	        Some additions like zerocopy support are implemented through
45	        control messages, while other extensions use the getsockopt/
46	        setsockopt calls.
48	        Sockets must be bound before you can send or receive data.
49	        This is needed because binding also selects a transport and
50	        attaches it to the socket. Once bound, the transport assignment
51	        does not change. RDS will tolerate IPs moving around (eg in
52	        a active-active HA scenario), but only as long as the address
53	        doesn't move to a different transport.
55	 *	sysctls
56	        RDS supports a number of sysctls in /proc/sys/net/rds
59	Socket Interface
60	================
63		AF_RDS and PF_RDS are the domain type to be used with socket(2)
64		to create RDS sockets. SOL_RDS is the socket-level to be used
65		with setsockopt(2) and getsockopt(2) for RDS specific socket
66		options.
68	  fd = socket(PF_RDS, SOCK_SEQPACKET, 0);
69	        This creates a new, unbound RDS socket.
71	  setsockopt(SOL_SOCKET): send and receive buffer size
72	        RDS honors the send and receive buffer size socket options.
73	        You are not allowed to queue more than SO_SNDSIZE bytes to
74	        a socket. A message is queued when sendmsg is called, and
75	        it leaves the queue when the remote system acknowledges
76	        its arrival.
78	        The SO_RCVSIZE option controls the maximum receive queue length.
79	        This is a soft limit rather than a hard limit - RDS will
80	        continue to accept and queue incoming messages, even if that
81	        takes the queue length over the limit. However, it will also
82	        mark the port as "congested" and send a congestion update to
83	        the source node. The source node is supposed to throttle any
84	        processes sending to this congested port.
86	  bind(fd, &sockaddr_in, ...)
87	        This binds the socket to a local IP address and port, and a
88	        transport, if one has not already been selected via the
89		SO_RDS_TRANSPORT socket option
91	  sendmsg(fd, ...)
92	        Sends a message to the indicated recipient. The kernel will
93	        transparently establish the underlying reliable connection
94	        if it isn't up yet.
96	        An attempt to send a message that exceeds SO_SNDSIZE will
97	        return with -EMSGSIZE
99	        An attempt to send a message that would take the total number
100	        of queued bytes over the SO_SNDSIZE threshold will return
101	        EAGAIN.
103	        An attempt to send a message to a destination that is marked
104	        as "congested" will return ENOBUFS.
106	  recvmsg(fd, ...)
107	        Receives a message that was queued to this socket. The sockets
108	        recv queue accounting is adjusted, and if the queue length
109	        drops below SO_SNDSIZE, the port is marked uncongested, and
110	        a congestion update is sent to all peers.
112	        Applications can ask the RDS kernel module to receive
113	        notifications via control messages (for instance, there is a
114	        notification when a congestion update arrived, or when a RDMA
115	        operation completes). These notifications are received through
116	        the msg.msg_control buffer of struct msghdr. The format of the
117	        messages is described in manpages.
119	  poll(fd)
120	        RDS supports the poll interface to allow the application
121	        to implement async I/O.
123	        POLLIN handling is pretty straightforward. When there's an
124	        incoming message queued to the socket, or a pending notification,
125	        we signal POLLIN.
127	        POLLOUT is a little harder. Since you can essentially send
128	        to any destination, RDS will always signal POLLOUT as long as
129	        there's room on the send queue (ie the number of bytes queued
130	        is less than the sendbuf size).
132	        However, the kernel will refuse to accept messages to
133	        a destination marked congested - in this case you will loop
134	        forever if you rely on poll to tell you what to do.
135	        This isn't a trivial problem, but applications can deal with
136	        this - by using congestion notifications, and by checking for
137	        ENOBUFS errors returned by sendmsg.
139	  setsockopt(SOL_RDS, RDS_CANCEL_SENT_TO, &sockaddr_in)
140	        This allows the application to discard all messages queued to a
141	        specific destination on this particular socket.
143	        This allows the application to cancel outstanding messages if
144	        it detects a timeout. For instance, if it tried to send a message,
145	        and the remote host is unreachable, RDS will keep trying forever.
146	        The application may decide it's not worth it, and cancel the
147	        operation. In this case, it would use RDS_CANCEL_SENT_TO to
148	        nuke any pending messages.
150	  setsockopt(fd, SOL_RDS, SO_RDS_TRANSPORT, (int *)&transport ..)
151	  getsockopt(fd, SOL_RDS, SO_RDS_TRANSPORT, (int *)&transport ..)
152		Set or read an integer defining  the underlying
153		encapsulating transport to be used for RDS packets on the
154		socket. When setting the option, integer argument may be
155		one of RDS_TRANS_TCP or RDS_TRANS_IB. When retrieving the
156		value, RDS_TRANS_NONE will be returned on an unbound socket.
157		This socket option may only be set exactly once on the socket,
158		prior to binding it via the bind(2) system call. Attempts to
159		set SO_RDS_TRANSPORT on a socket for which the transport has
160		been previously attached explicitly (by SO_RDS_TRANSPORT) or
161		implicitly (via bind(2)) will return an error of EOPNOTSUPP.
162		An attempt to set SO_RDS_TRANSPPORT to RDS_TRANS_NONE will
163		always return EINVAL.
165	RDMA for RDS
166	============
168	  see rds-rdma(7) manpage (available in rds-tools)
171	Congestion Notifications
172	========================
174	  see rds(7) manpage
177	RDS Protocol
178	============
180	  Message header
182	    The message header is a 'struct rds_header' (see rds.h):
183	    Fields:
184	      h_sequence:
185	          per-packet sequence number
186	      h_ack:
187	          piggybacked acknowledgment of last packet received
188	      h_len:
189	          length of data, not including header
190	      h_sport:
191	          source port
192	      h_dport:
193	          destination port
194	      h_flags:
195	          CONG_BITMAP - this is a congestion update bitmap
196	          ACK_REQUIRED - receiver must ack this packet
197	          RETRANSMITTED - packet has previously been sent
198	      h_credit:
199	          indicate to other end of connection that
200	          it has more credits available (i.e. there is
201	          more send room)
202	      h_padding[4]:
203	          unused, for future use
204	      h_csum:
205	          header checksum
206	      h_exthdr:
207	          optional data can be passed here. This is currently used for
208	          passing RDMA-related information.
210	  ACK and retransmit handling
212	      One might think that with reliable IB connections you wouldn't need
213	      to ack messages that have been received.  The problem is that IB
214	      hardware generates an ack message before it has DMAed the message
215	      into memory.  This creates a potential message loss if the HCA is
216	      disabled for any reason between when it sends the ack and before
217	      the message is DMAed and processed.  This is only a potential issue
218	      if another HCA is available for fail-over.
220	      Sending an ack immediately would allow the sender to free the sent
221	      message from their send queue quickly, but could cause excessive
222	      traffic to be used for acks. RDS piggybacks acks on sent data
223	      packets.  Ack-only packets are reduced by only allowing one to be
224	      in flight at a time, and by the sender only asking for acks when
225	      its send buffers start to fill up. All retransmissions are also
226	      acked.
228	  Flow Control
230	      RDS's IB transport uses a credit-based mechanism to verify that
231	      there is space in the peer's receive buffers for more data. This
232	      eliminates the need for hardware retries on the connection.
234	  Congestion
236	      Messages waiting in the receive queue on the receiving socket
237	      are accounted against the sockets SO_RCVBUF option value.  Only
238	      the payload bytes in the message are accounted for.  If the
239	      number of bytes queued equals or exceeds rcvbuf then the socket
240	      is congested.  All sends attempted to this socket's address
241	      should return block or return -EWOULDBLOCK.
243	      Applications are expected to be reasonably tuned such that this
244	      situation very rarely occurs.  An application encountering this
245	      "back-pressure" is considered a bug.
247	      This is implemented by having each node maintain bitmaps which
248	      indicate which ports on bound addresses are congested.  As the
249	      bitmap changes it is sent through all the connections which
250	      terminate in the local address of the bitmap which changed.
252	      The bitmaps are allocated as connections are brought up.  This
253	      avoids allocation in the interrupt handling path which queues
254	      sages on sockets.  The dense bitmaps let transports send the
255	      entire bitmap on any bitmap change reasonably efficiently.  This
256	      is much easier to implement than some finer-grained
257	      communication of per-port congestion.  The sender does a very
258	      inexpensive bit test to test if the port it's about to send to
259	      is congested or not.
262	RDS Transport Layer
263	==================
265	  As mentioned above, RDS is not IB-specific. Its code is divided
266	  into a general RDS layer and a transport layer.
268	  The general layer handles the socket API, congestion handling,
269	  loopback, stats, usermem pinning, and the connection state machine.
271	  The transport layer handles the details of the transport. The IB
272	  transport, for example, handles all the queue pairs, work requests,
273	  CM event handlers, and other Infiniband details.
276	RDS Kernel Structures
277	=====================
279	  struct rds_message
280	    aka possibly "rds_outgoing", the generic RDS layer copies data to
281	    be sent and sets header fields as needed, based on the socket API.
282	    This is then queued for the individual connection and sent by the
283	    connection's transport.
284	  struct rds_incoming
285	    a generic struct referring to incoming data that can be handed from
286	    the transport to the general code and queued by the general code
287	    while the socket is awoken. It is then passed back to the transport
288	    code to handle the actual copy-to-user.
289	  struct rds_socket
290	    per-socket information
291	  struct rds_connection
292	    per-connection information
293	  struct rds_transport
294	    pointers to transport-specific functions
295	  struct rds_statistics
296	    non-transport-specific statistics
297	  struct rds_cong_map
298	    wraps the raw congestion bitmap, contains rbnode, waitq, etc.
300	Connection management
301	=====================
303	  Connections may be in UP, DOWN, CONNECTING, DISCONNECTING, and
304	  ERROR states.
306	  The first time an attempt is made by an RDS socket to send data to
307	  a node, a connection is allocated and connected. That connection is
308	  then maintained forever -- if there are transport errors, the
309	  connection will be dropped and re-established.
311	  Dropping a connection while packets are queued will cause queued or
312	  partially-sent datagrams to be retransmitted when the connection is
313	  re-established.
316	The send path
317	=============
319	  rds_sendmsg()
320	    struct rds_message built from incoming data
321	    CMSGs parsed (e.g. RDMA ops)
322	    transport connection alloced and connected if not already
323	    rds_message placed on send queue
324	    send worker awoken
325	  rds_send_worker()
326	    calls rds_send_xmit() until queue is empty
327	  rds_send_xmit()
328	    transmits congestion map if one is pending
329	    may set ACK_REQUIRED
330	    calls transport to send either non-RDMA or RDMA message
331	    (RDMA ops never retransmitted)
332	  rds_ib_xmit()
333	    allocs work requests from send ring
334	    adds any new send credits available to peer (h_credits)
335	    maps the rds_message's sg list
336	    piggybacks ack
337	    populates work requests
338	    post send to connection's queue pair
340	The recv path
341	=============
343	  rds_ib_recv_cq_comp_handler()
344	    looks at write completions
345	    unmaps recv buffer from device
346	    no errors, call rds_ib_process_recv()
347	    refill recv ring
348	  rds_ib_process_recv()
349	    validate header checksum
350	    copy header to rds_ib_incoming struct if start of a new datagram
351	    add to ibinc's fraglist
352	    if competed datagram:
353	      update cong map if datagram was cong update
354	      call rds_recv_incoming() otherwise
355	      note if ack is required
356	  rds_recv_incoming()
357	    drop duplicate packets
358	    respond to pings
359	    find the sock associated with this datagram
360	    add to sock queue
361	    wake up sock
362	    do some congestion calculations
363	  rds_recvmsg
364	    copy data into user iovec
365	    handle CMSGs
366	    return to application
368	Multipath RDS (mprds)
369	=====================
370	  Mprds is multipathed-RDS, primarily intended for RDS-over-TCP
371	  (though the concept can be extended to other transports). The classical
372	  implementation of RDS-over-TCP is implemented by demultiplexing multiple
373	  PF_RDS sockets between any 2 endpoints (where endpoint == [IP address,
374	  port]) over a single TCP socket between the 2 IP addresses involved. This
375	  has the limitation that it ends up funneling multiple RDS flows over a
376	  single TCP flow, thus it is
377	  (a) upper-bounded to the single-flow bandwidth,
378	  (b) suffers from head-of-line blocking for all the RDS sockets.
380	  Better throughput (for a fixed small packet size, MTU) can be achieved
381	  by having multiple TCP/IP flows per rds/tcp connection, i.e., multipathed
382	  RDS (mprds).  Each such TCP/IP flow constitutes a path for the rds/tcp
383	  connection. RDS sockets will be attached to a path based on some hash
384	  (e.g., of local address and RDS port number) and packets for that RDS
385	  socket will be sent over the attached path using TCP to segment/reassemble
386	  RDS datagrams on that path.
388	  Multipathed RDS is implemented by splitting the struct rds_connection into
389	  a common (to all paths) part, and a per-path struct rds_conn_path. All
390	  I/O workqs and reconnect threads are driven from the rds_conn_path.
391	  Transports such as TCP that are multipath capable may then set up a
392	  TPC socket per rds_conn_path, and this is managed by the transport via
393	  the transport privatee cp_transport_data pointer.
395	  Transports announce themselves as multipath capable by setting the
396	  t_mp_capable bit during registration with the rds core module. When the
397	  transport is multipath-capable, rds_sendmsg() hashes outgoing traffic
398	  across multiple paths. The outgoing hash is computed based on the
399	  local address and port that the PF_RDS socket is bound to.
401	  Additionally, even if the transport is MP capable, we may be
402	  peering with some node that does not support mprds, or supports
403	  a different number of paths. As a result, the peering nodes need
404	  to agree on the number of paths to be used for the connection.
405	  This is done by sending out a control packet exchange before the
406	  first data packet. The control packet exchange must have completed
407	  prior to outgoing hash completion in rds_sendmsg() when the transport
408	  is mutlipath capable.
410	  The control packet is an RDS ping packet (i.e., packet to rds dest
411	  port 0) with the ping packet having a rds extension header option  of
412	  type RDS_EXTHDR_NPATHS, length 2 bytes, and the value is the
413	  number of paths supported by the sender. The "probe" ping packet will
414	  get sent from some reserved port, RDS_FLAG_PROBE_PORT (in <linux/rds.h>)
415	  The receiver of a ping from RDS_FLAG_PROBE_PORT will thus immediately
416	  be able to compute the min(sender_paths, rcvr_paths). The pong
417	  sent in response to a probe-ping should contain the rcvr's npaths
418	  when the rcvr is mprds-capable.
420	  If the rcvr is not mprds-capable, the exthdr in the ping will be
421	  ignored.  In this case the pong will not have any exthdrs, so the sender
422	  of the probe-ping can default to single-path mprds.
Hide Line Numbers
About Kernel Documentation Linux Kernel Contact Linux Resources Linux Blog

Information is copyright its respective author. All material is available from the Linux Kernel Source distributed under a GPL License. This page is provided as a free service by mjmwired.net.