Date: Thu, 11 Feb 1999 09:15:29 -0800 From: "Justin C. Walker" <justin@apple.com> To: Chris Csanady <ccsanady@friley-185-205.res.iastate.edu> Cc: freebsd-current@FreeBSD.ORG, freebsd-net@FreeBSD.ORG Subject: Re: Serious mbuf cluster leak.. Message-ID: <199902111715.JAA00622@walker3.apple.com> In-Reply-To: "Your message of Wed, 10 Feb 1999 17:49:20 CST."<19990210234920.2A11B6@friley-185-205.res.iastate.edu>
next in thread | previous in thread | raw e-mail | index | archive | help
<=
bold><flushleft><color><param>7540,3813,2F35</param><fontfamily><param>Hel=
vetica</param>Ouch. I can say that our implementation doesn't seem to =
suffer from this problem. Could be there's an issue in the use of =
PRUS_* v. the socket state we use. The code in my kernel looks like:
in sosend():
if (dontroute)
so->so_options |=3D SO_DONTROUTE;
if (resid > 0)
so->so_state |=3D SS_MORETOCOME;
s =3D splnet(); /* XXX =
*/
error =3D (*so->so_proto->pr_usrreq)(so,
(flags & MSG_OOB) ? PRU_SENDOOB : PRU_SEND,
top, addr, control);
splx(s);
if (dontroute)
so->so_options &=3D ~SO_DONTROUTE;
so->so_state &=3D ~SS_MORETOCOME;
and in tcp_output():
if (len) {
if (len =3D=3D tp->t_maxseg)
goto send;
if (!(so->so_state & SS_MORETOCOME)) {
if ((idle || tp->t_flags & TF_NODELAY) &&
len + off >=3D so->so_snd.sb_cc)
goto send;
}
if (tp->t_force)
goto send;
We've subjected this to countless (well, some, I'm sure, can count them =
:-}) hours of thrashing for web server, file server, and other-server =
types of uses, and haven't seen any (reports of) leakage like this.
I'll look more closely at the results we see, to verify that we don't =
have a problem.
Regards,
Justin
From: =
</fontfamily></color></flushleft></bold><color><param>7540,3813,2F35</para=
m><fontfamily><param>Helvetica</param>Chris Csanady =
<<ccsanady@friley-185-205.res.iastate.edu><color><param>0000,0000,0000</pa=
ram>
<bold><color><param>7540,3813,2F35</param>Date: =
</color></bold><color><param>7540,3813,2F35</param>1999-02-11 01:51:17 =
-0800<color><param>0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>To: =
</color></bold><color><param>7540,3813,2F35</param>freebsd-current@FreeBSD=
.ORG<color><param>0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>Subject: =
</color></bold><color><param>7540,3813,2F35</param>Re: Serious mbuf =
cluster leak..<color><param>0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>Cc: =
</color></bold><color><param>7540,3813,2F35</param>freebsd-net@FreeBSD.ORG=
<color><param>0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>In-reply-to: =
</color></bold><color><param>7540,3813,2F35</param>"Your message of Wed, =
10 Feb 1999 17:49:20 =
CST."<<19990210234920.2A11B6@friley-185-205.res.iastate.edu><color><param>=
0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>X-Mailer: =
</color></bold><color><param>7540,3813,2F35</param>exmh version 2.0.2 =
2/24/98<color><param>0000,0000,0000</param>
<bold><color><param>7540,3813,2F35</param>X-Loop: =
</color></bold><color><param>7540,3813,2F35</param>FreeBSD.org<color><para=
m>0000,0000,0000</param>
=
</color></color></color></color></color></color></color></color></color></=
color></color></color></color></color></color></fontfamily><fixed><fontfam=
ily><param>Ohlfs</param>After a while, I have determined the cause of =
the leak to be the<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>following commit. Although, I can't =
seem to find any reason why<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>it would cause this =
behavior--reverting these files fixes =
it.<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>Any =
thoughts?<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>fenner 1999/01/20 09:32:01 =
PST<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Modified =
files:<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> sys/kern =
uipc_socket.c <color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> sys/netinet =
tcp_output.c tcp_usrreq.c tcp_var.h <color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> sys/sys protosw.h =
<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> =
Log:<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Add a flag, passed to pru_send =
routines, PRUS_MORETOCOME. This<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> flag means that there is more data =
to be put into the socket buffer.<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Use it in TCP to reduce the =
interaction between mbuf sizes and =
the<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Nagle =
algorithm.<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> =
<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Based on: "Justin C. Walker" =
<<justin@apple.com>'s description of =
Apple's<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> fix for this =
problem.<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> =
<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> Revision Changes =
Path<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> 1.50 +4 -2 =
src/sys/kern/uipc_socket.c<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> 1.32 +3 -2 =
src/sys/netinet/tcp_output.c<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> 1.40 +7 -2 =
src/sys/netinet/tcp_usrreq.c<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> 1.49 +18 -17 =
src/sys/netinet/tcp_var.h<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param> 1.26 +2 -1 =
src/sys/sys/protosw.h<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>I have been seeing a nasty cluster =
leak in both 3.0 stable and 4.0<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>current as of today. Until now, I =
thougt maybe it was something in<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>my driver, athough after much =
careful looking over my code, it<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>simply does not look possible. =
Also, I downgraded to current of<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>Dec 12, and the problem =
dissappears. <color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>The odd thing is that the clusters =
that leak don't seem to be<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>attached to mbufs. Or at least =
there is not a 1-1 ratio. Following<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>is netstat output after a while of =
running netpipe in streaming<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>mode. (NPtcp -s; see =
ftp://ftp.scl.ameslab.gov/pub/netpipe) =
Also,<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>the leak only becomes apparent when =
the send write size is very<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>large--several hundred K to several =
megabytes.<color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>Does anyone have any idea what this =
may be? I really am not sure<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>where to look aside from trying =
prorgressively newer kernels. Also,<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>I only have alphas to test on right =
now..<color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>puck:~> netstat =
-m<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>211/416 mbufs in =
use:<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>> 116 mbufs allocated to =
data<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>> 95 mbufs allocated to =
packet headers<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>1674/1688/2048 mbuf clusters in use =
(current/peak/max)<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>3480 Kbytes allocated to network =
(97% in use)<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>0 requests for memory =
denied<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>0 requests for memory =
delayed<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>0 calls to protocol drain =
routines<color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>Chris =
Csanady<color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>To Unsubscribe: send mail to =
majordomo@FreeBSD.org<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>>with "unsubscribe freebsd-net" in =
the body of the message<color><param>0000,0000,0000</param>
=
<color><param>7540,3813,2F35</param>><color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>To Unsubscribe: send mail to =
majordomo@FreeBSD.org<color><param>0000,0000,0000</param>
<color><param>7540,3813,2F35</param>with "unsubscribe freebsd-net" in =
the body of the message<color><param>0000,0000,0000</param>
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199902111715.JAA00622>
