编程技术分享平台

网站首页 > 技术教程 正文

Nginx之连接池(nginx长连接最大连接数)

xnh888 2024-10-07 18:13:19 技术教程 38 ℃ 0 评论

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

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表