`
lingqi1818
  • 浏览: 252070 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

keepalive的来龙去脉

阅读更多

今天有同事反应在性能测试环境cpu load很高有500多,我的分析过程是这样的,先用visualVM连上去观察了下,发现请求都卡在channelsocketread上面。

         这一步是mod_jk的代码,并未真正进入应用代码。所以怀疑是apachejboss之间出现了为题,为了印证这个猜测,先对jboss直接做压力测试,果然应用正常,load也在正常值。

         于是就观察了下httpd.confmod_jk.conf.发现两个配置除了用的都是正常值并没有其他特殊设置,在15个并发的情况下,就算有性能问题也不应该是这样的。

         Netstat –an观察网络连接,发现有很多的close_wait状态。根据tcp-ip关闭连接的四次握手过程和状态转变,close_wait应该是客户端主动发起的,而服务端被动接受关闭,并且服务端还未向客户端发送FIN请求导致。又仔细看了下httpd.conf中的keepalive设置为off。于是就明白是怎么回事了。

直接抓包看图:

Keepaliveon的时候:



 

 

Keepaliveoff的时候:

 

 

 

红框框部分可以看到,首先客户端(10.19.14.20)向服务器发送FIN请求seq=484

服务器响应ack=484+1并且发送FIN给客户FIN请求seq=142

客户端响应服务端请求ack=142+1

 

下面再看下具体的状态转换图:

 



  

从这个图中可以看到状态变为close_wait的一方为被动关闭方。再结合刚才的抓包图分析,在httpd.conf设置为keepaliveoff的时候,客户端会在请求结束之后主动发出close调用,这个时候服务端变为close_wait状态,但是由于apache程序的某些原因导致不能很好的在繁忙情况下处理完这些请求,导致load升高。

 

上面分析的都是针对http协议的keepalive设置,并且这个keepalive是需要http协议支持。

 

下面我们再来稍微看一下tcp层的keepalive参数。

其实tcp协议本身就是面向连接的协议,之所以这样设计是因为这个协议是提供一个高可靠的服务,在连接的基础上我们可以做很多的事情保证可靠性,例如流量的控制(滑动窗口),失败重传的机制等等。只要三次握手完成,那么TCP所谓的连接也就建立了。由于有这个三次握手的过程,所以很多坏人会利用这个过程疯狂往服务器发送SYN包,导致服务器响应不过来而挂掉。

那既然连接已经建立了,为什么还有有keepalive呢,因为连接是有个超时时间的,假如在规定时间内没有数据交换的话,就会超时,所以需要定期发送数据来保持连接,linux操作系统的套接口选项就有个SO_KEEPALIVE可以设置心跳的发送时间(默认2小时),可惜这个参数是针对全局的,你设置了,其他人在这台机器的应用心跳数据发送间隔时间都会改变,所以最好自己写程序来实现心跳。

由此可见,http协议的keepalive参数只不过是为了保持连接的一个实现方式而已,他是在http的头上面定义连接是否需要保持(on/off),和保持的时间(timeout).

 

最后再说一下长连接的用处:

1)  可以省去频繁建立连接的开销

2)  某些场景省去客户端对服务端的频繁轮询

3)  服务端和客户端可以灵活的来回读写数据,所谓的推和拉都可以基于此实现。

 

比如所谓的comet听着很炫,也就是长连接上的一些需求实现。但是由于不是所有的浏览器程序都支持长连接,例如IE就不支持流式的AJAX,只能通过例如flash socket程序,或者iframe等猥琐的方式来实现。

 

以上是小弟因为keepalive引起的乱弹,欢迎各位批评指正。谢谢。

 

补充2个文档:

 http://httpd.apache.org/docs/1.3/keepalive.html

http://en.wikipedia.org/wiki/Keepalive

  • 大小: 67.6 KB
  • 大小: 79.1 KB
  • 大小: 84.8 KB
分享到:
评论

相关推荐

    socket的keepalive介绍

    Socket的Keepalive机制是TCP/IP通信中用于保持连接活跃性的一种技术。它的主要目标是确保在TCP连接上,即使在长时间无数据交换的情况下,也能检测到连接是否仍然有效。这在服务器与客户端通信中尤其重要,因为如果...

    W5500 Keepalive 应用笔记

    "W5500 Keepalive 应用笔记"是一个针对W5500网络接口芯片的专题,旨在探讨如何在TCP连接中有效地使用Keepalive机制。W5500是一款集成的以太网控制器,广泛应用于嵌入式系统,如物联网设备和工业自动化。 TCP ...

    springboot-keepalive设置测试

    对于keepalive,我们需要关注`keep-alive-timeout`属性,它设定了在服务器关闭空闲连接之前等待新请求的时间。 例如,我们可以在`application.properties`或`application.yml`文件中添加以下配置: ```properties ...

    linux tcp keepalive存活代码设置

    如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 eepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有 收到应答,...

    keepalive--aarch64.rar

    标题中的"keepalive--aarch64.rar"表明这是一个针对aarch64架构的软件或程序,使用了“keepalive”技术,并且被压缩在RAR文件格式中。RAR是一种流行的压缩格式,通常用于存储和传输大量数据,因为它可以提供较高的...

    Keepalive+mysql主主同步.pdf

    "Keepalive+mysql主主同步" Keepalive+mysql主主同步是指在高可用性环境中,使用Keepalive和MySQL主主同步技术来实现数据库的高可用性和负载均衡。下面是相关的知识点: 一、Keepalive简介 Keepalive是一个高可用...

    keepalive1.1.17.zip

    MySQL的主主复制结合Keepalive工具的使用详解 在分布式数据库系统中,数据的高可用性和一致性至关重要。MySQL的主主复制是一种常见的解决方案,它允许两个或多个服务器之间同步数据,确保任何一处的数据更改都会被...

    nginx1.9.7+keepalive1.3.2

    标题 "nginx1.9.7+keepalive1.3.2" 暗示我们要讨论的是一个特定版本的 Nginx 服务器软件,与 Keepalive 模块的结合使用。Nginx 是一款广泛使用的高性能 web 服务器和反向代理服务器,而 Keepalive 模块则是增强其...

    判定断开前的KeepAlive探测次数

    在IT网络管理与系统运维领域,理解“判定断开前的KeepAlive探测次数”这一概念至关重要,尤其是在处理网络连接状态及优化系统性能方面。本文将深入解析这一知识点,结合给出的描述与部分代码示例,旨在提供一个全面...

    GRE隧道keepalive的说明

    ### GRE隧道Keepalive详解 #### 前言 随着网络技术的发展,GRE(Generic Routing Encapsulation)隧道作为一种广泛应用于互联网中的技术,对于实现不同网络之间的通信具有重要意义。然而,在实际应用过程中,如何...

    Mysql keepalive-1.4.5.tar.gz

    MySQL Keepalive是一款用于保持MySQL连接活性的工具,它在数据库管理中扮演着重要角色,尤其在高并发、长时间无操作的场景下。标题中的“Mysql keepalive-1.4.5.tar.gz”指的是该软件的1.4.5版本的压缩包文件,通常...

    KeepAlive.zip

    标题为"KeepAlive.zip"的压缩包文件中可能包含源代码、资源文件等,用于构建这样一个实用的小程序。我们将主要关注以下几个关键知识点: 1. **Qt框架**:Qt是一个跨平台的应用程序开发框架,用C++编写,广泛用于...

    nginx+keepalive

    在构建高可用性网络服务时,`nginx+keepalive` 的组合是一个常用方案。Nginx 是一款高性能的 HTTP 和反向代理服务器,而 Keepalive 则是用于实现虚拟 IP (VIP) 高可用和负载均衡的工具。下面将详细介绍这两个组件...

    Nginx和Keepalive

    【Nginx与Keepalive整合实现高可用负载均衡】 Nginx是一款高性能的HTTP和反向代理服务器,常用于构建高可用的Web服务系统。在本文中,我们将深入探讨如何结合Keepalive工具来实现Nginx的高可用负载均衡。 **一、...

    KEEPALIVE安装配置手册

    KEEPALIVE安装配置手册 REDIS集群配置 各种算法分析

    keepalive中文文档

    标题"keepalive中文文档"指出,我们关注的是与"keepalive"相关的技术内容,而这份资源是用中文编写的,适用于学习和开发用途。描述中的"pdf格式的保证好用"表明这是一个PDF文件,通常包含详细的教程或指南,适合读者...

    keepalive应用脚本

    "keepalive应用脚本"是一个专门设计来确保MySQL主从复制环境持续运行的工具。它包含两个主要部分:主库监控和从库监控,以及主从切换的shell脚本。 **Keepalive机制** "Keepalive"通常指的是在网络连接中保持活动...

    Niginx操作配置+KeepAlive负载均衡

    - **KeepAlive与负载均衡**:启用KeepAlive可以减少建立新连接的开销,提高服务器性能,但在某些情况下也可能导致某些服务器承受过大压力,因此需要合理设置KeepAlive参数和负载均衡策略。 4. **Java与Nginx的配合...

    keepalive.zip

    为了解决这个问题,"keepalive.zip"这个压缩包提供了一个名为"keepalive.jar"的插件,其功能就是定时向数据库发送查询请求,以保持连接的活跃,防止因长时间无交互而自动断开。 "keepalive"机制在网络通信中是一种...

Global site tag (gtag.js) - Google Analytics