首页 > 其他分享 >golang oom监控实现

golang oom监控实现

时间:2024-11-07 18:44:04浏览次数:3  
标签:epoll oom eventfd 描述符 golang unix 事件 监控 efd

package main

import (
	"bytes"
	"fmt"
	"io/ioutil"
	"os"

	"golang.org/x/sys/unix"
)

func main(){
	var events [128] unix.EpollEvent
	var buf [8]byte
	
	//unix.EFD_CLOEXEC 确保在 exec 调用时关闭 efd,它可以防止文件描述符在不需要时意外地保留在新执行的程序中
	//创建了一个 eventfd,它是一个特殊的文件描述符,用于在用户空间触发事件
	efd,_ :=unix.Eventfd(0,unix.EFD_CLOEXEC)
	fmt.Printf("eventfd : %d\n", efd)

	//这里创建了一个 epoll 事件,关联到之前创建的 eventfd。
	// unix.EPOLLHUP:
	// 表示挂起(Hang Up)事件。
	// 对于套接字来说,这通常意味着连接已经断开(例如,对端已经关闭了连接)。
	// 对于非套接字文件描述符(如 eventfd),这个标志的使用可能不太常见或没有意义。
	// unix.EPOLLIN:
	// 表示数据可读事件。
	// 当文件描述符上有数据可供读取时,会触发此事件。
	// 对于 eventfd 来说,通常不需要监听 EPOLLIN,因为 eventfd 用于通知而不是数据读取。然而,如果你确实想从 eventfd 读取数据(尽管这不是典型用法),你可以监听这个事件。
	// unix.EPOLLERR:
	// 表示错误事件。
	// 当文件描述符上发生错误时,会触发此事件。
	// 这可能包括各种 I/O 错误,如资源不可用、权限问题等。
	event := unix.EpollEvent{
		Fd: int32(efd),
		Events: unix.EPOLLHUP|unix.EPOLLIN|unix.EPOLLERR,
	}
	//这两行代码创建了一个 epoll 实例,并将 eventfd 添加到其中。
	//当设置了EPOLL_CLOEXEC标志时,由当前进程通过fork系统调用创建的任何子进程,都会自动关闭由父进程打开的epoll实例所指向的文件描述符。这意味着子进程没有访问父进程epoll实例的权限。
	epollFd,_ :=unix.EpollCreate(unix.EPOLL_CLOEXEC)
	//unix.EPOLL_CTL_ADD是与epoll接口相关的一个操作,用于向epoll实例中添加新的文件描述符(通常是套接字描述符)及其感兴趣的事件。
	//这个操作是通过epoll_ctl函数实现的,该函数是epoll接口的核心组成部分之一。
	unix.EpollCtl(epollFd,unix.EPOLL_CTL_ADD,int(efd),&event)

	evtFile,_:=os.Open("/sys/fs/cgroup/memory/test/memory.oom_control")

	data:=fmt.Sprintf("%d %d",efd, evtFile.Fd())
	ioutil.WriteFile("/sys/fs/cgroup/memory/test/cgroup.event_control",[]byte(data),0700)

	for {
		n,err := unix.EpollWait(epollFd,events[:],-1)
		if err == nil{
			for i:=0;i<n;i++{
				fmt.Printf("fd %d,event:%d",events[i].Fd,events[i].Events)
				unix.Read(int(events[i].Fd),buf[:])
			}
		}
	}

	unix.Close(epollFd)
	unix.Close(int(evtFile.Fd()))

}

  

  
package main
import ( "bytes" "fmt" "io/ioutil" "os"
"golang.org/x/sys/unix" )
func main(){ var events [128] unix.EpollEvent var buf [8]byte   //unix.EFD_CLOEXEC 确保在 exec 调用时关闭 efd,它可以防止文件描述符在不需要时意外地保留在新执行的程序中 //创建了一个 eventfd,它是一个特殊的文件描述符,用于在用户空间触发事件 efd,_ :=unix.Eventfd(0,unix.EFD_CLOEXEC) fmt.Printf("eventfd : %d\n", efd)
//这里创建了一个 epoll 事件,关联到之前创建的 eventfd。 // unix.EPOLLHUP: // 表示挂起(Hang Up)事件。 // 对于套接字来说,这通常意味着连接已经断开(例如,对端已经关闭了连接)。 // 对于非套接字文件描述符(如 eventfd),这个标志的使用可能不太常见或没有意义。 // unix.EPOLLIN: // 表示数据可读事件。 // 当文件描述符上有数据可供读取时,会触发此事件。 // 对于 eventfd 来说,通常不需要监听 EPOLLIN,因为 eventfd 用于通知而不是数据读取。然而,如果你确实想从 eventfd 读取数据(尽管这不是典型用法),你可以监听这个事件。 // unix.EPOLLERR: // 表示错误事件。 // 当文件描述符上发生错误时,会触发此事件。 // 这可能包括各种 I/O 错误,如资源不可用、权限问题等。 event := unix.EpollEvent{ Fd: int32(efd), Events: unix.EPOLLHUP|unix.EPOLLIN|unix.EPOLLERR, } //这两行代码创建了一个 epoll 实例,并将 eventfd 添加到其中。 //当设置了EPOLL_CLOEXEC标志时,由当前进程通过fork系统调用创建的任何子进程,都会自动关闭由父进程打开的epoll实例所指向的文件描述符。这意味着子进程没有访问父进程epoll实例的权限。 epollFd,_ :=unix.EpollCreate(unix.EPOLL_CLOEXEC) //unix.EPOLL_CTL_ADD是与epoll接口相关的一个操作,用于向epoll实例中添加新的文件描述符(通常是套接字描述符)及其感兴趣的事件。 //这个操作是通过epoll_ctl函数实现的,该函数是epoll接口的核心组成部分之一。 unix.EpollCtl(epollFd,unix.EPOLL_CTL_ADD,int(efd),&event)
evtFile,_:=os.Open("/sys/fs/cgroup/memory/test/memory.oom_control")
data:=fmt.Sprintf("%d%d",efd, evtFile.Fd()) ioutil.WriteFile("/sys/fs/cgroup/memory/test/cgroup.event_control",[]byte(data),0700)
for { n,err := unix.EpollWait(epollFd,events[:],-1) if err == nil{ for i:=0;i<n;i++{ fmt.Printf("fd %d,event:%d",events[i].Fd,events[i].Events) unix.Read(int(events[i].Fd),buf[:]) } } }
unix.Close(epollFd) unix.Close(int(evtFile.Fd()))
}

