kernel Linux> = 3.9 permettono la condivisione delle prese tra i processi con in-kernel bilanciamento del carico impostando SO_REUSEPORT
: http://lwn.net/Articles/542629/È possibile utilizzare SO_REUSEPORT su socket di dominio Unix?
Come può essere utilizzato per prese di tipo AF_UNIX
?
Sembra, funziona solo con TCP, non con socket di dominio Unix.
Ecco un programma di test Python:
import os
import socket
if not hasattr(socket, 'SO_REUSEPORT'):
socket.SO_REUSEPORT = 15
if True:
# using TCP sockets
# works. test with: "echo data | nc localhost 8888"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
s.bind(('', 8888))
else:
# using Unix domain sockets
# does NOT work. test with: "echo data | nc -U /tmp/socket1"
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
try:
os.unlink("/tmp/socket1")
except:
pass
s.bind("/tmp/socket1")
s.listen(1)
while True:
conn, addr = s.accept()
print('Connected to {}'.format(os.getpid()))
data = conn.recv(1024)
conn.send(data)
conn.close()
Start 2 casi, e il test eseguendo i seguenti più volte:
echo data | nc localhost 8888
per TCPecho data | nc -U /tmp/socket1
per socket di dominio Unix
Quando si utilizza TCP, l'arrivo i client saranno bilanciati con entrambi i server. Con i socket di dominio Unix, tutti i client in arrivo si collegano all'ultimo server avviato.
Prima frase dell'articolo che si riferisce: 'Una delle funzionalità unite nel ciclo di sviluppo 3.9 era il supporto TCP e UDP per l'opzione socket SO_REUSEPORT'. Sembra essere supportato solo per TCP e UDP. –
Non ho una risposta esatta ma sembra che il kernel non abbia mezzi per bilanciare il carico dei socket UNIX. Questo ha molte informazioni utili: http://stackoverflow.com/questions/14388706/socket-options-so-reuseaddr-and-so-reuseport-how-do-the-differ-do-the-mean-t –
@AlexShkop Grazie! FWIW, posso impostare l'opzione su UDS e questo consentirà a più processi di aprire lo stesso UDS (ascolto). Quando l'opzione non è impostata, non consente di farlo. Tuttavia, non carica il bilanciamento. Sto cercando una risposta autorevole che supporti il comportamento osservato o mostri come eseguire l'UDS condiviso bilanciato LB. – oberstet