Nginx高端成长之路程序员linux

【充电】《Nginx核心知识100讲》nginx连接池

2018-12-30  本文已影响3人  言十年

极客专栏《Nginx核心知识100讲》35小节的笔记

Nginx如何通过连接池处理网络请求

1.链接池

image.png
  1. nginx的链接池究竟是怎么使用的?

每个worker 独立的进程都有一个ngx_cycle_t这样的一个数据结构。ngx_cycle_t有三个主要的数组数组connections、read_events、write_events。

connections就是所谓的连接池,它指向了这个数组有多大呢?从官方文档http://nginx.org/en/docs/ngx_core_module.html#worker_connections看到默认是 512。这个值比较小, nginx 动辄几万,几十万的链接,这个值往往需要修改。这个链接不止用于客户端的连接也用于面向上游服务器的。所以我们做反向代理的时候,每一个客户端意味着消耗我们两个connection。

read_events 这个数组(大小跟connections配置一样),所以,那三个(图中三个深色小方格)怎么对应起来呢?是通过序号。在考虑nginx 能够释放多大性能的时候,首先需要保证worker connections 足够你使用。connections指向的数组同时影响了我们打开的内存。当我们使用了配置了更大的connections,nginx就使用了更大的内存。

  1. 如何计算connections用了多少内存?
image.png

ngx_connections_s 这样的结构体,在64位操作系统占用的字节数大约是232。不同的nginx版本不同可能有微小的差异。

4.连接跟事件是如何对应到一起的?

每一个ngx_connections_s 对应两个事件:读写事件。

每一个事件对应一个结构体ngx_event_s,这样的一个结构体占用的字节数大约96。

所以,每一次连接消耗的内存大约是(232+96)*2。connections配置的越大,初始时就会消耗预分配那么多(connection_pool_size)的内存。

  1. ngx_event_s成员

handler 是一个回调方法,很多第三方模块会把这个handler设为自己的实现。

timer,当对http请求做读超时写超时等等设置的时候,其实是在操作读事件跟写事件的timer。这个timer就是nginx实现超时定时器,基于rbtree(红黑树实现的结构体),红黑树中每个成员叫做 rbtree_node(这个timer是就它的node),用来指向读事件是否超时,写事件是否超时。这些定时器也是可配的。比如:client_header_timeout(http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout) 默认60秒。这个60秒也是在刚刚某个连接上,在准备读取header时,在它的读事件上加了60秒超时。

ngx_queue_t,当多个事件形成队列的时候可以用它形成队列。

6.ngx_connections_s 的成员 send,它的类型off_t可以理解为一个无符号的整型。它表示这个连接上发送了多少个字节。也就是我们经常在配置中使用到的bytes_sent 变量。

7.bytes_sent 的作用。

http://nginx.org/en/docs/http/ngx_http_core_module.html#client_header_timeout

$bytes_sent
number of bytes sent to a client (1.3.8, 1.2.5) 向客户端发送了多少字节。

在access_log记录nginx处理了哪些请求中,可以记录这个变量。

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
image.png

这个623就是发送了多少个字节。

  1. 最后总结

当我们需要配置高并发的nginx时,必须把connection的数目配置到足够大, 而每个connection相对应的两个event都会消耗一定的内存,需要我们注意。

nginx 中像很多结构体中它们的一些成员和我们的内置变量是可以对应起来的。比如说bytes_sent,比如说body_bytes_sent。

9.如果启用gzip,那byte_sent是指压缩后的字节吗

 作者回复
是的

10.502通常是连接建立失败

11.一个 连接 232+(96*2) = 424 字节
如果预分配给 nginx 4G 的内存, 那连接数connection 是不是就是 4G/424B 的数量
这个值是最大并发连接数么 ?
老师, 有一些概念只有一点感觉, 一直很模糊, 65535, 这个到底是什么, 什么操作能占用这个数值?
还有比如 nginx. conf 里的一些数值设置, 比如 buffer_size 数值之类的, 根据系统资源, 怎么应该合理的去设置一些数值?
!谢谢!

 作者回复
不是,这只是描述连接的结构体需要的内存,在第3部分第4节课里会介绍处理http请求还会分配的内存,默认至少有5K会被分配出,你可以等下周课程推出后仔细看下。第2个问题,第5部分课程会详细介绍的。

12.nginx作为四层反向代理时。
配置文件的worker_connections如果设置为200000,那么nginx作为客户端向上游服务器发起tcp连接,是否会有端口65535个的限制?那该如何解决?使用虚拟网卡吗?还是有其他办法?

 作者回复
会有限制,这是操作系统限制的。使用多网卡是解决办法,虚拟的也可以

上一篇下一篇

猜你喜欢

热点阅读