in reply to Re: limiting the amount of sockets opened by f
in thread limiting the amount of sockets opened by f

Regarding TIME_WAIT, you got me there, I didn't actually suspect they might be closed and timing out, is this normal behaviour? Are there any ways for me to report number of sockets being kept open within perl?

This problem report came to me from a sysadmin complaining to me that when my script runs, there's tons of sockets everywhere and other processes are acting strangely, like an ftp server being intermittently unresponsive .

  • Comment on Re^2: limiting the amount of sockets opened by f

Replies are listed 'Best First'.
Re^3: limiting the amount of sockets opened by f
by ikegami (Patriarch) on Feb 14, 2012 at 20:24 UTC

    Regarding TIME_WAIT, you got me there, I didn't actually suspect they might be closed and timing out, is this normal behaviour?

    Yes. A TCP port is marked as unavailable (TIME_WAIT) for an amount of time after being closed to avoid having a delayed packet from one connection affect a later connection on the same port. This can be disabled on a per-socket basis (at least).

    Are there any ways for me to report number of sockets being kept open within perl?

    I sure there is, but I don't know what tools are available.

    On some systems, you could peek into /proc/$$/fd/ ($$ representing the process's PID). You'll see open file handles, which includes open sockets.

    $ perl -MIO::Socket::INET -E' system "ls -lF /proc/$$/fd/"; my $s = IO::Socket::INET->new("www.google.com:80") or die $!; system "ls -lF /proc/$$/fd/"; ' total 0 lrwx------ 1 eric users 64 Feb 14 15:22 0 -> /dev/pts/7 lrwx------ 1 eric users 64 Feb 14 15:22 1 -> /dev/pts/7 lrwx------ 1 eric users 64 Feb 14 15:22 2 -> /dev/pts/7 lr-x------ 1 eric users 64 Feb 14 15:22 3 -> pipe:[2358130] total 0 lrwx------ 1 eric users 64 Feb 14 15:22 0 -> /dev/pts/7 lrwx------ 1 eric users 64 Feb 14 15:22 1 -> /dev/pts/7 lrwx------ 1 eric users 64 Feb 14 15:22 2 -> /dev/pts/7 lr-x------ 1 eric users 64 Feb 14 15:22 3 -> socket:[2358143] lr-x------ 1 eric users 64 Feb 14 15:22 4 -> pipe:[2358144]

    (0,1,2 = std*. The pipe is used by system to communicate exec failures to the parent.)

    Update: netstat on my machine has a -p option that shows the PID of the process that owns the socket.