当前位置:首页 > 技术文章 > 正文内容

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

arlanguage3个月前 (01-31)技术文章34

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

扫描二维码推送至手机访问。

版权声明:本文由AR编程网发布,如需转载请注明出处。

本文链接:http://www.arlanguage.com/post/1410.html

标签: nginx源代码
分享给朋友:

“Nginx之连接池(nginx长连接最大连接数)” 的相关文章

Nginx高级篇:从原理到实战,彻底搞懂Nginx

推荐阅读:2020年后想跳槽?MQ、ZK、Nginx、Kafk等分布式技术你都掌握了?手撕分布式技术:限流、通讯、缓存,全部一锅端走送给你惨败阿里,洒泪复习25天,我还能抓住2019的小尾巴上岸网易?微服务架构之春招总结:SpringCloud、Docker、Dubbo与SpringBoot通过配置...

运维笔记:Windows下如何实现nginx服务自启动,看完你就会了

Nginx作为有每一个两三年工作经验的程序员来说都不陌生,基本上每个线上部署的项目都需要用到,Nginx常用的功能有负载均衡、反向代理、正向代理、搭建FTP服务等等。为了满足Nginx服务可以随操作系统启动,如果是Linux服务器的话可以通过shell脚本设置Nginx自启动,对于Windows操作...

全网最新最全的Docker命令大集合,收藏备用!

Docker 是一个开源的平台,用于自动化应用程序的部署、扩展和管理。它使得开发者能够打包应用及其依赖项到一个轻量级的容器中,并在任何环境中快速运行。掌握 Docker 的常用命令可以大大提高你的工作效率,尤其是在开发、测试和部署阶段。本文将详细介绍 Docker 的常用命令,涵盖从基本操作到高级使...

nginx检查提示“unknown directive "stream" in /etc/*/nginx.conf”

yum安装nginx检查时提示“unknown directive "stream" in /etc/nginx/nginx.conf”yum安装nginx,在配置反代时,出现错误:nginx -tnginx: [emerg] unknown directive "strea...

nginx支持跨域的方法 nginx配置支持跨域

在nginx的配置文件中添加允许跨域的响应头。参考nginx官方文档,添加响应头的方法如下:在conf文件的server作用域中添加如下响应头:server { listen 80; # 其他配置... # 允许跨域 add_header Access-Control-Allow-...

Linux 网络延迟排查方法 linux延迟10秒

在 Linux 服务器中,可以通过内核调优、DPDK 以及 XDP 等多种方式提高服务器的抗攻击能力,降低 DDoS 对正常服务的影响。在应用程序中,可以使用各级缓存、WAF、CDN 等来缓解 DDoS 对应用程序的影响。但是需要注意的是,如果 DDoS 流量已经到达 Linux 服务器,那么即使应...