2019独角兽企业重金招聘Python工程师标准>>>

记录一下自己的思想过程
现象:在netstat的时候发现大量处于LAST_ACK状态的TCP连接,达到在ESTABLISHED状态的90%以上

[root@ccsafe ~]# netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c               
      6 CLOSE_WAIT
      7 CLOSING    
   6838 ESTABLISHED
   1037 FIN_WAIT1  
    357 FIN_WAIT2  
   5830 LAST_ACK   
      2 LISTEN     
    276 SYN_RECV   
     71 TIME_WAIT  
[root@ccsafe ~]#

看看系统状态,性能都花在系统中断和上下文切换
[root@ccsafe ~]# vmstat 2
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b   swpd   free   buff cache   si   so    bi    bo   in   cs us sy id wa st
1 0      0 3091812 363032 284132    0    0     0     0    1    1 0 0 100 0 0
0 0      0 3091812 363032 284132    0    0     0     0 13750 3174 0 5 94 0 0
0 0      0 3091936 363032 284132    0    0     0     0 13666 3057 1 5 94 0 0
0 0      0 3092060 363032 284132    0    0     0    16 13749 3030 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13822 3144 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13390 2961 0 5 95 0 0
0 0      0 3092060 363032 284132    0    0     0     0 13541 3182 0 6 94 0 0

查看socket队列信息
[root@ccsafe ~]# sar -n SOCK 5
Linux 2.6.18-53.1.13.el5PAE (ccsafe)     10/21/2008

06:31:43 PM    totsck    tcpsck    udpsck    rawsck   ip-frag    tcp-tw
06:31:48 PM      6951     13868         1         0         0       430
Average:         6951     13868         1         0         0       430

根据TCP状态的变化过程来分析,LAST_ACK属于被动关闭连接过程中的状态
ESTABLISHED->CLOSE_WAIT->(发送ACK)->LAST_ACK->(发送FIN+接收ACK)->CLOSED
现在状态都堆积到LAST_ACK,初步判断问题从上下两个状态着手

调节一下LAST_ACK时间...
[root@ccsafe ~]# sysctl -a |grep last_ack
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 30

[root@ccsafe ~]# sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack=10
net.ipv4.netfilter.ip_conntrack_tcp_timeout_last_ack = 10
[root@ccsafe ~]# sysctl -p

