• TCP端口连接状态


    TCP端口的几种连接状态
    LISTEN:侦听来自远方的TCP端口的连接请求
    SYN-SENT:再发送连接请求后等待匹配的连接请求(客户端)
    SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认(服务器)
    ESTABLISHED:代表一个打开的连接
    FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
    FIN-WAIT-2:从远程TCP等待连接中断请求
    CLOSE-WAIT:等待从本地用户发来的连接中断请求
    CLOSING:等待远程TCP对连接中断的确认
    LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
    TIME-WAIT:等待足够的时间以确保远程TCP接收到连接中断请求的确认
    CLOSED:没有任何连接状态
    

    更多详细介绍请参考 tcp连接全过程各种状态详解

    netstat命令
    netstat(选项)
    -a或--all:显示所有连线中的Socket;
    -A<网络类型>或--<网络类型>:列出该网络类型连线中的相关地址;
    -c或--continuous:持续列出网络状态;
    -C或--cache:显示路由器配置的快取信息;
    -e或--extend:显示网络其他相关信息;
    -F或--fib:显示FIB;
    -g或--groups:显示多重广播功能群组组员名单;
    -h或--help:在线帮助;
    -i或--interfaces:显示网络界面信息表单;
    -l或--listening:显示监控中的服务器的Socket;
    -M或--masquerade:显示伪装的网络连线;
    -n或--numeric:直接使用ip地址,而不通过域名服务器;
    -N或--netlink或--symbolic:显示网络硬件外围设备的符号连接名称;
    -o或--timers:显示计时器;
    -p或--programs:显示正在使用Socket的程序识别码和程序名称;
    -r或--route:显示Routing Table;
    -s或--statistice:显示网络工作信息统计表;
    -t或--tcp:显示TCP传输协议的连线状况;
    -u或--udp:显示UDP传输协议的连线状况;
    -v或--verbose:显示指令执行过程;
    -V或--version:显示版本信息;
    -w或--raw:显示RAW传输协议的连线状况;
    -x或--unix:此参数的效果和指定"-A unix"参数相同;
    --ip或--inet:此参数的效果和指定"-A inet"参数相同。
    

    示例:

    查看网络连接总数
    # netstat -an |wc -l
    
    查看某个特定ip的连接数
    # netstat -an |grep 8.8.8.8 |wc -l
    
    查看连接数等待time_wait状态连接数
    # netstat -an |grep TIME_WAIT|wc -l
    
    查看建立稳定连接数量
    # netstat -an |grep ESTABLISHED |wc -l
    
    查看不同状态的连接数
    # netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
    LAST_ACK 21
    LISTEN 11
    SYN_RECV 15
    CLOSE_WAIT 36099
    ESTABLISHED 1735
    FIN_WAIT1 1
    FIN_WAIT2 2
    SYN_SENT 3
    TIME_WAIT 13356
    
    查看每个ip跟服务器建立的连接数
    # netstat -nat|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
      36477 192.168.25.209
        166 192.168.25.214
    (PS:正则解析:显示第5列,-F : 以:分割,显示列,sort 排序,uniq -c统计排序过程中的重复行,sort -rn 按纯数字进行逆序排序)
    
    查看每个ip建立的ESTABLISHED/TIME_OUT状态的连接数
    # netstat -nat|grep ESTABLISHED|awk '{print$5}'|awk -F : '{print$1}'|sort|uniq -c|sort -rn
        561 192.168.25.209
        228 192.168.25.214
        218 192.168.25.210
        215 192.168.25.247
        177 192.168.25.248
    
    问题1:解决time_wait连接数大量问题

    查询到time_wait连接数过多情况下,调整内核参数:/etc/sysctl.conf

    # vim /etc/sysctl.conf
    添加以下配置文件:
    net.ipv4.tcp_syncookies = 1
    net.ipv4.tcp_tw_reuse = 1
    net.ipv4.tcp_tw_recycle = 1
    net.ipv4.tcp_fin_timeout = 300
    
    让配置生效
    # /sbin/sysctl -p
    
    参数详解:
    1.net.ipv4.tcp_syncookies = 1 表示开启 syn cookies 。当出现 syn 等待队列溢出时,启用 cookies 来处理,可防范少量 syn ***,默认为 0 ,表示关闭; 
    2.net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将 time-wait sockets 重新用于新的 tcp 连接,默认为 0 ,表示关闭;
    3.net.ipv4.tcp_tw_recycle = 1 表示开启 tcp 连接中 time-wait sockets 的快速回收,默认为 0 ,表示关闭。
    4.net.ipv4.tcp_fin_timeout 修改系靳默认的 timeout 时间
    

    如果以上配置调优后性能还不理想,可继续修改一下配置:

    # vim /etc/sysctl.conf
    net.ipv4.tcp_keepalive_time = 1200   #表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
    net.ipv4.ip_local_port_range = 1024 65000   #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
    net.ipv4.tcp_max_syn_backlog = 8192   #表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
    net.ipv4.tcp_max_tw_buckets = 5000   #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。
    默认为180000,改为5000。
    对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于 Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
    
    问题2:ESTABLISHED连接数过大问题

    怎么解决请求结束后依然存在大量ESTABLISHED没有被释放

    初步推断是tomcat服务器回收session时出了问题,这个一般都跟服务器的Timeout设置有联系。

    查看tomcat的配置文件 server.xml

    <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" URIEncoding="UTF-8" />
    *****
    

    检查配置得出20000毫秒的时候acceptCount=”100” ,明显不合理,最大连接数也太小了吧。

    所以进一步优化:

    connectionTimeout="20000" 改为 connectionTimeout="100"
    acceptCount="100"改为acceptCount="5000"
    

    更多详细介绍请参考 netstat监控大量ESTABLISHED连接数和TIME_WAIT连接数题解决

  • 相关阅读:
    RabbitMq使用说明
    php使用rabbitmq需安装amqp拓展协议
    新建springboot web项目pom报错
    HttpRunner Manager 接口自动化平台搭建
    数据库存储过程进行批量插入数据
    Windows系统下Robot Framework的安装
    利用Charles模拟客户端弱网环境进行弱网测试
    JMeter进行简单的接口压测
    JMeter的安装和使用
    grep, sed 和 awk 学习总结
  • 原文地址:https://www.cnblogs.com/hello-sky/p/11598954.html
Copyright © 2020-2023  润新知