in reply to limiting the amount of sockets opened by f

To me it sounds like there could be a way to "reuse" sockets since the transfers do not happen in parallell but sequentially.

Each FTP transfer (including transfers of directory listings) uses a new connection. Net::FTP cannot act differently.

That said, it shouldn't have more than two sockets open at a time. If it has 1,500 open sockets, something isn't right. Or do you mean sockets in the TIME_WAIT state?

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

Replies are listed 'Best First'.
Re^2: limiting the amount of sockets opened by f
by Faile (Novice) on Feb 14, 2012 at 08:45 UTC

    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 .

      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.