首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Go实战 | 记一次降低30%的CPU使用率的优化

今天聊聊在项目中通过优化redis写入而降低cpu使用率的一次经历。...01 背景 本文是项目中基于redis记录实时请求量的一个功能,因流量上涨造成redis服务器的CPU高于80%而触发了自动报警机制,经分析将实时写入redis的方式变更成批量写入的方式,从而将CPU使用率降低了...如果当流量QPS不断增长的时候,比如达到了10万,那么redis收到的请求量就是40万。redis的CPU消耗自然也就上来了。 那么我们看看哪些地方是可以优化的呢?...05 总结 随着服务qps的增长,我们在不限制qps的前提下,各种资源的使用率都会增长。我们的优化思路就是减少不必要的写次数、由实时写更改成批量写的思想,从而达到减少对redis操作的目的。...这种计数方式使用的场景是在对计数要求不那么准确的情况,例如视频的播放量、微博大V的阅读量等等。 ---- 欢迎关注「Go学堂」,让知识活起来

37420

go pprof实战

总结 根据以上的测试结果,目前系统需要做以下几个优化点: 下发频控设置上,启动了较多goroutine,并且单独set数据,这里需要考虑如何将不同操作合并下发。...另外提升到qps300仅出现少量超时。 ? 3.4.2 pprof查看火焰图 可以看到异步任务由之前的占用70%cpu,下降到30%,有较大的优化效果。 ?...但是注意到此时gc占用接近整体的25%,那么此时我们就需要考虑,代码是否涉及到大量小内存申请(池化)、以及反射(比如fmt、json)。 ?...这里内容服务遇到的问题和投放服务稍有不同,例如:gc频繁,这里记录一下gc频繁等问题的排查思路,和上面文章做一些互补。 这里先简单看一下pprof的cpu、内存、routine等方面的问题。...5.5.6 优化结论 结论梳理: 根据以上优化结果,我们提升了60%的性能 实际的gc间隔也延长了,大约减少25%的gc次数 查看trace图其中gc间隔延迟,查看火焰图在cpu方面已经没有明显的业务瓶颈