标签:epoll,oom,eventfd,描述符,golang,unix,事件,监控,efd
From: https://www.cnblogs.com/rincloud/p/18533754

相关文章

  • grafana对redis哨兵模式监控添加主库信息
    【环境说明】redis+sentinel哨兵模式+prometheus+grafana监控面板【要求】redis哨兵模式,需要查看主库节点信息,如果发生切换,能查到历史变化信息【配置操作】当前已经安装好三个redis数据库跟哨兵模式,并且都安装好了redis-exporter监控服务prometheus配置监控信息:prometheus.......
  • 国标GB28181公网平台EasyGBS国标GB28181软件构建标准化视频监控网络
    在当今的数字化时代,视频监控已成为公共安全、企事业单位等领域不可或缺的一部分。为了规范这一领域的信息传输、交换和控制,我国推出了GB/T28181标准,并在此基础上,国标GB28181公网平台EasyGBS以其丰富的视频能力和灵活的部署方式,为视频监控领域带来了诸多创新和便利。国标GB/T2......
  • 皮带跑偏识别智慧矿山一体机皮带危险区域人员违规闯入识别非煤矿山视频智能监控系统
    在当今快速发展的工业时代,矿山行业作为国家经济的重要支柱之一,面临着日益严峻的安全挑战。随着技术的进步,传统的矿山安全管理方式已无法满足现代矿山对于高效、智能化管理的需求。为了提高矿山安全管理水平,减少事故发生,保障矿工生命安全,同时提升矿山生产效率和经济效益,迫切需要一......
  • Loadrunner监控Windows系统资源图报错
    问题描述无法连接计算机无法访问主机HKEY_PERFORMANCE_DATA密钥拒绝访问虚拟机部署了一个系统,本机使用LR进行压测系统并监控Windows资源,无法连接,总提示百度解决这种问题,描述的还很少,发现了好几种解决办法,最后也确实解决了。。。但是系统搞得贼乱,权限不足等等情况,项目都......
  • 视频监控平台功能介绍:天地伟业IPC通过主动注册协议实现视频接入和观看
    目录一.平台简介二.摄像机设置步骤三.视频平台设置3.1添加主动注册服务的设备型号3.2内部设备管理添加服务器3.3接入设备的参数修改3.4确认通道同步和分配资源组3.4.1确认接入通道的设备是否同步3.4.2设备分配资源组3.4.3分配角色和用户四.接入结果查看和资料补充4......
  • CH58x/CH592x低电压监控
    前言:有时在电池供电场景或者电表的场景下可能会出现电池电压低需要更换电池突然停电需要保存数据。此时低电压监测就起到了作用。提供了两种精度模式:高精度监控和低精度监控模式高精度模式:210ua的额外功耗低精度模式:1ua的额外功耗/***@briefwakeupmodedefine*/type......
  • 【安全架构】监控告警:Prometheus体系中告警的那些事
    原创小斐Lab网络小斐在原生的Prometheus体系中,告警引擎评估模块是集成在Prometheus时序数据库中的,把告警规则定义好,放在Prometheus告警配置模块路径下即可实现对实例告警评估和触发。然后使用Alertmanager做告警路由和告警消息转发。如下消息通知简单原理示意图:而......
  • 设备状态监控一定要直观,可视化大屏最适合这个工作
    一、引言在现代工业生产和各类设施运行中,设备的稳定运行至关重要。为了确保设备能够高效、可靠地工作,及时了解设备的状态是关键。而设备状态监控一定要直观,只有这样才能让操作人员和管理人员迅速掌握设备的运行情况,及时发现问题并采取措施。在众多的监控方式中,可视化大屏无疑......
  • EHOME视频平台EasyCVR视频融合平台支持哪些摄像机接入?监控摄像头镜头的种类有哪些?
    在现代安防监控领域,视频融合平台扮演着至关重要的角色,它们不仅能够整合不同品牌和型号的摄像机,还能提供稳定可靠的视频流传输和高效的视频管理功能。EasyCVR视频融合平台以其卓越的兼容性和灵活性,逐渐成为构建复杂监控网络的首选。本文将探讨EHOME视频平台EasyCVR支持的摄像机接入......
  • 国标GB28181软件LiteGBS国标GB28181视频平台视频监控/视频监控汇聚系统方案
    随着信息技术的快速发展,视频监控系统已成为公共安全、城市管理和企业安防等领域的重要组成部分。然而,不同厂商生产的视频监控设备遵循不同的标准,导致设备之间无法互通,管理上面临困难,这为安防系统的建设带来了显著挑战。为了解决这一问题,公安部提出了GB28181标准,即GB/T28181—2016......