<div dir="ltr">HI<div><br></div><div>Thanks for your great answer. you mentioned that sendfile() is to copy between kernel space and userland. I am curious, why this whole process don't need to malloc any memory? Could you please explain more on the detail implementation of the sendfile(). Many Thanks</div><div><br></div><div>Regards</div><div>Muhui</div></div><div class="gmail_extra"><br><div class="gmail_quote">2017-05-11 23:11 GMT+08:00 Maxim Dounin <span dir="ltr"><<a href="mailto:mdounin@mdounin.ru" target="_blank">mdounin@mdounin.ru</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello!<br>
<span class=""><br>
On Thu, May 11, 2017 at 10:32:41PM +0800, Muhui Jiang wrote:<br>
<br>
> Recently, I did an experiment to test the memory consumption of nginx. I<br>
> request a large static zip file. I explored the debug information of nginx.<br>
><br>
> For H2, below is a part of the log, I noticed that every time server will<br>
> allocate 65536 bytes, I increase the connection number, I noticed that the<br>
> server's memory consumption will reach to a threshhold and then increase<br>
> very slowly:<br>
<br>
</span>[...]<br>
<span class=""><br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http output filter<br>
> "/image/test.zip?"<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http copy filter:<br>
> "/image/test.zip?"<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 malloc: 0000000002699A80:65536<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 read: 14, 0000000002699A80,<br>
> 65536, 0<br>
<br>
</span>[...]<br>
<span class=""><br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http2 frame out:<br>
> 00000000026155F0 sid:1 bl:0 len:1<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL buf copy: 9<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL buf copy: 1<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL to write: 138<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL_write: 138<br>
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http2:1 DATA frame<br>
> 00000000026155F0 was sent<br>
<br>
</span>[...]<br>
<span class=""><br>
> For H/1.1, below is a part of the debug log, no malloc is noticed during<br>
> the send file process. And even when I increase the connection number to a<br>
> very large value, the result shows nginx's memory consumption is still very<br>
> low. :<br>
<br>
</span>[...]<br>
<span class=""><br>
> 2017/05/11 22:29:06 [debug] 29451#0: *11015 http write filter limit 0<br>
> 2017/05/11 22:29:06 [debug] 29451#0: *11015 sendfile: @72470952 584002<br>
> 2017/05/11 22:29:06 [debug] 29451#0: *11015 sendfile: 260640 of 584002<br>
<br>
</span>[...]<br>
<span class=""><br>
> Hope to get your comments and what are the difference of nginx's memory<br>
> allocation mechanisms between HTTP/2.0 and HTTP/1.1. Many Thanks<br>
<br>
</span>The difference is due to sendfile(), which is used in case of<br>
plain HTTP, and can't be used with SSL-encrypted connections.<br>
HTTP/2 is normally used with SSL encryption, so it is usually not<br>
possible to use sendfile() with HTTP/2.<br>
<br>
When sendfile() is not available or switched off, nginx uses<br>
output_buffers (<a href="http://nginx.org/r/output_buffers" rel="noreferrer" target="_blank">http://nginx.org/r/output_<wbr>buffers</a>) to read a file<br>
from disk, and then writes these buffers to the connection.<br>
<br>
When it is possible to use the sendfile(), nginx does not try to<br>
read contents of static files it returns, but simply calls<br>
sendfile().  This is usually most effecient approach , as it<br>
avoids additional buffers and copying between kernel space and<br>
userland.  Unfortunately, it is not available when using HTTPS<br>
(including HTTP/2).<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Maxim Dounin<br>
<a href="http://nginx.org/" rel="noreferrer" target="_blank">http://nginx.org/</a><br>
______________________________<wbr>_________________<br>
nginx mailing list<br>
<a href="mailto:nginx@nginx.org">nginx@nginx.org</a><br>
<a href="http://mailman.nginx.org/mailman/listinfo/nginx" rel="noreferrer" target="_blank">http://mailman.nginx.org/<wbr>mailman/listinfo/nginx</a><br>
</font></span></blockquote></div><br></div>