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

1,041 阅读2分钟

nginx使用连接池来增加对资源的利用率。

                                              

                                                                     图1

每一个worker进程里面都会有一个ngx_cycle_t数据结构,该数据结构里面有一个connections数组,该数组就是我们要说的连接池。

一、connections

在nginx的官方文档中,worker_connections的介绍,从中我们可以知道这个连接池默认是512,也就是说该数组的长度是512,一个请求对应数组中一个元素,那么该worker进程能处理512个请求,这512中不仅包含客户端向服务器请求的数量,还包含服务器向上游服务器请求的数量。

也就是说,客户端向服务器发起一个请求,服务器将该请求转发给上游服务器,这个过程中有两次请求,占用connections中两个元素。

那么,其实这connections数组长度其实是不够用的,所以一般情况下,我们需要通过worker_rlimit_core去修改这个值。

二、read_events、write_events

每一个连接除了存放在connections中,还对应一个读时间和一个写事件,如图1,read_events中存放着读事件,write_events中存放着写事件,它们都是数组,并且长度与connections长度相同,一个请求和它的读事件、写事件是通过索引进行关联的。

所以在一个worker进程中,我们更改worker_connections的大小时,应该考虑到,当worker_connections数量增加,它所占用的内存就三倍增加。

那么一个请求要占用的具体内存是多少呢?

三、一个请求对应占用内存数

                                                               图2

如上图,每一个请求都对应一个ngx_connection_s,其占用232个字节,不同版本的浏览器,这个数字会有细微的差别。

每一个事件都对应一个ngx_event_s,其占用96个字节。

所以,一个请求占用的内存=232 + 96 * 2 = 424个字节。

 ngx_event_s中有一个timer,当我们对读、写事件进行超时设置时,是对timer进行设置。

三、send

send是一个无符号的整型,它表达的是发送的字节数.

在打日志时,我们会用bytes_sent来获取到发送的字节数,其中包括头部信息,bytes\_sent来获取到发送的字节数,其中包括头部信息,body_bytes_sent包含的是请求体中的字节数。