Slide 1

Slide 1 text

Linux Port Sharding @joewalnes

Slide 2

Slide 2 text

Wat?

Slide 3

Slide 3 text

Linux Kernel 3.9 introduced new socket option SO_REUSEPORT

Slide 4

Slide 4 text

Allows multiple processes to listen on same port Linux Kernel Process Clients Process Process Kernel distributes incoming connections

Slide 5

Slide 5 text

Why? Spread socket event loop across multiple CPU cores requests / sec NGINX, 36 core AWS instance Source: https:/ /www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/

Slide 6

Slide 6 text

But it has another trick… Rolling upgrades

Slide 7

Slide 7 text

Rolling upgrades Linux Kernel MyServer version 1 Clients

Slide 8

Slide 8 text

Rolling upgrades Linux Kernel MyServer version 1 Clients Let’s upgrade a server application

Slide 9

Slide 9 text

Rolling upgrades Linux Kernel MyServer version 1 Clients MyServer version 2 Start new version: accepts request alongside old

Slide 10

Slide 10 text

Rolling upgrades Linux Kernel MyServer version 1 Clients MyServer version 2 Signal old version to stop accepting new requests

Slide 11

Slide 11 text

Rolling upgrades Linux Kernel Clients MyServer version 2 Old version terminates when done with requests

Slide 12

Slide 12 text

from socket import * port = 1234 server = socket(AF_INET, SOCK_STREAM) server.bind(('', port)) server.listen(0) while True: client, addr = server.accept() data = client.recv(1024) # echo data back client.send(data) client.close() server.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) require "socket" port = 1234 server = Socket.new Socket::AF_INET, Socket::SOCK_STREAM server.bind Addrinfo.tcp "", port server.listen 0 loop do client, addr = server.accept data = client.recv 1024 # echo data back client.send data, 0 client.close end Ruby edition Python edition Using it server.setsockopt Socket::SOL_SOCKET, Socket::SO_REUSEPORT, true

Slide 13

Slide 13 text

@joewalnes Caveats: Don’t confuse this with the BSD SO_REUSEPORT option of exactly the same name (it won’t work on OSX) Also it’s not SO_REUSEADDR Sharing is not very smart: kernel still passes to process even when slow at accepting connections More on SO_REUSEPORT → https:/ /lwn.net/Articles/542629/ Try it → https:/ /github.com/joewalnes/port-sharding