Go语言中文网 为您找到相关结果 14

记一次线上Giao(go)服务内存占用率过高问题排查

本文作者: 保护我方李元芳 商业转载请联系作者获得授权,非商业转载请注明出处。 故障现象 某线上埋点上报机器偶尔触发内存占用过多的报警。ssh到机器top发现主要内存被埋点服务占用。之前重启过几次,但是过段时间仍然会发生内存占用过多的警报。下面是报警详情。 [P1][PROBLEM][ali-e-xxx-service03.bj][][ all(#3) mem.memfree.percent 4.19575<5][O3 >2019-10-28 10:20:00] 问题推断 埋点服务主要接收客户端压缩过的上报请求,并对请求数据做解压,投递到kafka,逻辑功能相对简单。初步怀疑是某些资源没有释放导致的内存泄露或Groutine泄露。 问题排查 由于代码不是由我们业务方维护的,首先向相关部门索要...阅读全文

博文 2020-01-19 16:34:17 保护我方李元芳

golang协程测试

package main import ( "fmt" "time") const NUMBER = 1000000 func test() { for { }} func main() { fmt.Println(time.Now().UnixNano()) for i := 0; i < NUMBER; i++ { go test() } fmt.Println(time.Now().UnixNano()) for { }} 启动100W个协程,占用了:4599640KB内存,平均每个占用:4.6KB内存...阅读全文

博文 2014-10-04 19:26:08 samurail

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

背景是这样的,有一次我的服务器突然挂掉了,是由于cpu占用过高,但是我又不知道是哪个进程造成的。于是便想找一个监控工具来监控我的机器,我希望这个工具足够简单,没有复杂的配置,开箱即用,能够监控到当cpu负载过高时,发生的时间以及当时是什么进程造成这样的问题。很可惜,我并没有找到这样的工具(若有这样方便的工具请告知我),但我实在不想因此而给服务器上一套很重的监控系统。于是乎,我决定自己写一个工具。思路如下: 每隔一段时间就查看cpu占用率,当超过了设置的百分比,就触发记录; 调用top命令,按照cpu占用率从高到低排列,将输出记录到文件中,文件以时间命令; 程序能后台运行。 针对第一点,我用了一个库:github.com/shirou/gopsutil,里面有关于cpu使用率以及内存使用率的相...阅读全文

博文 2020-04-22 16:33:38 wx5e1abbbb0a5e5

Kubernetes节点资源耗尽状态的处理

今天上午一到工位,就收到来自同事的“投诉”:私有云上的Kubernetes cluster中的一个node似乎不工作了,因为专门部署于那个节点上的应用挂掉了,并且长时间没有恢复。这个公司私有云上Kubernetes集群是v1.7.5版本,部署于双节假期之前。最近感觉K8s开发明显提速,连续发布版本,截至发稿时,最新发布的版本为v1.8.1了。这个集群一直运行相对稳定,今天这个异常到底是怎么一回事呢?于是打开terminal,开始了问题的调查。 一、问题现象 我们这个小集群一共有三个Kubernetes Node。首先,我查看集群中的所有Pods状态,发现node1和node2上的Pods均正常(running状态),但位于node3上的三个Pods均为“Pending”状态,这三个pod是w...阅读全文

博文 2017-10-25 06:54:44 bigwhite

分析golang定时器cpu使用率高的现象

前言: 废话少说,上线一个用golang写的高频的任务派发系统,上线跑着很稳定,但有个缺点就是当没有任务的时候,cpu的消耗也在几个百分点。 平均值在3%左右的cpu使用率。你没有任务的时候,cpu还跑到3%,这个说不过去呀。通过查看进程pidstat捕获得知,system系统的cpu消耗也不少。 sys的cpu占用率高一般是由于大量的syscall系统调用引起的…. 该文章后续仍在不断更新中, 请移步到原文地址 http://xiaorui.cc/?p=5117 下面的截图是用strace统计出来的系统调用…. 我们发现 futex 和 pselect6 的syscall非常的多…. futex 是锁的调用,pselect6可以理解为select的加强版,除了我们不关心的信号掩码外,他是支...阅读全文

博文 2019-06-03 20:02:18 rfyiamcool

Go内存优化(一)— struct

理 关于Golang同一struct中field的书写顺序不同内存分配大小也会不同。主要原因如下:struct内field内存分配是以4B为基础,超过4B时必须独占。 示例 type A1 struct { a bool b uint32 c bool d uint32 e uint8 f uint32 g uint8 } 计算一下A1所需要占用的内存: 首先第1个4B中放入a,a是bool型,占用1B,剩余3B 这时看b是uint32,占用4B,剩余3B放不下,所以offset到下一个4B空间,这时我们会发现3B没有放东西,被浪费了 依次往下,A1要占用28B的空间 根据1,2两个步骤很容易看出,有很多浪费空间。 优化: type A2 struct { a bool c bool e u...阅读全文

博文 2018-06-29 15:34:44 sipt

天池中间件大赛Golang版Service Mesh思路分享

21天精品区块链课程免费学习,深入实战行家带路,助力开发者轻松玩转区块链! >>> 这次天池中间件性能大赛初赛和复赛的成绩都正好是第五名,出乎意料的是作为Golang是这次比赛的“稀缺物种”,这次在前十名中我也是侥幸存活在C大佬和Java大佬的中间。 关于这次初赛《Service Mesh for Dubbo》难度相对复赛《单机百万消息队列的存储设计》简单一些,最终成绩是6983分,因为一些Golang的小伙伴在正式赛512并发压测的时候大多都卡在6000分大关,这里主要跟大家分享下我在这次Golang版本的一些心得和踩过的坑。 由于工作原因实在太忙,比赛只有周末的时间可以突击,下一篇我会抽空整理下复赛《单机百万消息队列的存储设计》的思路方案分享给大家,个人感觉实现方案上也是决赛队伍中比较特...阅读全文

博文 2018-09-01 14:33:15 亚普的技术轮子

开发板运行golang程序VSZ占用700多M

用golang交叉编译简单的程序,下载到开发板能够运行,但是top时发现占用700多M VSZ,怎么占用了这么的内存? 代码如下: package main import ( "fmt" "time" ) func numbers() { for i := 1; i <= 5; i++ { time.Sleep(250 * time.Millisecond) fmt.Printf("%d ", i) } } func alphabets() { for i := 'a'; i <= 'e'; i++ { time.Sleep(400 * t...阅读全文

记一次golang程序CPU高的排查过程

前言 事情的起因是某天CTO突然和我说,生产环境的程序CPU有点高,关键是现在也没什么负载,同样的代码在开发环境上CPU就低的多了。 不用细说,那一定是有什么地方出问题了。 CTO还说,他pprof过了,占用CPU最高的runtime.futex,还发了一篇相关的文章谁占了该CPU核的30% - 一个较意外的Go性能问题 ,打趣说没准系统负载高了,这个问题就没了。因为原文中写到: 必须指出,本问题是因为系统空闲没有goroutine可以调度造成的。显然的,系统繁忙的时候,即CPU资源真正体现价值时,上述30%的%CPU的overhead并不存在,因为大概率下会有goroutine可供调度,无需去做让M去sleep这个很重的操作。 然后就把这个锅就“甩”给我了,让我研究一下。毕竟开发环境的负载...阅读全文

博文 2019-08-13 01:32:45 海之方

golang程序问题处理经验

1.在做内存问题相关的 profiling 时: 若 gc 相关函数占用异常,可重点排查对象数量 解决速度问题(CPU占用)时,关注对象数量( --inuse/alloc_objects )指标 解决内存占用问题时,关注分配空间( --inuse/alloc_space )指标 inuse 代表当前时刻的内存情况,alloc 代表从从程序启动到当前时刻累计的内存情况,一般情况下看 inuse 指标更重要一些,但某些时候两张图对比着看也能有些意外发现。 2.在日常 golang 编码时: 参数类型要检查,尤其是 sql 参数要检查(低级错误) 传递struct尽量使用指针,减少复制和内存占用消耗(尤其对于赋值给interface,会分配到堆上,额外增加gc消耗) 尽量不使用循环引用,除非逻辑真...阅读全文

博文 2019-08-03 22:32:39 凯文不上班