[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"
Every 5.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

6 CLOSE_WAIT
      9 CLOSING
   6420 ESTABLISHED
    693 FIN_WAIT1
    391 FIN_WAIT2
   5081 LAST_ACK
      2 LISTEN
    203 SYN_RECV
     66 TIME_WAIT

检查一下LAST_ACK所对应的应用
[root@ccsafe ~]# netstat -ant|fgrep "LAST_ACK"|cut -b 49-75|cut -d ":" -f1|sort |uniq -c|sort -nr --key=1,7|head -5
    101 220.160.210.6
     46 222.75.65.69
     31 221.0.91.118
     24 222.210.8.160
     22 60.161.81.28
[root@ccsafe ~]#

[root@ccsafe ~]# netstat -an|grep "220.160.210.6"
tcp        0 17280 10.1.1.145:80           220.160.210.6:52787         ESTABLISHED
tcp        1 14401 10.1.1.145:80           220.160.210.6:52513         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52769         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52768         LAST_ACK   
tcp        0   8184 10.1.1.145:80           220.160.210.6:52515         LAST_ACK   
tcp        1 14401 10.1.1.145:80           220.160.210.6:52514         LAST_ACK   
tcp        0   8184 10.1.1.145:80           220.160.210.6:52781         LAST_ACK

是TCP80端口的应用,调节一下nginx的keepalive时间...
[root@ccsafe ~]# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
2008/10/21 19:15:31 [info] 21352#0: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
2008/10/21 19:15:31 [info] 21352#0: the configuration file /usr/local/nginx/conf/nginx.conf was tested successfully
[root@ccsafe ~]# ps aux|egrep '(PID|nginx)'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      8290 0.0 0.0   7572 1124 ?        Ss   Oct04   0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody    8291 0.2 0.3 19704 13776 ?        S    Oct04 71:35 nginx: worker process     
nobody    8292 0.3 0.2 17604 11680 ?        S    Oct04 77:26 nginx: worker process     
nobody    8293 0.2 0.4 22528 16636 ?        S    Oct04 58:13 nginx: worker process     
nobody    8294 0.3 0.4 24944 19020 ?        S    Oct04 94:07 nginx: worker process     
nobody    8295 0.3 0.5 27496 21508 ?        S    Oct04 84:41 nginx: worker process     
nobody    8296 0.3 0.1 13388 7496 ?        S    Oct04 84:14 nginx: worker process     
nobody    8297 0.2 0.0   9196 3268 ?        S    Oct04 58:21 nginx: worker process     
nobody    8298 0.3 0.2 15392 9504 ?        S    Oct04 75:16 nginx: worker process     
root     21354 0.0 0.0   3896   720 pts/0    S+   19:15   0:00 egrep (PID|nginx)
(动态加载新配置)
[root@ccsafe ~]# kill -HUP 8290
[root@ccsafe ~]#

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90 |sort |uniq -c

1 CLOSE_WAIT
   1138 CLOSING
   7161 ESTABLISHED
   1427 FIN_WAIT1
    396 FIN_WAIT2
   5740 LAST_ACK
      2 LISTEN
    350 SYN_RECV
    148 TIME_WAIT

...

[root@ccsafe ~]# netstat -ant|fgrep ":"|cut -b 77-90 |sort |uniq -c
   1151 CLOSING    
   8506 ESTABLISHED
   1452 FIN_WAIT1  
    666 FIN_WAIT2  
   6568 LAST_ACK   
      2 LISTEN     
    429 SYN_RECV   
     92 TIME_WAIT

...

LAST_ACK不下,而且CLOSING 和FIN_WAIT突增

着重看看可影响主动断开TCP连接时几个参数
tcp_keepalive_intvl:探测消息发送的频率
tcp_keepalive_probes:TCP发送keepalive探测以确定该连接已经断开的次数
tcp_keepalive_time:当keepalive打开的情况下,TCP发送keepalive消息的频率

[root@ccsafe ~]# sysctl -a|grep tcp_keepalive
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 160

tcp_retries2:在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试
[root@ccsafe ~]# sysctl -a |grep tcp_retries
net.ipv4.tcp_retries2 = 15
net.ipv4.tcp_retries1 = 3

加速处理那些等待ACK的LAST_ACK,减少等待ACK的LAST_ACK的重试次数
[root@ccsafe ~]# sysctl -w net.ipv4.tcp_retries2=5
net.ipv4.tcp_retries2 = 5

减少keepalive发送的频率
[root@ccsafe ~]# sysctl -w net.ipv4.tcp_keepalive_intvl=15
net.ipv4.tcp_keepalive_intvl = 15
[root@ccsafe ~]# sysctl -p

排除syncookies的影响
[root@ccsafe ~]# !ec
echo "0" >/proc/sys/net/ipv4/tcp_syncookies
[root@ccsafe ~]# echo "1" >/proc/sys/net/ipv4/tcp_syncookies

[root@ccsafe ~]# sysctl -a|grep tcp_keepalive              
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 2
net.ipv4.tcp_keepalive_time = 160

[root@ccsafe ~]# sysctl -a|grep syncookies
net.ipv4.tcp_syncookies = 1

延长keepalive检测周期,保留ESTABLISHED数量
[root@ccsafe ~]# echo "1800" >/proc/sys/net/ipv4/tcp_keepalive_time
[root@ccsafe ~]# echo "5" >/proc/sys/net/ipv4/tcp_keepalive_probes
[root@ccsafe ~]# echo "15" >/proc/sys/net/ipv4/tcp_keepalive_intvl
[root@ccsafe ~]# sysctl -a|grep tcp_keepalive                     
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800

[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
    363 CLOSING
   5145 ESTABLISHED
   1073 FIN_WAIT1
    174 FIN_WAIT2
   6042 LAST_ACK
      2 LISTEN
    301 SYN_RECV
     85 TIME_WAIT

LAST_ACK不下,但是CLOSING有所回落
tcp_orphan_retries:在近端丢弃TCP连接之前﹐要进行多少次重试。
[root@ccsafe ~]# sysctl -a|grep tcp_orphan
net.ipv4.tcp_orphan_retries = 0

关键,丢TCP太频繁了,以至于后勤都跟不上。设置丢弃之前的重试次数
[root@ccsafe ~]# echo "3" >/proc/sys/net/ipv4/tcp_orphan_retries
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
     24 CLOSING
   5422 ESTABLISHED
    279 FIN_WAIT1
    214 FIN_WAIT2
   1966 LAST_ACK
      2 LISTEN
    269 SYN_RECV
     74 TIME_WAIT

上下调节该值,找个合适的临界点
[root@ccsafe ~]# echo "7" >/proc/sys/net/ipv4/tcp_orphan_retries                
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
    175 CLOSING
   5373 ESTABLISHED
    436 FIN_WAIT1
    209 FIN_WAIT2
   3184 LAST_ACK
      2 LISTEN
    283 SYN_RECV
    110 TIME_WAIT

恢复,同时FIN_WAIT1的值过高。考虑减少tcp_fin_timeout时间
[root@ccsafe ~]# echo "2" >/proc/sys/net/ipv4/tcp_orphan_retries

[root@ccsafe ~]# sysctl -a|grep tcp_fin
net.ipv4.tcp_fin_timeout = 10

[root@ccsafe ~]# echo "5" >/proc/sys/net/ipv4/tcp_fin_timeout
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

2 CLOSE_WAIT
     17 CLOSING
   5665 ESTABLISHED
    145 FIN_WAIT1
    141 FIN_WAIT2
   1068 LAST_ACK
      2 LISTEN
    287 SYN_RECV
     68 TIME_WAIT

相比FIN_WAIT,SYN_RECV的值偏高。加大发送synack的质量
[root@ccsafe ~]# sysctl -a|grep synack
net.ipv4.tcp_synack_retries = 1
[root@ccsafe ~]# echo "2" >/proc/sys/net/ipv4/tcp_synack_retries
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     16 CLOSING
   5317 ESTABLISHED
    200 FIN_WAIT1
    158 FIN_WAIT2
   1001 LAST_ACK
      2 LISTEN
    303 SYN_RECV
     78 TIME_WAIT

[root@ccsafe ~]# sysctl -a|grep keepalive
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_time = 1800
[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
      7 CLOSING
   5356 ESTABLISHED
    175 FIN_WAIT1
    136 FIN_WAIT2
   1045 LAST_ACK
      2 LISTEN
    345 SYN_RECV
     64 TIME_WAIT

减少keepalive的检测周期,LAST_ACK上升
[root@ccsafe ~]# echo "10" >/proc/sys/net/ipv4/tcp_keepalive_intvl
[root@ccsafe ~]# echo "1" >/proc/sys/net/ipv4/tcp_synack_retries                
[root@ccsafe ~]# !wat
watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

1 CLOSE_WAIT
     13 CLOSING
   5605 ESTABLISHED
    212 FIN_WAIT1
    131 FIN_WAIT2
   1143 LAST_ACK
      2 LISTEN
    252 SYN_RECV
     79 TIME_WAIT

恢复
[root@ccsafe ~]# echo "15" >/proc/sys/net/ipv4/tcp_keepalive_intvl

[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     14 CLOSING
   5862 ESTABLISHED
    230 FIN_WAIT1
    205 FIN_WAIT2
   1064 LAST_ACK
      2 LISTEN
    244 SYN_RECV
     59 TIME_WAIT

[root@ccsafe ~]# watch -n 10 "netstat -ant|fgrep ":"|cut -b 77-90|sort |uniq -c"

Every 10.0s: netstat -ant|fgrep :|cut -b 77-90|sort |uniq -c

3 CLOSE_WAIT
     26 CLOSING
   6712 ESTABLISHED
    270 FIN_WAIT1
    230 FIN_WAIT2
    994 LAST_ACK
      2 LISTEN
    254 SYN_RECV
     73 TIME_WAIT

[root@ccsafe ~]#

目前LAST_ACK占ESTABLISHED的量在15%左右

转载于:https://my.oschina.net/lionel45/blog/142513

大量LAST_ACK 的分析过程相关推荐

  1. python画折线图代码-Python折线图的分析过程和画图的方法

    说起折线图,很多人都觉得非常简单,不就是一些点连成的线吗?用 Excel 几秒钟就能画出一张折线图. 真的就这么简单吗? 想一想:在普通的折线图中,如何自动地添加一条代表平均值的横线?如何添加一条带箭 ...

  2. lucene 源码分析_Lucene分析过程指南

    lucene 源码分析 本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lu ...

  3. Lucene分析过程指南

    本文是我们名为" Apache Lucene基础知识 "的学院课程的一部分. 在本课程中,您将了解Lucene. 您将了解为什么这样的库很重要,然后了解Lucene中搜索的工作方式 ...

  4. CFD分析过程(CFD Analysis Process)

    2019独角兽企业重金招聘Python工程师标准>>> CFD分析过程 进行CFD分析的一般过程如下所示: 1.将流动问题表示为表达式 2.建立几何与流域的模型 3.设置边界条件和初 ...

  5. linux pmap 内存泄露,一个驱动导致的内存泄漏问题的分析过程(meminfo-pmap-slabtop-alloc_calls)...

    关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...

  6. 生信分析过程中这些常见文件的格式以及查看方式你都知道吗?

    生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据fastq之外,还需要准备基因组文件fasta格式和基因注释文件gtf格式.在分析的过程中还会有众多中间文件的生成,如bed.bed12. ...

  7. sqlplus登录缓慢的问题分析过程及解决小记

    点击上方"蓝字" 关注我们,享更多干货! 一.问题描述 近日在某客户现场进行巡检,发现有一个系统在进行sqlplus / as sysdba登录的时候特别缓慢.多次测试,最长时间可 ...

  8. 【华为云技术分享】避坑指南:关于SPDK问题分析过程

    [前言] 这是一次充满曲折与反转的问题分析,资料很少,代码很多,经验很少,概念很多,当内核态,用户态,DIF,LBA,大页内存,SGL,RDMA,NVME和SSD一起迎面而来的时候,问题是单点的意外, ...

  9. Android 系统(216)---Android坐标分析过程

    Android坐标分析过程 Android中有两种坐标系,分别是Android坐标系和视图坐标系.  首先看一下屏幕区域划分  //获取状态栏高度 Rect rect= new Rect(); get ...

最新文章

  1. python神经网络原理pdf_《深度学习原理与 TensorFlow实践》高清完整PDF版 下载
  2. PHP 7.3 我们将迎来灵活的 heredoc 和 nowdoc 句法结构
  3. tomcat mysql数据源_Tomcat mysql 配置数据源
  4. 进击的UI------------------UISegmentedControlUISlide
  5. xcode 连接 github 进行代码版本控制
  6. cisco3550交换机限速配置
  7. 二级指针做输入_第2种内存模型
  8. 一个简单的Ajax实例
  9. 数值计算方法(三)——变步长梯形法与龙贝格算法
  10. Debugging a Plug-in
  11. Spring BeanFactory、ApplicationContext IOC 容器获取与使用
  12. sql不同数据处理方式完成同一处理结果对日志增长的影响
  13. CSS颜色代码,二进制颜色代码
  14. 华为模拟器eNSP下载与安装(win10系统)
  15. js原生touch事件实现微信语音按住录音,上滑取消。
  16. ESD问题案例分析-智能手表为例
  17. linux系列---常见命令
  18. java 操作日志 log
  19. SpringSecurity自定义多Provider时提示No AuthenticationProvider found for问题的解决方案与原理(一)
  20. 2022年前端面试题整理,持续更新中

热门文章

  1. linux 正则查找email_Linux生产环境上,最常用的一套“Sed“技巧
  2. java collections_Java集合基础的详细介绍(二)
  3. SpringSecurity学习:1(第一个SpringSecurity项目)
  4. python数组越界_python 整数越界问题详解
  5. python获取文本光标_使用python readline时如何获取(并设置)当前bash光标位置?
  6. python自动化测试难不难_Python测试自动化好学还是Pythonweb开发好学?
  7. iOS应用模块化的思考及落地方案(一)模块的划分及模块化工作流程
  8. 女神推荐, 卡片,广告图 ,点击查看更多
  9. 05-dispatch_semphore
  10. 一句话的设计模式(转)