Skip to content

net/http: File descriptor leakage #20413

Closed
@magisterquis

Description

@magisterquis

Please answer these questions before submitting your issue. Thanks!

What version of Go are you using (go version)?

go version go1.8.1 openbsd/amd64

What operating system and processor architecture are you using (go env)?

GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="openbsd"
GOOS="openbsd"
GOPATH="/home/stuart/go"
GORACE=""
GOROOT="/home/stuart/.go/1.8.1"
GOTOOLDIR="/home/stuart/.go/1.8.1/pkg/tool/openbsd_amd64"
GCCGO="gccgo"
CC="gcc"
GOGCCFLAGS="-fPIC -m64 -fmessage-length=0"
CXX="g++"
CGO_ENABLED="0"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"

What did you do?

Build Host:

GOOS=linux go build -o f.linux.amd64 f.go

Execution Host:

./f.linux.amd64

Code: http://play.golang.org/p/gKiRi7x6V5

What did you expect to see?

HTTP requests, and file descriptors deallocated.

What did you see instead?

File descriptors are not released. lsof -Pnp <pid> indicates sockets hang around once they're no longer in a CLOSE_WAIT state.

$ lsof -Pnp 19380
COMMAND     PID            USER   FD      TYPE   DEVICE SIZE/OFF     NODE NAME
f.linux.a 19380 stuart  cwd       DIR    253,3     4096 75497664 /home/stuart.mcmurray
f.linux.a 19380 stuart  rtd       DIR    253,3     4096      128 /
f.linux.a 19380 stuart  txt       REG    253,3  5523864 75509093 /home/stuart.mcmurray/f.linux.amd64
f.linux.a 19380 stuart    0u      CHR    136,0      0t0        3 /dev/pts/0
f.linux.a 19380 stuart    1u      CHR    136,0      0t0        3 /dev/pts/0
f.linux.a 19380 stuart    2u      CHR    136,0      0t0        3 /dev/pts/0
f.linux.a 19380 stuart    3u     sock      0,6      0t0 48758872 protocol: TCP
f.linux.a 19380 stuart    4r      CHR      1,9      0t0     1033 /dev/urandom
f.linux.a 19380 stuart    5u  a_inode      0,9        0     5719 [eventpoll]
f.linux.a 19380 stuart    6u     sock      0,6      0t0 48753565 protocol: TCP
f.linux.a 19380 stuart    7u     sock      0,6      0t0 48753578 protocol: TCP
f.linux.a 19380 stuart    8u     sock      0,6      0t0 48757923 protocol: TCP
f.linux.a 19380 stuart    9u     sock      0,6      0t0 48757941 protocol: TCP
f.linux.a 19380 stuart   10u     sock      0,6      0t0 48757954 protocol: TCP
f.linux.a 19380 stuart   11u     IPv4 48757964      0t0      TCP 10.40.15.176:49254->52.23.67.15:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   12u     sock      0,6      0t0 48758954 protocol: TCP
f.linux.a 19380 stuart   13u     sock      0,6      0t0 48758964 protocol: TCP
f.linux.a 19380 stuart   14u     sock      0,6      0t0 48757994 protocol: TCP
f.linux.a 19380 stuart   15u     sock      0,6      0t0 48759828 protocol: TCP
f.linux.a 19380 stuart   16u     IPv4 48756119      0t0      TCP 10.40.15.176:49259->52.23.67.15:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   17u     IPv4 48756125      0t0      TCP 10.40.15.176:52080->34.197.186.182:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   18u     IPv4 48758042      0t0      TCP 10.40.15.176:49261->52.23.67.15:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   19u     IPv4 48759033      0t0      TCP 10.40.15.176:38018->107.23.175.12:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   20u     IPv4 48758057      0t0      TCP 10.40.15.176:37774->34.192.54.247:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   21u     IPv4 48756183      0t0      TCP 10.40.15.176:38020->107.23.175.12:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   22u     IPv4 48759062      0t0      TCP 10.40.15.176:49265->52.23.67.15:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   23u     IPv4 48758075      0t0      TCP 10.40.15.176:37777->34.192.54.247:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   24u     IPv4 48759073      0t0      TCP 10.40.15.176:37778->34.192.54.247:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   25u     IPv4 48758086      0t0      TCP 10.40.15.176:38024->107.23.175.12:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   26u     IPv4 48759088      0t0      TCP 10.40.15.176:52089->34.197.186.182:443 (CLOSE_WAIT)
f.linux.a 19380 stuart   27u     IPv4 48758103      0t0      TCP 10.40.15.176:38026->107.23.175.12:443 (CLOSE_WAIT)
-snip-

It seems net/http doesn't close file descriptors when it's done with them. The fd ulimit is set to 1024.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions