Chinaunix首页 | 论坛 | 博客
  • 博客访问: 371228
  • 博文数量: 114
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1219
  • 用 户 组: 普通用户
  • 注册时间: 2015-02-07 21:23
文章分类

全部博文(114)

文章存档

2018年(1)

2017年(5)

2016年(87)

2015年(21)

我的朋友

分类: 系统运维

2016-04-07 15:05:56


  1. 一、生产服务器netstat tcp连接状态

  2. 1.1生产服务器某个业务LVS负载均衡上连接状态数量

  3. [oldboy@LVS-1-1 ~]$ netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  4. TIME_WAIT 9137
  5. CLOSE_WAIT 207
  6. FIN_WAIT1 547
  7. ESTABLISHED 597
  8. FIN_WAIT2 74
  9. SYN_RECV 70
  10. CLOSING 55
  11. LAST_ACK 8
  12. [root@lvs_nginx~]#netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  13. TIME_WAIT 422
  14. CLOSE_WAIT 590
  15. FIN_WAIT1 56
  16. FIN_WAIT2 28
  17. ESTABLISHED 1731
  18. 1.2生产服务器某个业务web上连接状态数量

  19. [root@web1 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  20. TIME_WAIT 418
  21. FIN_WAIT1 7
  22. FIN_WAIT2 3
  23. ESTABLISHED 1097
  24. LAST_ACK 2

  25. [root@web2 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  26. TIME_WAIT 250
  27. FIN_WAIT1 2
  28. FIN_WAIT2 3
  29. ESTABLISHED 1032
  30. LAST_ACK 2

  31. [root@old_web ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  32. TIME_WAIT 342
  33. CLOSE_WAIT 618
  34. FIN_WAIT1 37
  35. FIN_WAIT2 3
  36. ESTABLISHED 1681
  37. SYN_RECV 1
  38. [root@K32_50718 ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  39. TIME_WAIT 4146
  40. FIN_WAIT1 352
  41. FIN_WAIT2 1112
  42. ESTABLISHED 8451
  43. SYN_RECV 186
  44. CLOSING 9
  45. LAST_ACK 102
  46. 1.3 生产服务器某个业务db上连接状态数量

  47. [root@web_slave ~]# netstat -n |awk '/^tcp/ {++oldboy[$NF]} END {for(a in oldboy) print a, oldboy[a]}'
  48. TIME_WAIT 263
  49. FIN_WAIT1 1
  50. FIN_WAIT2 48
  51. ESTABLISHED 918


  1. 二、tcp连接状态的描述说明(netstat输出)

  2. 2.1 执行netstat -n查看输出结果共6列

  3. [root@OLDBOY ~]# netstat -n
  4. Active Internet connections (w/o servers)
  5. Proto Recv-Q Send-Q Local AddressForeign AddressState
  6. tcp00 10.0.0.183:5058410.0.0.181:22ESTABLISHED
  7. 2.2 通过man netstat查看netstat输出结果信息

  1. 三、庖丁解牛获取连接状态数的命令
  2. 3.1 获取连接状态数的awk命令
  3. netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  4. 提示:将netstat -n的结果通过管道符交给awk命令处理。
  5. 3.2先来执行下netstat -n
  6. [oldboy@LVS-1-1 ~]$ netstat -n|more #截取部分有代表性的内容如下
  7. Active Internet connections (w/o servers)
  8. Proto Recv-Q Send-Q Local AddressForeign AddressState
  9. tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV
  10. tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV
  11. tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV
  12. tcp00 124.123.3.77:80221.237.233.41:2338TIME_WAIT
  13. tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1
  14. tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT
  15. tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1
  16. tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT
  17. tcp01 124.123.3.77:8059.49.174.176:26913CLOSING
  18. tcp00 124.123.3.77:80120.87.129.35:1787TIME_WAIT
  19. tcp0174 124.123.3.77:80120.71.134.66:1165CLOSING
  20. 提示:实际执行这条命令的时候,可能会得到上万条类似的记录,我们只取若干来举例。
  21. 3.3拆解awk命令

  22. 1)完整命令如下
  23. netstat -n |awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
  24. 2)awk庖丁解牛
  25. 命令拆分
  26. 功能说明
  27. /^tcp/
  28. 过滤出以tcp开头的行,“^”为正则表达式用法,以...开头,这里是过滤出以tcp开头的行。
  29. S[]
  30. 定义了一个名叫S的数组,在awk中,数组下标通常从 1 开始,而不是 0。
  31. NF
  32. 当前记录里域个数,默认以空格分隔,如上所示的记录,NF域个数等于6
  33. $NF
  34. 表示一行的最后一个域的值,如上所示的记录,$NF也就是$6,表示第6个字段的值,也就是SYN_RECV或TIME_WAIT等。
  35. S[$NF]
  36. 表示数组元素的值,如上所示的记录,就是S[TIME_WAIT]状态的连接数
  37. ++S[$NF]
  38. 表示把某个数加一,如上所示的记录,就是把S[TIME_WAIT]状态的连接数加一
  39. END

  40. for(key in S)
  41. 遍历S[]数组
  42. print key,”\t”,S[key]
  43. 打印数组的键和值,中间用\t制表符分割,显示好一些。
  44. 3)举个小例子练手
  45. 已知test.txt内容:
  46. 001 name wodi12k
  47. 002 name yingsui 15k
  48. 003 name jeacen10k
  49. 004 name kuqi8k
  50. 005 name yideng10k
  51. 006 name xiaofan8k
  52. 要求:统计老男孩培训学生中,不同薪水的学生的数量报表。
  53. [oldboy@test ~]$ cat test.txt |awk '/^00/ {++S[$NF]} END {for (a in S) print a,S[a]}'
  54. 15k 1
  55. 8k 2
  56. 10k 2
  57. 12k 1
  58. 提示:模拟前面的awk命令,过滤以00开头的行,然后进行处理。
  59. 上述awk数组元素内容:
  60. key=12k S[12K]=1
  61. key=15k S[15K]=1
  62. key=10k S[10K]=2
  63. key=8kS[8K]=2
  64. [oldboy@test ~]$ awk '/^00/ {++S[$NF]} END {for (a in S) print a,S[a]}' test.txt
  65. 15k 1
  66. 8k 2
  67. 10k 2
  68. 12k 1
  69. 提示:awk可以直接处理文本,因此,不需要去cat,不但不专业,而且内容多时,影响处理效率。

  1. 四、awk数组命令生产实战拓展
  2. 4.1统计apache日志单ip访问请求数排名(这个常用,考试也常考)
  3. 假设apache日志内容access.log内容为:
  4. 10.0.0.41 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  5. 10.0.0.43 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  6. 10.0.0.42 - - [03/Dec/2010:23:27:01 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  7. 10.0.0.46 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  8. 10.0.0.42 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  9. 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  10. 10.0.0.41 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  11. 10.0.0.47 - - [03/Dec/2010:23:27:02 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  12. 10.0.0.41 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  13. 10.0.0.46 - - [03/Dec/2010:23:27:03 +0800] "HEAD /checkstatus.jsp HTTP/1.0" 200 -
  14. 4.1.1 给出3种解决方案

  15. 法一:
  16. [root@oldboy /]# awk '{++S[$1]} END {for (oldboy in S) print oldboy ,S[oldboy]}' access.log |sort -rn -k2
  17. 10.0.0.41 3
  18. 10.0.0.47 2
  19. 10.0.0.46 2
  20. 10.0.0.42 2
  21. 10.0.0.43 1
  22. #提示 $1为第一个域的内容。-k2 为对第二个字段排序,即对数量排序。
  23. 法2:
  24. [root@oldboy /]# awk '{print $1}' access.log|sort|uniq -c |sort -rn -k1
  25. 3 10.0.0.41
  26. 2 10.0.0.47
  27. 2 10.0.0.46
  28. 2 10.0.0.42
  29. 1 10.0.0.43
  30. 提示:这个方法是容易想到的简单易用的方法,对于大多数同学来说,此法其实更适合大家,awk数组的方法看起来好,实际上对于初级运维来来说有点难度,经常记不住。
  31. 法3:
  32. [root@oldboy /]# sed's/- -.*$//g' access.log|sort|uniq -c|sort -rn -k1
  33. 3 10.0.0.41
  34. 2 10.0.0.47
  35. 2 10.0.0.46
  36. 2 10.0.0.42
  37. 1 10.0.0.43
  38. 提示:sed管道后的第一个sort是让所有一样的IP挨着,因为uniq -c只能对相邻的IP行去重计数。
  39. 此题的解答可以有10几种,前面的课程我们已经带大家细讲了,这里就不一一讲解了。
  40. 4.1.2统计apache日志单ip访问请求数排名价值何在?

  41. 解答:通过前面的命令,我们可以找到什么IP的访问apache比较频繁,一般单个IP访问数量过百,就值得怀疑了,如果短时间内上万PV访问,说明就不正常了,可以采取相应的处理手段,比如封掉此IP,此法要慎重,否则,可能会有误封问题,因为,国内的大多数公司还是NAT上网的,出口一个IP。
  42. 4.2 统计服务器当前单IP连接数最大的IP地址前十

  43. 提示:这个命令可以查出遭受DOS攻击的客户端IP地址。待处理内容如下:
  44. netstat -n >test.log的结果:
  45. Active Internet connections (w/o servers)
  46. Proto Recv-Q Send-Q Local AddressForeign AddressState
  47. tcp00 124.123.3.79:80219.85.194.23:12004SYN_RECV
  48. tcp00 124.123.3.77:80183.8.74.57:3276SYN_RECV
  49. tcp00 124.123.3.77:80124.236.0.214:63191SYN_RECV
  50. tcp00 124.123.3.77:80121.31.42.148:2338TIME_WAIT
  51. tcp01023 124.123.3.77:8061.178.184.222:62683FIN_WAIT1
  52. tcp00 124.123.3.77:80222.79.242.74:7416TIME_WAIT
  53. tcp04839 124.123.3.77:80121.31.42.148:30638FIN_WAIT1
  54. tcp00 124.123.3.77:80183.10.154.60:37282TIME_WAIT
  55. tcp01 124.123.3.77:8059.49.174.176:26913CLOSING
  56. tcp00 124.123.3.77:80121.31.42.148:1787TIME_WAIT
  57. tcp0174 124.123.3.77:80183.8.74.57:1165CLOSING
  58. 4.2.1 问题解决方案

  59. [root@OLDBOY ~]# awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}' test.log |sort -rn -k2
  60. 121.31.42.148 3
  61. 183.8.74.57 2
  62. Foreign 1
  63. 61.178.184.222 1
  64. 59.49.174.176 1
  65. 222.79.242.74 1
  66. 219.85.194.23 1
  67. 183.10.154.60 1
  68. 124.236.0.214 1
  69. 提示:
  70. 1)结果中的字符等,你可以进一步过滤。
  71. 2) 对于多分隔符匹配的用法大家可以参考老男孩的博文
  72. 深入浅出三剑客之awk必杀技一例
  73. http://oldboy.blog.51cto.com/2561410/950730
  74. 3)实际生产中,我们过滤出已经建立连接的状态ESTABLISHED,然后,应用上述命令处理,完整命令可能为:
  75. netstat -an|awk-F '[ :]+' '{++S[$6]} END {for (a in S) print a ,S[a]}'|sort -rn -k2
  76. 4.2.2 生产环境案例

  77. [leo@LVS-1-1 ~]$ netstat -an|grep EST|awk '{print $5}'|cut -d : -f 1|grep -v "^$"|awk '{++ETT[$1]} END {for (oldboy in ETT) print "ip:"oldboy "-----",ETT[oldboy] ''}'|sort -rn -k2|head -10
  78. ip:220.181.125.69----- 51
  79. ip:121.9.222.164----- 38
  80. ip:121.9.222.158----- 38
  81. ip:121.9.222.156----- 38
  82. ip:121.9.222.161----- 36
  83. ip:121.9.222.160----- 32
  84. ip:121.9.222.159----- 32
  85. ip:121.9.222.162----- 31
  86. ip:61.163.7.200----- 29
  87. ip:115.193.163.61----- 27
  88. 提示:这是早期的命令案例,我们看到命令虽然很简单,但是搞的很复杂。实际上可以用下面看起来简单,但是难度很大的命令替代之。
  89. netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2
  90. 注意,这里过滤的是已经建立连接的的连接,即状态ESTABLISHED。
  91. 4.2.3 本案例解决的生产问题

  92. netstat -an|grep EST|awk-F '[ :]+' '{++S[$6]} END {for (key in S) print "ip:"key"----->",S[key]}'|sort -rn -k2
  93. 注意,这里过滤的是已经建立连接的的连接,即状态ESTABLISHED。
  94. 对于命令结果中,单IP结尾的数大的,可以认为是不正常的访问。如 121.31.42.148 100 ,表示一个IP有100个连接
  95. 一般来说可以怀疑不正常,当网站压力大时,可以考虑限制或封掉这些冒似非法IP,当然,也不排除,企业里多个用户用一个出口IP访问。
  96. 壮士扼腕,有时也是必须的,否则,可能网站整体影响更大,甚至瘫痪。有时,各种搜索引擎的爬虫是很疯狂的,通过本例及上面的案例,我们可以再负载IO高时,能够进行临时应对,当然,这不是长久的方法,优化网络和服务器,部署大规模集群服务器才是较好的解决之道。



转载http://oldboy.blog.51cto.com/2561410/1184165


阅读(866) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~