golang实现定时监控 CLOSE_WAIT 连接的数量

文章目录

  • go实现定时检查大量的 CLOSE_WAIT 连接
    • 背景:为什么监控指定端口上的 CLOSE_WAIT 连接数量原因:
    • 什么是CLOSE_WAIT
    • go实现定时检查大量的 CLOSE_WAIT 连接
    • 参考

go实现定时检查大量的 CLOSE_WAIT 连接

监控指定端口的连接状态,特别是关注 CLOSE_WAIT 连接的数量。CLOSE_WAIT 是指 TCP 连接关闭时,连接的一端等待关闭的另一端发送最后的确认信号。如果存在大量的 CLOSE_WAIT 连接,可能意味着网络连接没有正常关闭,可能会导致资源泄漏或其他问题。

背景:为什么监控指定端口上的 CLOSE_WAIT 连接数量原因:

  1. 资源泄漏检测:大量的 CLOSE_WAIT 连接可能是由于网络连接没有正常关闭导致的资源泄漏。通过监控 CLOSE_WAIT 连接数量,可以及时发现这些连接,从而识别和解决资源泄漏问题。
  2. 网络连接管理:CLOSE_WAIT 连接可能会占用系统资源,如文件描述符等。通过监控连接数量,可以更好地管理和优化网络连接,确保连接的正常关闭和释放。
  3. 故障排查:CLOSE_WAIT 连接可能是网络故障或应用程序错误的指示。通过监控连接数量,可以定位和解决潜在的网络问题,加快故障排查的速度。
  4. 安全性:异常的 CLOSE_WAIT 连接可能是一种恶意行为的指示,如拒绝服务攻击等。通过监控连接数量,可以及时发现可疑连接,采取相应的安全措施。

什么是CLOSE_WAIT

客户端主动关闭连接,服务器接收到客户端的FIN,但是还没有发送自己的FIN,此时的状态为close_wait状态,大量的close_wait状态拖累服务器性能。

在这里插入图片描述

主动关闭的一方发出 FIN 包,被动关闭的一方响应 ACK 包,此时,被动关闭的一方就进入了 CLOSE_WAIT 状态。 如果一切正常,稍后被动关闭的一方也会发出 FIN 包,然后迁移到 LAST_ACK 状态。

通常,CLOSE_WAIT 状态在服务器停留时间很短**,如果你发现大量的 CLOSE_WAIT 状态,那么就意味着被动关闭的一方没有及时发出 FIN 包**,一般有如下几种可能:

  • 程序问题:如果代码层面忘记了 close 相应的 socket 连接,那么自然不会发出 FIN 包,从而导致 CLOSE_WAIT 累积;或者代码不严谨,出现死循环之类的问题,导致即便后面写了 close 也永远执行不到。
  • 响应太慢或者超时设置过小:如果连接双方不和谐,一方不耐烦直接 timeout,另一方却还在忙于耗时逻辑,就会导致 close 被延后。响应太慢是首要问题,不过换个角度看,也可能是 timeout 设置过小。

go实现定时检查大量的 CLOSE_WAIT 连接

通过定期执行 netstat 命令并记录结果,该程序可以提供一种简单的方式来监控 CLOSE_WAIT 连接的数量,并将结果写入日志文件进行进一步分析和处理。

代码位置:https://gitcode.net/inthat/mymonitor

main.go

