nginx keepalive连接回收机制
来源:互联网 发布:golang selenium爬虫 编辑:程序博客网 时间:2024/04/27 08:44
我在nginx 1.0.12代码中发现了名为ngx_reusable_connection的函数(它是在哪个版本里被加上的就不去追究了),很好奇这个函数是做什么的。后来有一次在我的群里讨论nginx的时候,有人发现了一个奇怪的现象,这位同学报告说:并发量大的时候,一些keepalive的连接会被新连接给挤掉。。。
关于这个问题,切入点在ngx_get_connection,并发足够大时,使连接池迅速耗尽,从代码角度上看:
c = ngx_cycle->free_connections; // 此时连接池已用尽 if (c == NULL) { ngx_drain_connections(); // 将一些keepalive连接给释放掉 c = ngx_cycle->free_connections; }这里出现了这样一个函数:ngx_drain_connections。
static voidngx_drain_connections(void){ ngx_int_t i; ngx_queue_t *q; ngx_connection_t *c; // 清理32个keepalive连接,以回收一些连接池供新连接使用 for (i = 0; i < 32; i++) { if (ngx_queue_empty(&ngx_cycle->reusable_connections_queue)) { break; } // reusable连接队列是从头插入的,意味着越靠近队列尾部的连接,空闲未被 // 使用的时间就越长,这种情况下,优先回收它,类似LRU q = ngx_queue_last(&ngx_cycle->reusable_connections_queue); c = ngx_queue_data(q, ngx_connection_t, queue); ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, "reusing connection"); // 这里的handler是ngx_http_keepalive_handler,这函数里,由于close被置1, // 所以会执行ngx_http_close_connection来释放连接,这样也就发生了keepalive // 连接被强制断掉的现象了。 c->close = 1; c->read->handler(c->read); }}
那么上面提到的reusable连接队列是如何建立的呢?这个比较简单,这里大体说一下:
在ngx_http_set_keepalive函数处理的最后阶段,会以第二个为1的形式调用ngx_reusable_connection函数。
而在ngx_http_keepalive_handler函数中会以参数0,来调用ngx_reusable_connection。
voidngx_reusable_connection(ngx_connection_t *c, ngx_uint_t reusable){ // 一旦一个keepalive的连接正常处理了,就将其从reusable队列中移除 if (c->reusable) { ngx_queue_remove(&c->queue); } // 在ngx_http_set_keepalive中会将reusable置为1,reusable为1的直接效果 // 就是将该连接插到reusable_connections_queue中 c->reusable = reusable; // 当reusable为0时,意味着该keepalive被正常的处理掉了,不应该被再次添加 // 到reusable队列中了。 if (reusable) { /* need cast as ngx_cycle is volatile */ // 这里使用头插法,较新的连接靠近头部,时间越久未被处理的连接越靠尾 ngx_queue_insert_head( (ngx_queue_t *) &ngx_cycle->reusable_connections_queue, &c->queue); }}
从高性能服务器的角度来说,nginx这样做也有它的合理之处,如果一个keepalive连接长时间不交互数据,而新连接到来又拿不到连接,处理这些占着坑不XX的家伙也是无奈之举,当然擅自drain掉连接始终是不对的,这里就得做权衡了,毕竟鱼和熊掌不能兼得。
- nginx keepalive连接回收机制
- nginx keepalive连接回收机制
- nginx keepalive连接回收机制
- nginx配置长连接---keepalive相关
- nginx长连接keepalive与pipeline
- nginx+keepalive
- nginx + keepalive
- nginx + keepalive
- nginx+tomcat的keepalive验证、bio/nio连接比较
- nginx之keepalive请求长连接复用率统计
- Nginx Upstream Keepalive 分析
- Nginx Upstream Keepalive 分析
- Nginx Upstream Keepalive 分析
- nginx + keepalive 实现HA
- nginx - KeepAlive详细解释
- nginx基础概念-keepalive
- Nginx Upstream Keepalive配置
- Nginx学习之Keepalive
- 当红时尚造型师马锐的“美妆之路”
- socket 编程
- Socket 函数集(linux)
- android数组定义和使用
- 旋转屏幕后Dialog消失的解决办法
- nginx keepalive连接回收机制
- 位扩展详解
- 适应不同的设备
- Android基础概念Context的作用
- js里==和===
- Java Socket实战之六 使用NIO包实现Socket通信
- bfdgdfgsdfg
- struts1工作原理
- 牛逼的AA:ASCII-Art