Nginx之连接池

Nginx之连接池

经验文章nimo972025-05-28 7:32:117A+A-

我们知道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的数目配置到足够大。

点击这里复制本文地址 以上内容由nimo97整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

尼墨宝库 © All Rights Reserved.  蜀ICP备2024111239号-7