用golang实现一个简单的监控工具

背景是这样的,有一次我的服务器突然挂掉了,是由于cpu占用过高,但是我又不知道是哪个进程造成的。于是便想找一个监控工具来监控我的机器,我希望这个工具足够简单,没有复杂的配置,开箱即用,能够监控到当cpu负载过高时,发生的时间以及当时是什么进程造成这样的问题。很可惜,我并没有找到这样的工具(若有这样方便的工具请告知我),但我实在不想因此而给服务器上一套很重的监控系统。于是乎,我决定自己写一个工具。思路如下:

  1. 每隔一段时间就查看cpu占用率,当超过了设置的百分比,就触发记录;
  2. 调用top命令,按照cpu占用率从高到低排列,将输出记录到文件中,文件以时间命令;
  3. 程序能后台运行。

针对第一点,我用了一个库:github.com/shirou/gopsutil,里面有关于cpu使用率以及内存使用率的相关方法,比较简单。

代码如下:

func visor() {
	for {
		per, _ := cpu.Percent(time.Duration(config.GetConfig().Interval)*time.Second, false)
		if per[0] > config.GetConfig().AlterLimit {
			record(per[0])
		}
	}
}

func record(per float64) {
	now := time.Now().Format("2006-01-02-15-04-05")
	logFile := config.GetConfig().SnapPath + now + ".log"
	f, _ := os.Create(logFile)
	defer f.Close()

	f.Write([]byte{'\n'})
	f.Write([]byte("此时cpu占用率:" + strconv.FormatFloat(per, 'f', 10, 64)))
	f.Write([]byte{'\n'})
	topCmd := exec.Command("top", "-H", "-n", "1", "-b")
	topOutput, _ := topCmd.Output()
	f.Write(topOutput)
}

使用方法示例如下:

# 后台启动
visor -start -config=./config/config.yaml -d
# 结束进程
visor -stop

完整代码请见:https://github.com/TomatoMr/visor。


欢迎关注我的公众号:onepunchgo,给我留言。

image

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我们可以使用Golang来构建一个分布式缓存系统。一般来说,分布式缓存系统的实现包括:缓存服务器、缓存客户端、分布式缓存服务器、分布式缓存客户端、分布式缓存存储引擎和缓存管理服务器。使用Golang可以构建一个可靠、可扩展、高性能的分布式缓存系统。 ### 回答2: 分布式缓存系统是一个将数据存储在多台机器上的缓存系统,可以提高数据访问的性能和并发能力。在golang中,我们可以使用一些库和技术来实现一个分布式缓存系统。 首先,我们需要选择一个合适的分布式存储技术来存储缓存数据,比如使用Redis或Memcached。这些技术可以让我们将缓存数据分布在多个节点上,并提供高性能的读写操作。 其次,我们需要设计一个对外提供接口的服务来操作缓存。可以使用golang的HTTP服务器来实现这个服务。通过定义一些RESTful API,如GET、PUT、DELETE等,客户端可以向服务器发送请求来获取、设置或删除缓存数据。 在服务器端的代码中,我们需要处理接收到的请求,并将其映射到相应的缓存操作。当有GET请求时,我们需要先检查缓存中是否存在所需的数据,如果存在则直接返回,否则再从存储系统获取数据并放入缓存中。当有PUT请求时,需要将数据存储到缓存和存储系统中。当有DELETE请求时,需要从缓存和存储系统中删除相应的数据。 为了实现缓存的分布式特性,我们可以使用一致性哈希算法或一致性哈希环来将缓存数据分布到不同的节点上。这样可以确保当节点发生故障或增加时,仅会影响到部分数据,而不会影响全部缓存数据。 最后,我们需要定期清理缓存中的过期数据,以防止缓存数据占用过多的存储空间。可以使用定时任务或定时器来实现这个功能。 以上是一个简单的分布式缓存系统的设计和实现过程。当然,实际的分布式缓存系统可能还涉及到一些其他的问题,如并发控制、持久化存储等,但是以上提到的内容可以帮助我们开始构建一个基本的分布式缓存系统。 ### 回答3: 分布式缓存系统是用来提高系统的读取性能和减轻数据库压力的重要组件,能够将数据存储在多个节点上,提供快速的访问速度和高可用性。 在使用golang编写一个分布式缓存系统时,可以先考虑以下几个关键点: 1. 数据分片:将数据按照一定的规则分散存储到不同的节点上,可以使用一致性哈希算法或分片算法来实现。 2. 节点管理:需要设计节点的动态增删、负载均衡以及容错机制。可以使用集群管理工具如etcd或者zookeeper来实现。 3. 数据存储:使用内存数据库如Redis或Memcached来存储缓存数据,并保证数据的一致性和高可用性。可以选择golang中的redis或memcache客户端库进行数据读写。 4. 缓存更新和失效:提供缓存的自动更新机制,当数据发生变化时,需要及时更新缓存数据,同时设置合理的缓存失效策略,避免使用过期的数据。 5. 高可用性:保证缓存系统的高可用性,当节点出现故障时,能够自动切换到其他可用的节点上,并进行数据恢复。 6. 监控和日志:实现对缓存系统的监控和日志记录,可以使用Prometheus和Grafana等工具进行监控和性能分析。 在实现分布式缓存系统时,需要综合考虑不同的因素,并做好合理的设计和优化。同时,需要进行大规模测试和性能调优,确保系统的稳定和高效运行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值