1.9K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    性能测试中获取JVM资源信息

    根据以上场景,如果能从监控工程上得到解决自然是最好的。可以实时监控施压机和施压进程的CPU占用、内存使用、GC清空。但是,重点来了,并不是总能拥有一套完美的监控系统。...以上我提到的信息都可以调用这个类的API获取。 CPU使用率 下面分享一下如何获取当前JVM的CPU使用情况。...() } /** * 获取当前线程CPU使用率,最大100 * 已乘以100,已经除以了系统最大进程数 * @return */ static...8.88 : d } 这里我用了一个参数,用来区分是否返回平均使用率还是返回总使用率之和。...在服务执行性能测试场景中,将JVM信息作为一个资源调配的指标。例如:CPU资源占用过高,就降低一下对象池的活跃数据,主动回收一些资源。

    76310

    Go 服务进行自动采样性能分析的方案设计与实现

    Go 的采样工具 Go的pprof工具集,提供了Go程序内部多种性能指标的采样能力,我们常会用到的性能采样指标有这些: profile:CPU采样 heap:堆中活跃对象的内存分配情况的采样 goroutine...:当前所有goroutine的堆栈信息 allocs: 会采样自程序启动所有对象的内存分配信息(包括已经被GC回收的内存) threadcreate:采样导致创建新系统线程的堆栈信息 怎么获取采样信息...判断采样时间点的规则 CPU 使用,内存占用和 goroutine 数,都可以用数值表示,所以无论是使用率慢慢上升直到超过阈值,还是突增之后迅速回落,都可以用简单的规则来表示,比如: cpu/mem/goroutine...: 内存使用率突增超过25% 比如像上图里的情况,前五个周期收集到的内存占用率在 35% 左右波动,而最新周期收集到的数据为70%,这显然是瞬时突增导致的异常情况,那么我们就可以在这个时间点,自动让程序调用...无人值守的自动 dump(一) 无人值守的自动 dump(二) 使用起来也比较方便,比如下面是一个对内存使用率突增 25% 和超过阈值 80% 这两种情况下让程序自动进行Mem信息采样的例子。

    1.4K40

    IO 密集型服务 性能优化实战记录

    API 模块返回上游 P99 耗时图 解决方案 服务 CPU 优化 背景 偶然的一次上线变动中,发现对 Feature 服务来说 CPU 的使用率的高低会较大程度上影响到服务耗时,因此从提高服务 CPU...但在 GO GC 实际实践中会按照 Pacer 调频算法根据堆增长速度、对象标记速度等因素进行预计算,使堆大小在达到两倍大小前提前发起 GC,最佳情况下会只占用 25% CPU 且在堆大小增长为两倍时,...CPU 占用为 25%,一旦服务内部有瞬态情况,例如定时任务、缓存失效等等,Pacer 基于稳态的预判失效,导致 GC 标记速度小于分配速度,为达到 GC 回收目标(在堆大小到达两倍之前完成 GC),...,低延时服务的耗时会较大程度上受到 CPU 使用率的影响,在做性能优化时切勿忽视这点;(线程排队、调度损耗、资源竞争等) 对于高并发、低延时服务,耗时方面受到下游的影响可能只是一个方面,服务自身开销如序列化...;每一次的讨论和质疑都是进一步深入思考的机会,以上多项优化都出自与大佬(特别鸣谢 @李心宇@刘琦@龚勋)的讨论后的实践; 同为性能优化,耗时优化不同于 CPU、内存等资源优化,更加复杂,难度较高,在做资源优化时

    98910

    Golang GC 从原理到优化

    这会降低系统大概25%的吞吐量,比如MAXPROCS=6,那么GC P期望使用率为6*0.25=1.5,这150%P会通过专职(Dedicated)/兼职(Fractional)/懒散(Idle) 三种工作模式的...阶段,这个阶段有三个问题: GC 协程和业务协程是并行运行的,大概会占用 25% 的CPU,使得程序的吞吐量下降; 如果业务 goroutine 分配堆内存太快,导致 Mark 跟不上 Allocate...当 GC 在标记和扫描阶段之间转换时,短暂的 stop-the-world 暂停 调度延迟是因为 GC 在标记阶段占用了 25% 的 CPU 资源 用户 goroutine 在高内存分配速率下的辅助标记...的优化效果取决于锁竞争增加的 CPU 消耗与优化 GC 与内存分配减少的 CPU 消耗这两者的差值; 设置 GOGC 参数(go 1.19 之前) 原理: GOGC 默认值是 100,也就是下次 GC.../ 以上三种优化操作的相关实践: Go 语言-计算密集型服务 性能优化[https://segmentfault.com/a/1190000041602269] GCTuner(go 1.19 之前)

    2.6K40

    Java应用性能优化之道

    同时,也介绍了如何将传递到老年代的对象数量降到最少,如何减少 Full GC时间以及如何设置GC类型和内存大小。...[abeea7ce3e204ca6beb60ce8665878aa.png] 上述过程不是一蹴而就的,你需要多次重复以上流程,直到完成优化。这个流程也适用于确定预期的性能指标。...Scala low-level* 67 2.9x Scala low-level GC* 58 2.5x Go 6g 161...CPU使用率很低 当阻塞发生时,TPS和CPU使用率都会降低,这可能是因系统间调用或并发造成的。要分析这一点,你可以使用线程dump或分析器的结果进行分析。...CPU使用率很高 如果TPS很低但CPU使用率又很高,这可能是由于程序效率低下造成的。这种情况下,你可以使用分析器找到瓶颈所在。

    1.2K30

    鹅厂后台大佬教你Go内存管理!

    栈内存空间、结构和初始大小经过了几个版本的更迭: v1.0~v1.1:最小栈内存空间为4KB。 v1.2:将最小栈内存提升到了8KB。 v1.3: 使用连续栈替换之前版本的分段栈。...- unsafe.Sizeof(stackpoolItem{})%cpu.CacheLinePadSize]byte} //go:notinheaptype stackpoolItem struct...// last span in list, or nil if none} (二)StackLarge 大于等于32KB的栈,由stackLarge来分配,这也是个mSpan链表的数组,长度为25。...整个过程中最复杂的地方是将指向源栈中内存的指针调整为指向新的栈,这一步完成后就会释放掉旧栈的内存空间了 (六)栈缩容 在goroutine运行的过程中,如果栈区的空间使用率不超过1/4,那么在垃圾回收的时候使用...在让出CPU之前会检查这个栈收缩标识,为true的话就会先进行栈收缩,再让出CPU。

    40410

    Elastic Stack最佳实践系列:filebeat CPU使用率过高分析

    除了内存之外,CPU的使用率是我们关心的另外一个问题,一个辅助的信息采集工具,永远不应该影响业务进程的正常工作,因此,当filebeat出现可能的CPU使用率过高问题时,也需要我们尽快分析和解决。...您可以指定 gc GET 参数以在获取堆样本之前运行 GC。 mutex:争用互斥锁持有者的堆栈跟踪 profile:CPU 分析文件。您可以在 GET 参数中指定持续时间。...而在1 GHz的CPU主频下,每1纳秒可以执行一条CPU运算指令。 在默认情况下,Go语言的运行时系统会以100 Hz的的频率对CPU使用情况进行取样。...但是,由于它直接或间接调用的函数频繁的直接出现在取样中,所以这个函数的累积取样计数却会很高。我们以上图中的函数mian.main为例。...从top上看 (以本地取样计数为顺序列出函数或方法及相关信息, 默认情况下top命令会列出前10项内容),以上10个函数被调用的次数,占用CPU的时钟最多,但他们之间的关系不慎明细 通过web,看 [image.png

    6.7K50

    JVM 优化经验总结

    如何将新对象预留在年轻代 众所周知,由于 Full GC 的成本远远高于 Minor GC,因此某些情况下需要尽可能将对象分配在年轻代,这在很多情况下是一个明智的选择。...因为大对象占用空间多,所以可能需要移动大量小的年轻对象进入年老代,这对 GC 相当不利。基于以上原因,可以将大对象直接分配到年老代,保持年轻代对象结构的完整性,这样可以提高 GC 的效率。...可以看到该对象被分配在了年轻代,占用了 25%的空间。...这是一个关注吞吐量的收集器,可以尽可能地减少 GC 时间。 –XX:ParallelGC-Threads:设置用于垃圾回收的线程数,通常情况下,可以设置和 CPU 数量相等。...故该设置提高了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。因此,这个选项更有助于将对象留在年轻代。

    51710

    五分钟技术小分享 - 2022Week11

    这段话包含了Go语言的GC,在面对CPU和内存压力下的决策: Go程序很少会OOM 这句话有一定前提,即内存设置是合理的,代码也没有明显的内存泄露问题 至于具体原因,我们看下文 业务高峰时内存使用率过高...,应该通过提升CPU能力来解决,而不是中止程序 减少已有内存 - 通过GC来回收无用的内存 限制新增内存 - 即运行时尽可能地避免新内存的分配,最简单的方法就是不运行代码 自动GC是需要CPU的计算资源做支持...内存压力高时,GC线程更容易抢占到CPU资源,进行内存回收 代价是业务处理逻辑会有一定性能损耗,被分配的计算资源减少 运行业务逻辑往往会增加内存 GC是回收内存 业务逻辑的Goroutine GC的Goroutine...我们可以将上述分为两类工作 这两类Goroutine都会消耗CPU资源,区别在于: 这里就能体现出Go运行时的策略 GC最直观的影响就体现在延迟上。...对应到上面提到的反馈呢,也就是GC Pacer并不是单纯的一种 按比例增长 的触发机制,还有一些其余因素的影响:比如,当前这次的GC花费的CPU计算资源与标记的耗时超过了预期,表示当前整个GC存在一定压力

    32620

    JVM 优化经验总结

    如何将新对象预留在年轻代 众所周知,由于 Full GC 的成本远远高于 Minor GC,因此某些情况下需要尽可能将对象分配在年轻代,这在很多情况下是一个明智的选择。...因为大对象占用空间多,所以可能需要移动大量小的年轻对象进入年老代,这对 GC 相当不利。基于以上原因,可以将大对象直接分配到年老代,保持年轻代对象结构的完整性,这样可以提高 GC 的效率。...可以看到该对象被分配在了年轻代,占用了 25%的空间。...这是一个关注吞吐量的收集器,可以尽可能地减少 GC 时间。 –XX:ParallelGC-Threads:设置用于垃圾回收的线程数,通常情况下,可以设置和 CPU 数量相等。...故该设置提高了 Survivor 区的使用率。当存放的对象超过这个百分比,则对象会向年老代压缩。因此,这个选项更有助于将对象留在年轻代。

    50920

    计算密集型服务 性能优化实战始末

    ,无法进行横向扩容; 对上游数据的采样率达 **30%**,业务方对数据的完整性有较大诉求,但系统 CPU 存在瓶颈,无法满足; 性能优化 针对以上问题,开始着手对服务 CPU Idle 进行优化;抓取服务...这个问题目前已经有解决方案,Uber 发表的文章中提到了一种自动调整 GOGC 参数的方案,用于在这种方式下优化 GO 的 GC CPU 占用,不过业界还没有开源相关实现 设置 GOGC 至 1000%.../ 优化后 GC 频率由每秒 5 次降低到了每秒 0.1 次 使用 ballast 内存控制后,GC 占用缩小至红框大小 使用方式一后,内存始终稳定在 25% -30%,即 3G 大小 相比于设置...,再选择此种方式; 设置 GOGC、GO ballast 内存控制等操作本质上也是一种空间换时间的做法,在内存与 CPU 之间进行压力置换; 在 GC 调优方面,还有很多其他优化方式,如 bigcache...16 核 GC 优化(红框部分) 先后将 CPU 提升 **25%、10%**(假设不做伸缩); 支持上游数据 100% 放量; 通过对 CPU 瓶颈的解决,顺利合并服务,下掉 70 台容器。

    86020
    领券