different Memory consumption for H1 and H2

Maxim Dounin mdounin at mdounin.ru
Thu May 11 15:11:43 UTC 2017


Hello!

On Thu, May 11, 2017 at 10:32:41PM +0800, Muhui Jiang wrote:

> Recently, I did an experiment to test the memory consumption of nginx. I
> request a large static zip file. I explored the debug information of nginx.
> 
> For H2, below is a part of the log, I noticed that every time server will
> allocate 65536 bytes, I increase the connection number, I noticed that the
> server's memory consumption will reach to a threshhold and then increase
> very slowly:

[...]

> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http output filter
> "/image/test.zip?"
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http copy filter:
> "/image/test.zip?"
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 malloc: 0000000002699A80:65536
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 read: 14, 0000000002699A80,
> 65536, 0

[...]

> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http2 frame out:
> 00000000026155F0 sid:1 bl:0 len:1
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL buf copy: 9
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL buf copy: 1
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL to write: 138
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 SSL_write: 138
> 2017/05/11 04:54:20 [debug] 29451#0: *10499 http2:1 DATA frame
> 00000000026155F0 was sent

[...]

> For H/1.1, below is a part of the debug log, no malloc is noticed during
> the send file process. And even when I increase the connection number to a
> very large value, the result shows nginx's memory consumption is still very
> low. :

[...]

> 2017/05/11 22:29:06 [debug] 29451#0: *11015 http write filter limit 0
> 2017/05/11 22:29:06 [debug] 29451#0: *11015 sendfile: @72470952 584002
> 2017/05/11 22:29:06 [debug] 29451#0: *11015 sendfile: 260640 of 584002

[...]

> Hope to get your comments and what are the difference of nginx's memory
> allocation mechanisms between HTTP/2.0 and HTTP/1.1. Many Thanks

The difference is due to sendfile(), which is used in case of 
plain HTTP, and can't be used with SSL-encrypted connections.  
HTTP/2 is normally used with SSL encryption, so it is usually not 
possible to use sendfile() with HTTP/2.

When sendfile() is not available or switched off, nginx uses 
output_buffers (http://nginx.org/r/output_buffers) to read a file 
from disk, and then writes these buffers to the connection.

When it is possible to use the sendfile(), nginx does not try to 
read contents of static files it returns, but simply calls 
sendfile().  This is usually most effecient approach , as it 
avoids additional buffers and copying between kernel space and 
userland.  Unfortunately, it is not available when using HTTPS 
(including HTTP/2).

-- 
Maxim Dounin
http://nginx.org/


More information about the nginx mailing list