前段时间遇到一个为问题,通过监控apache的日志发现,http接口调用的响应时间非常长。
----------------------------------------------------------------------------------------------------------------------
插一段apache日志格式:
例如:httpd.conf中的部分log格式
LogFormat "%h %D %{X_READTIME}i %t \"%m http://%V%U%q\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
logs中的一条日志记
119.163.52.24
2443
- [15/Jun/2012:00:00:00 +0800]
"GET http://shuju.wuliu.taobao.com/timeCostResponse.do?sellerId=341434852&ip=119.163.52.24"
200
63
"http://list.taobao.com/market/baby.htm?spm=640.1000530.0.620&cat=50095706&spercent=95&"
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_4) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5
.1.7 Safari/534.57.2"
日志具体字段解释:
%h 发送请求的客户端ip地址
%D 服务器处理本请求所用的时间
%m: 请求的方法
%t: 以公共日志时间格式表示的时间
%r: 请求的第一行
%s: 状态。对于进行内部重定向的请求
%b: CLF格式的已发送字节数量,不包含HTTP头
------------------------------------------------------------------------------------------------------
看了一下机器的性能情况,发现CPU、load、内存都没有啥问题,基本没有打的波动,很是疑惑,最后看了一下网络的情况,
sar -n SOCK 后发现tcp创建的连接数很多,远远超出了正常的范围,于是开始看TCP链接的状态,最后问题定位是请求的一个外部服务器出现问题,
导致TCP链接一直没有释放,后来httpclient的超时时间设置短了点,并且使用完了主动关闭,而不是依赖外部服务器关闭,发布解决。
------------------------------------------------------------------------------------------------------
(1)CLOSED:起始点,在超时或者链接关闭的时候进入此状态;
(2)LISTEN:服务器端在等待连接过来的时候的状态,等待客户端来链接服务器;
(3)SYN_SENT:客户端发起连接,发送SYN给服务器,如果服务器不能链接,则直接进入CLOSED状态;
(4)SYN_REVD:和SYN_SENT对应,服务器接收客户端SYN请求,服务器有LISTEN状态进入SYB_REVD状态,同事服务器回应一个ACK,同时发送一个SYN给客户端,另外一种情况,客户端在发起SYN的同时接收服务器的SYN请求,客户端由SYN_SENT进入到SYN_REVD状态;
(5)ESTABLISHED:服务器和客户端在完成3次握手进入此状态,说明已经可以传输数据;
(6)FIN_WAIT_1:主动关闭的一方,有状态ESTABLISHED进入此状态,同时发送ACK;
(7)FIN_WAIT_2:主动关闭的一方,在接收到对方的FIN ACK,进入此状态,由此不能再接收对方的数据,但是能够向对方发送数据;
(8)CLOSE_WAIT:接收到FIN以后,被动关闭的一方进入此状态;
(9)LAST_ACK:被动关闭的一方,发起关闭请求,由状态CLOSE_WAIT进入此状态
(10)TIME_WAIT:最纠结的状态来了。有3个状态可以转化成它,我们一一来分析:
a.由FIN_WAIT_2进入此状态:在双方不同时发起FIN的情况下,主动关闭的一方在完成自身发起的关闭请求后,接收到被动关闭一方的FIN后进入的状态。
b.由CLOSING状态进入:双方同时发起关闭,都做了发起FIN的请求,同时接收到了FIN并做了ACK的情况下,由CLOSING状态进入。
c.由FIN_WAIT_1状态进入:同时接受到FIN(对方发起),ACK(本身发起的FIN回应),与b的区别在于本身发起的FIN回应的ACK先于对方的FIN请求到达,而b是FIN先到达。这种情况概率最小
--------------------------------------------------------------------------------------------
netstat 命令常用参数,用来查询TCP的状态
-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-p 显示建立相关链接的程序名
-u (udp)仅显示udp相关选项
-c 每隔一个固定时间,执行该netstat命令。
-l 仅列出有在 Listen (监听) 的服務状态
(1)查看apache进程数量:
ps -ef | grep httpd | wc -l
(2)查看TCP各个状态的数量:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
netstat -nat |awk '{print $6}'|sort|uniq -c
(3)查看apache日志中访问前十名的IP地址
awk '{print $1}' access_log |sort|uniq -c|sort -nr|head -10
(1)为什么 TIME_WAIT 状态需要保持 2MSL 这么长的时间?
TIME_WAIT的等待时间为2MSL,即最大段生存时间.如果 TIME_WAIT 状态保持时间不足够长(比如小于2MSL),第一个连接就正常终止了.第二个拥有相同相关五元组的连接出现(因为连接终止前发起的一方可能需要重发 ACK,所以停留在该状态的时间必须为MSL的2倍.),而第一个连接的重复报文到达,干扰了第二个连接.TCP实现必须防止某个连接的重复报文在连接终 止后出现,所以让TIME_WAIT态保持时间足够长(2MSL),连接相应方向上的TCP报文要么完全响应完毕,要么被丢弃.建立第二个连接的时候,不 会混淆.
(2)对apache的操作
HTTP协议1.1版规定default行为是Keep-Alive,也就是会重用TCP连接传输多个request/response.所以我打开 http中的keepalive On,发现TIME_WAIT就立刻少了下来.只有300的样子.总结一下.我认为有二个原因.
1.keepalive没有开,导致每次请求都要建立新的tcp连接,请求完成以后关闭,增加了很多time_wait的状态,没有重 用,KeepAlive我认为它指的是保持连接活跃,类似于Mysql的永久连接.如果将KeepAlive设置为On,那么来自同一客户端的请求就不需 要再一次连接,避免每次请求都要新建一个连接而加重服务器的负担.
2.然后keepalive在系统中本身的值很高.默认空闲连接 7200 秒(2 小时)内没有活动.才会断开.
keeplive的timeout时间是请求完成后,链接仍然处于ESTABLISHED状态的时间。
对于一些特定场景才需要keepalive,比如请求一个页面,它带有图片、 js、css,且这些请求也将马上再次落到这台机器上(从这个角度讲我们不需要)。
–打开keepalive,减少三次握手四次挥手的开销,但是同时相当于增加了apache处理线程的堆积,进而可能增加apache进程数,换言之就增加了内存消耗。
分享到:
相关推荐
- **工业自动化**:在生产线中,通过网络调试助手远程监控PLC和其他设备的状态,进行故障排查和程序更新。 - **环境监测**:在远程气象站或水文监测站点,通过TCP/IP到串口转换器收集数据,并使用调试助手进行实时...
同时,理解模块的错误代码和状态指示也是十分重要的,以便在遇到问题时进行排查和解决。 总之,USR-TCP232-304_AT_V2.0是一款强大的串口到网络转换器,它利用AT指令集进行配置,适用于多种物联网场景。"基于M0系列...
设备测试: "USR-TCP232-Test" 软件用于测试 USR-TCP232 设备的工作状态。它可以通过模拟数据传输和网络通信来...问题排查: 如果用户遇到连接或通信问题,该测试工具可能提供一些诊断信息,帮助用户定位和解决问题。
5. **端口监听**:可以监听特定端口,查看经过该端口的数据,这对于检测网络服务状态和排查网络故障非常有用。 其次,"串口调试助手"则是针对串行通信(RS-232、RS-485等)进行调试的工具。其主要特点包括: 1. **...
USR-TCP232是一款将串口(Serial Port)转换为网络(TCP/IP)通讯的设备,常用于解决远程串口设备的联网问题。这款工具的调试软件名为USR-TCP232-Test,它提供了方便的界面来帮助用户进行串口到网口的通信测试与调试...
3. **报文分析**:它能解析TCP报文头,揭示TCP选项和标志,如SYN、ACK、FIN、RST等,帮助分析连接状态和异常情况。 4. **时间线显示**:TCPTrace提供了时间线视图,清晰展示每个事件发生的时间顺序,便于理解网络...
使用TCP-UDP数据包自动发送工具V3.01,不仅可以加深对TCP和UDP协议原理的理解,还可以用于实际项目中的网络调试、性能评估和问题诊断。例如,在开发网络应用程序时,可以通过发送特定的数据包来测试服务器的响应;在...
总的来说,win_tcptrace-6.2.0是一款强大且易用的网络诊断工具,它通过对TCP/IP协议的深度解析,为IT专业人员提供了宝贵的网络监控和问题排查手段,有助于提升网络的稳定性和安全性。无论是网络管理员还是开发者,...
这对于排查问题或管理资源非常有用,例如发现占用大量带宽的应用程序。 5. **操作功能**:除了查看信息外,TCP View还允许用户中断(Kill)连接,这对于测试和调试网络问题特别有用。你可以直接从工具中终止不再...
TCP(Transmission Control Protocol)是一种面向连接的、可靠的传输层协议,...TCP状态变迁图清楚地展示了这些状态的流转,有助于理解和排查网络通信中的问题。理解TCP连接的生命周期对于网络编程和故障诊断至关重要。
该工具的主要功能是对TCP连接进行跟踪和监听,帮助开发者和网络管理员深入理解网络通信的过程,排查网络问题,优化应用程序性能。以下是对TCPTrace及其相关知识点的详细介绍: 1. **TCP/IP协议**:TCP...
"TCP-UDP-SOCK-TOOL[TCP-UDP Socket调试工具集合].7z"是一个包含多种用于TCP和UDP Socket调试工具的压缩包,可以帮助开发者和网络管理员更好地理解和排查网络问题。 首先,TCP是一种面向连接的、可靠的传输协议,它...
这款软件界面简洁,操作方便,是系统管理员和普通用户排查网络问题的得力助手。 TCPView的核心功能在于实时显示当前系统中所有活动的TCP连接,包括进程ID、本地IP地址、本地端口号、远程IP地址以及远程端口号等关键...
描述中提到的“倍福TCP 通讯连接ERR 6报错,安装路径缺少此文件导致”问题,涉及到TCP连接错误和软件安装过程中的文件缺失。ERR 6可能是一个特定的错误代码,通常在软件或系统中用来标识特定类型的故障。在这种情况...
6. **日志记录**:为了方便后期分析,工具包通常会提供日志记录功能,保存通信过程中的所有数据交换,方便问题排查。 7. **脚本支持**:高级的工具可能允许用户编写脚本,自动化一系列测试步骤,提高工作效率。 在...
它具备了客户端和服务端的功能,可以帮助开发者在开发、测试和排查TCP网络问题时提供极大的便利。以下将详细阐述TCP助手的相关知识点: 1. **TCP协议**:传输控制协议(Transmission Control Protocol)是互联网...
【网络问题排查与netstat命令详解】 在信息技术领域,网络问题的排查是开发人员和运维工程师日常工作中不可或缺的一部分。无论是Windows还是Linux系统,`netstat`命令都是一个强大的工具,用于查看网络连接状态、...
总的来说,“TCP-UDP连接断开程序”是一个强大的网络诊断工具,它使用户能够直观地了解和控制本地的TCP和UDP连接,有助于网络管理和问题排查。无论是对于专业人士还是普通用户,理解TCP和UDP的工作原理以及如何有效...
TCP(Transmission Control Protocol)是一...理解TCP状态转换对于排查网络连接问题,优化连接建立和关闭的流程,以及处理异常网络条件非常重要。在Windows编程中,正确处理这些状态能够确保网络程序的稳定性和可靠性。
5. **日志记录**:软件可能具有记录所有通信交互的功能,方便后期分析和问题排查。 6. **跨平台兼容性**:支持Windows CE和Windows XP操作系统,适应不同环境下的调试需求。 7. **通用版**:意味着此软件不仅适用...