SO_REUSEPORT: strange kernel balancer behaviour

trafdev trafdev at mail.ru
Sat Jul 13 05:18:29 UTC 2013


Hello.

Could someone help with following problem of SO_REUSEPORT.

Created server:

int sockd_acceptor_;
...

if ((sockd_acceptor_ = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
         LOG4CXX_ERROR_ERRNO(kLogger, "socket");
         return false;
     }
     struct sockaddr_in sa_in;
     memset(&sa_in, 0, sizeof(sa_in));
     sa_in.sin_family = AF_INET;
     sa_in.sin_port = htons(port);
     sa_in.sin_addr.s_addr = htonl(INADDR_ANY);
     int yes = 1;
     if (setsockopt(sockd_acceptor_, SOL_SOCKET, SO_REUSEPORT, &yes, 
sizeof (yes)) == -1) {
         LOG4CXX_ERROR_ERRNO(kLogger, "setsockopt");
         return false;
     }
     if (bind(sockd_acceptor_, (const struct sockaddr*)&sa_in, 
sizeof(sa_in)) == -1) {
         LOG4CXX_ERROR_ERRNO(kLogger, "bind");
         return false;
     }

     if (listen(sockd_acceptor_, listen_backlog) == -1) {
         LOG4CXX_ERROR_ERRNO(kLogger, "socket listen");
         return false;
     }
     if (!fcntl_set(sockd_acceptor_, O_NONBLOCK))
         return false;

Then libev is used as async dispatcher.

Server process 1 started, server process 2 started.
Everything is good so far, no bind errors.

Client started.

Server process 1 starts to reply, process 2 gets no requests yet.
This happens until process 1 is killed. Immediately after that process 2 
starts to respond (gets requests from client).

So it looks like there is a deque of processes sharing same port 
(SO_REUSEPORT) and only one process may respond.
Is this an expected behavior?


More information about the freebsd-net mailing list