What triggers "No Buffer Space Available"?
Robert Watson
rwatson at FreeBSD.org
Fri May 4 09:49:20 UTC 2007
On Thu, 3 May 2007, Marc G. Fournier wrote:
> 'k, all I'm looking at right now is the Unix Domain Sockets, and the output
> of netstat -> sockstat is growing since I first started counting both ..
>
> This was shortly after reboot:
>
> mars# netstat -A | grep stream | wc -l ; sockstat -u | wc -l
> 2705
> 2981
>
> - From your explanation above, I'm guessing that the higher sockstat #s is where
> you were talking about one socket being used by multiple processes? But, right
> now:
>
> mars# netstat -nA | grep stream | wc -l ; sockstat -u | wc -l
> 5025
> 2905
>
> sockstat -u #s are *down*, but netstat -na is almost double ...
>
> Again, based on what you state above: "Sockets can also exist without any
> referencing process (if the application closes, but there is still data
> draining on an open socket)."
>
> Now, looking at another 6-STABLE server, but one that has been running for 2
> months now, I'm seeing numbers more consistent with what mars looks like
> shortly after all the jails start up:
>
> venus# netstat -nA | grep stream | wc -l ; sockstat -u | wc -l
> 2126
> 2209
>
> So, if those sockets on mars are 'still draining on an open socket', is
> there some way of finding out where? If I'm understanding what you've said
> above, these 'draining sockets' don't have any processes associated with
> them anymore? So, its not like I can just kill off a process, correct?
The draining state cannot occur for UNIX domain sockets. The only cases I
know of in which UNIX domain sockets can have PCBs without a process
connection is if the UNIX domain socket is attached to a socket that is being
passed over another socket where the original socket has released all other
references to it, and in using FIFOs. The former is a relatively rare
occurence with almost all applications, since very few use explicit file
descriptor passing. Is there any chance that any of your applications is
using a large number of POSIX FIFOs?
BTW, when using sockstat as above, you need to sockstat -u | grep -c stream,
for the same reason you do it with netstat. Datagram UNIX domain sockets are
quite frequently used -- for example, with syslog, so need to be omitted from
the count if you are comparing only stream sockets.
Robert N M Watson
Computer Laboratory
University of Cambridge
More information about the freebsd-stable
mailing list