From 61f8d0642d4ebdb5f3cae77828ab09563da3c007 Mon Sep 17 00:00:00 2001 From: Howard Huang Date: Thu, 30 Mar 2023 11:33:21 -0700 Subject: [PATCH] Allow ports to be reused in gloo (#97677) Summary: X-link: https://github.com/pytorch/pytorch/pull/97677 Pull Request resolved: https://github.com/facebookincubator/gloo/pull/353 ProcessGroupGloo and gloo seem to be opening and closing sockets without allowing the port to be reused. We see this issue pop up in larger training jobs "Address already in use" and we assume it to be because all the ephemeral ports are exhausted. This diff allows ports to be reused, we see a reduced number of ports being in `TIME_WAIT` state. context: https://fb.workplace.com/groups/319878845696681/permalink/5988899781205532/ another issue: https://fb.workplace.com/groups/319878845696681/permalink/958768178474408/ Differential Revision: D44029927 fbshipit-source-id: 4a1483d0eceda01ffd02c7747282129f7f4a2efe --- gloo/transport/tcp/device.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/gloo/transport/tcp/device.cc b/gloo/transport/tcp/device.cc index 481d67f7d..37762c8ea 100644 --- a/gloo/transport/tcp/device.cc +++ b/gloo/transport/tcp/device.cc @@ -101,6 +101,15 @@ static void lookupAddrForHostname(struct attr& attr) { struct addrinfo* rp; for (rp = result; rp != nullptr; rp = rp->ai_next) { auto fd = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + + // Set SO_REUSEADDR to signal that reuse of the listening port is OK. + int on = 1; + rv = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&on), sizeof(on)); + if (rv == -1) { + close(fd); + GLOO_ENFORCE_NE(rv, -1); + } + if (fd == -1) { continue; }