Nginx之连接池(nginx长连接最大连接数)
我们知道Nginx利用连接池来增加它对资源的利用率。
下面我们一起来看看Nginx是如何使用连接池的。从上一节模块开始 已经慢慢会接触一些Nginx的源码部分来。
每个worker进程都有一个独立的ngx_cycle_t 这种数据结构。
这里面我们先来了解3个数组字段,分别是connections,read_events,write_envets。
这里的connections就是连接池。
我们在官网看到默认值说512,这不仅是客户端的连接。也就是说在我们用Nginx做反向代理的时候,每个客户端会占用2个连接。
https://nginx.org/en/docs/ngx_core_module.html#worker_connections
每个connection又有自己的读写事件,read_events和write_envets的数组大小和connections是一致的。当我们把连接数开得越大的时候占用的内存就会越大,那每个链接到底占用多少内存呢?这就需要看下 ngx_connection_s 这个结构体了 在ngx_connection.h,在64位os中,这个结构体约占用232个字节。
struct czzz {
void *data;
ngx_event_t *read;
ngx_event_t *write;
ngx_socket_t fd;
ngx_recv_pt recv;
ngx_send_pt send;
ngx_recv_chain_pt recv_chain;
ngx_send_chain_pt send_chain;
ngx_listening_t *listening;
off_t sent;
ngx_log_t *log;
ngx_pool_t *pool;
int type;
……
};
read/write:分别是读写事件。
recv/send:抽象出os的底层方法,如何接收/发送
sent: 在这个连接上已经发送了多少字节。
pool:当前使用的内存池。
这里还有两个事件 ngx_event_t是在ngx_event.h里 在64位os中,这个结构体约占用96个字节。
struct ngx_event_s {
void *data;
int available;
ngx_event_handler_pt handler;
ngx_uint_t index;
ngx_log_t *log;
ngx_rbtree_node_t timer;
ngx_queue_t queue;
};
由于每个链接需要有2个事件,所以一个链接起码需要232+96+96 = 424个字节。
这里的handler:是事件的回调方法。第三方模块会把这里设置成自己的实现。
timer:当我们对http请求做读超时/写超时定时器设置的时候其实是在操作这个timer。基于红黑树实现的。
queue:当多个事件形成队列的时候会用到这个字段。
回顾:今天我们一起认识了ngx_connection_s和ngx_event_s结构体,并知道了它们之间是什么样的关联关系。1个连接对应2个事件都会消耗一定的内存需要我们注意内存的使用。当我们需要高并发时,我们需要把connections的数目配置到足够大。