package mainimport ("context""fmt"lcli "mymonitor/cli"socketmonitorlog "mymonitor/lib/socketmonitorlog""os/exec""os/signal""strconv""strings""sync""syscall""time""io""os"logging "github.com/ipfs/go-log/v2""github.com/urfave/cli/v2"
)var log = logging.Logger("socket-go-monitor")func init() {}func exitHandle(exitChan chan os.Signal) {for {select {case sig := <-exitChan:fmt.Println("接受到来自系统的信号:", sig)os.Exit(1) //如果ctrl+c 关不掉程序,使用os.Exit强行关掉}}}func main() {socketmonitorlog.SetupLogLevels()exitChan := make(chan os.Signal)signal.Notify(exitChan, os.Interrupt, os.Kill, syscall.SIGTERM)go exitHandle(exitChan)app := &cli.App{Name:  "socket-go-monitor",Usage: "Start socket monitor",Flags: []cli.Flag{&cli.StringFlag{Name:    "port",Aliases: []string{"p"},Usage:   "specify monitor port ",},&cli.StringFlag{Name:    "threshold",Aliases: []string{"t"},Usage:   "specify socket threshold num ",},&cli.BoolFlag{Name:    "cmd",Aliases: []string{"s"},Value:   false,Usage:   "do cmd",},},Action: func(cctx *cli.Context) error {log.Info("Starting socket monitor")ctx := lcli.ReqContext(cctx)ctx, cancel := context.WithCancel(ctx)defer cancel()//get optionsport := cctx.String("port") // 获取命令行参数中的端口号// 获取阈值threshold := cctx.Int("threshold")var (cmd    *exec.Cmdoutput []byteerr    error)filename := "socket_monitor.txt"file, err := os.Create(filename)if err != nil {fmt.Println(err)}defer file.Close()var wg sync.WaitGroup//创建定时器,每隔600秒后,定时器就会给channel发送一个事件(当前时间)ticker := time.NewTicker(time.Second * 600)defer ticker.Stop()i := 0wg.Add(1)go func(t *time.Ticker) {defer wg.Done()for { //循环<-t.Ci++fmt.Println("i = ", i)// 生成Cmdcmd = exec.Command("/bin/bash", "-c", fmt.Sprintf("netstat -an|grep %s|grep CLOSE_WAIT|wc -l\n", port))// 执行了命令, 捕获了子进程的输出( pipe )if output, err = cmd.CombinedOutput(); err != nil {fmt.Println(err)return}//打印子进程的输出fmt.Println(string(output))// Parse the output as an integercloseWaitCount, err := strconv.Atoi(strings.TrimSpace(string(output)))if err != nil {fmt.Println(err)return}// Check if the count is greater than the threshold and print if it isif closeWaitCount > threshold {var nowtime = time.Unix(time.Now().Unix(), 0).Format("2006-01-02 15:04:05")str := fmt.Sprintf("%s CLOSE_WAIT COUNT: %d \n", nowtime, closeWaitCount)fmt.Println(str)n, err := io.WriteString(file, str)if err != nil {fmt.Println(n, err)}}// if i == 10000000 {// 	t.Stop() //停止定时器// 	return// }}}(ticker)wg.Wait()return nil},}app.Setup()//os.Args启动程序if err := app.Run(os.Args); err != nil {log.Warnf("%+v", err)return}fmt.Println("ends")
}

参考

浅谈CLOSE_WAIT
参考URL: https://cloud.tencent.com/developer/article/1918110

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中的string设计成模板的原因

查看string的文档可以发现&#xff0c;string被设计成模板&#xff0c;为什么这样设计呢&#xff1f; string文档链接&#xff1a;<string> - C Reference (cplusplus.com) 随着计算机的发展&#xff0c;出现了很多编码&#xff08;用于管理字符&#xff09;&#xff0c…

K8S容器空间不足问题分析和解决

如上图&#xff0c;今天测试环境的K8S平台出现了一个问题&#xff0c;其中的一个容器报错&#xff1a;Free disk space below threshold. Available: 3223552 bytes (threshold: 10485760B)&#xff0c;意思服务器硬盘空间不够了。这个问题怎么产生的&#xff0c;又怎么解决的呢…

力扣LCR143---子结构判定(先序递归、Java、中等题)

题目描述&#xff1a; 给定两棵二叉树 tree1 和 tree2&#xff0c;判断 tree2 是否以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 注意&#xff0c;空树 不会是以 tree1 的某个节点为根的子树具有 相同的结构和节点值 。 示例 1&#xff1a; 输入&#xff1a;tree…

抖店商家必看:“违规操作”扣除保证金2000块!这些细节要避免!

哈喽~我是电商月月 很多没经验的新手朋友开抖店都会遇到一个问题&#xff1a; 那就是开抖音小店时&#xff0c;因操作不当被扣除保证金的该怎么办&#xff1f; 实话实说&#xff0c;被判违规扣除保证金是能申诉的。但通过几率几乎是没有的 所以想要继续开店&#xff0c;只能…

eclipse .project

.project <?xml version"1.0" encoding"UTF-8"?> <projectDescription> <name>scrm-web</name> <comment></comment> <projects> </projects> <buildSpec> <buil…

HarmonyOS 开发-短视频切换实现案例

介绍 短视频切换在应用开发中是一种常见场景&#xff0c;上下滑动可以切换视频&#xff0c;十分方便。本模块基于Swiper组件和Video组件实现短视频切换功能。 效果图预览 使用说明 上下滑动可以切换视频。点击屏幕暂停视频&#xff0c;再次点击继续播放。 实现思路 使用Sw…

Linux锁的使用

一、临界资源与临界区 多线程会共享例如全局变量等资源&#xff0c;我们把会被多个执行流访问的资源称为临界资源&#xff0c;我们是通过代码访问临界资源的&#xff0c;而我们访问临界资源的那部分代码称为临界区。 实现一个抢票系统 只有一个线程抢票时 #include <ios…

Docker速成:新手变专家!

Docker介绍 容器历史 1、Chroot Jail 就是常见的chroot命令的用法。它在1979年的时候就出现了&#xff0c;被认为是最早的容器化技术之一。它可以把一个进程的文件系统隔离起来。 2、The FreeBSD Jail &#xff08;监狱&#xff09;实现了操作系统级别的虚拟化&#xff0c;他…

外包干了25天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了四年的功能测…

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案

Jeesite开源项目中ECharts折线图MarkPoint无法绘制问题的解决方案 在Jeesite开源项目的开发中&#xff0c;数据可视化是一个不可或缺的环节。ECharts作为一个功能强大的数据可视化库&#xff0c;在项目中经常被用来绘制各种图表。然而&#xff0c;在绘制折线图时&#xff0c;有…

【python】python的选择语句的三个题目

1.乘坐飞机时&#xff0c;有些航班没有行李额度&#xff0c;当乘客的行李小于等于20公斤时&#xff0c;按每公斤1.68元收费&#xff1b;大于20公斤时&#xff0c;按每公斤1.98元收费&#xff0c;编写程序计算收费情况&#xff08;保留两位小数&#xff09; air_bagfloat(input…

swiftUI macOS使用webview加载外部网址

import SwiftUI import WebKitstruct ContentView: View {var body: some View {VStack {Text("测试")WebView(urlString: "https://aweb123.com").frame(maxWidth: .infinity, maxHeight: .infinity) // 让 WebView 占据整个可用空间}.frame(minWidth: 20…

欧拉回路算法

1 基本概念 1.1 欧拉路径和欧拉回路 欧拉回路&#xff1a; 在一个图中&#xff0c;由i点出发&#xff0c;将每个边遍历一次最终回到出发点i的一条路径。具有欧拉回路的图称为欧拉图。 无向图 存在欧拉回路的充要条件是所有的点的度数均为偶数 因为每个点的度数为偶数&#xf…

OpenHarmony实战:轻量系统STM32F407芯片移植案例

介绍基于STM32F407IGT6芯片在拓维信息Niobe407开发板上移植OpenHarmony LiteOS-M轻量系统&#xff0c;提供交通、工业领域开发板解决方案。 移植架构采用Board与SoC分离方案&#xff0c;使用arm gcc工具链Newlib C库&#xff0c;实现了lwip、littlefs、hdf等子系统及组件的适配…

Todesstern:一款针对注入漏洞识别的强大变异器引擎

关于Todesstern Todesstern是一款功能强大的变异器引擎&#xff0c;该工具基于纯Python开发&#xff0c;该工具旨在辅助广大研究人员发现和识别未知类型的注入漏洞。 Todesstern翻译过来的意思是Death Star&#xff0c;即死亡之星&#xff0c;该工具是一个变异器引擎&#xff…

【剪映专业版】03云空间扩容

视频课程&#xff1a;B站有知公开课【剪映电脑版教程】 个人云空间&#xff1a;多端同步及素材、草稿保存 云空间默认为512M&#xff0c;可以免费提升至3GB 访问剪映官网-全能易用的桌面端剪辑软件-轻而易剪 上演大幕&#xff0c;后进入工作台 点击消息 小组云空间&#xff…

视频图像的两种表示方式YUV与RGB(2)

前一篇文章具体介绍了视频图像的两种表示方式&#xff0c;此篇详细介绍下YUV的采样格式及其对图像视频的表示方式。 常见YUV有很多规格&#xff0c;例如YUV444&#xff0c;YUV422和YUV420&#xff0c;后面的数字是表示采样的比例。其中YUV420是FFmpeg里最常用的&#xff0c;因为…

004_文本分析与挖掘(jieba库三种分词模式)

jieba库 一、概述 jieba 库的分词原理是利用一个中文词库&#xff0c;将待分词的内容与分词词库进行比对&#xff0c;通过图结构和动态规划方法找到最大概率的词组&#xff1b;除此之外&#xff0c;jieba 库还提供了增加自定义中文单词的功能。 支持三种分词模式 1、精确模式…

Linux(CentOS7)部署 y-api 接口管理平台

目录 前言 前置环境 mongodb node 安装 y-api 部署页面 启动 y-api 基本使用教程 前言 前后端分离时代&#xff0c;前后端通过接口文档来协作开发项目。一般开发过程中&#xff0c;由后端先编写接口文档&#xff0c;然后交付给前端&#xff0c;这时候前后端都根据这个…