GO语言自底向上优化

这篇具有很好参考价值的文章主要介绍了GO语言自底向上优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go Ballast(通过尝试降低 GC 频率以提高整体性能,针对所有 Go应用都适用)

首先我们明白GO语言GC触发条件是由比例来触发的。例如,当前存活内存10GB,触发比例是100%,因此下次触发GC的时候是当内存达到20GB的时候触发GC。这种机制在当前小内存的情况下会平凡触发GC,例如当前只有1GC的话则内存达到2GB就要触发GC。而单纯提高比例到1000%,那么下次触发GC的时候实际上内存已经有较大的压力。所以,我们采用Ballast机制。

Ballast机制在小内存的时候会申请一些内存,已达到延缓下一次GC的时间。具体的,也就一行代码:

// allocate 2GB ballast which resident in virtual memory only
ballastObject := make([]byte,1024*1024*1024*2)

首先,内存是在续存中分配,所以实际上我们是申请了这块内存但没映射到物理内存。

假设除 Ballast 以外的存活对象总大小为X字节(平均值),Ballast 对象大小为 B字节
1.Ballat 最多会带来大约 B 字节的额外物理内存使用(值得注意的是,这部分多占用的物理内存依然是被除 Ballast 以外的对象所使用,不存在浪费问题,Ballast 本身仅仅存在于虚拟内存中,不会被实际地映射物理页面)
2 Ballast能带来性能优化的根本原因是降低了GC频率

根据1得到:不管大内存还是小内存场景,Ballast 都会额外带来最大为 B 字节的物理内存使用。
根据2得到:在大内存场景即X比较大时,一般来说此时 GC频率会比较小,所以 Ballast带来的优化效果不会像 X 为较小值时那么明显。

那么这样做在清理内存是否会占用更多时间?

答案:不会。GC主要是mark 和sweep。其中sweep速度很快,几乎不暂用时间。在mark阶段由于Ballast不是存活对像,所以不会被扫描到,因此几乎也不占用时间。


CPUWorker(尝试给 Go 带来一个类似内核 CFS 调度器的 goroutime 调度器,以通过其提供的优先级机制保证关键goroutine 的延迟指标,目前还没有在TiDB中尝试 应用,Demo效果很好).

在linux中的调度算法采用CFS算法。CFS算法在休眠进程在唤醒时会获得vruntime的补偿(减少vruntime,提高这个进程优先级),它在醒来的时候有能力抢占CPU是大概率事件,这也是CFS调度算法的本意,即保证交互式进程的响应速度,因为交互式进程等待用户输入会频繁休眠。

  • 计算密集型作业将运行很长时间,因此它将优先级放后;
  • I/O密集型作业会运行很短的时间,因此它只会稍微放后移动;

而goruntime调度器采用的是RR方式。这对IO密集型作业很不友好,交互式进程交互能力差。

解决方式:

1,使用CGO。但是CGO执行write的时候将会导致大内存复制。

2,再来一个并行的GOruntime实例进程。将go library编译成CGO.so文件,然后通过我们GO的CGO来调用这个.so文件。所以这时候其实是有两个隔开的进程也就是两个GMP模型,所以原来的程序和这个IO密集型的.so文件的程序是不会互相影响的。

3,使用CPU worker。

https://docs.google.com/document/d/1g5SgpMg28XyMFdPTVMrZrZiLFBfAIgW8sMEXkKEQTzE/edit文章来源地址https://www.toymoban.com/news/detail-653076.html


到了这里,关于GO语言自底向上优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • golang实现webgis后端开发

    目录 前言 二、实现步骤 1.postgis数据库和model的绑定 2.将pg库中的要素转换为geojson (1)几何定义 (2)将wkb解析为几何类型 (3)定义geojson类型 (4)数据转换 (5)数据返回  2.前端传入的geojson储存到数据库 3、其他功能实现 总结         停更了接近一个月都在研究一门新语言gola

    2024年02月08日
    浏览(50)
  • 【GoLang】MAC安装Go语言环境

    小试牛刀 首先安装VScode软件 或者pycharm mac安装brew软件  brew install go 报了一个错误 不提供这个支持  重新brew install go 之后又重新brew reinstall go 使用go version 可以看到go 的版本 使用go env  可以看到go安装后的配置 配置一个环境变量 vim ~/.zshrc,  

    2024年02月15日
    浏览(60)
  • Go语言(Golang)数据库编程

    要想连接到 SQL 数据库,首先需要加载目标数据库的驱动,驱动里面包含着于该数据库交互的逻辑。 sql.Open() 数据库驱动的名称 数据源名称 得到一个指向 sql.DB 这个 struct 的指针 sql.DB 是用来操作数据库的,它代表了0个或者多个底层连接的池,这些连接由sql 包来维护,sql 包会

    2024年02月03日
    浏览(93)
  • 【Golang】VScode配置Go语言环境

    安装VScode请参考我的上一篇博客:VScode安装_㫪548的博客-CSDN博客 接下来我们直接进入正题: Go语言(又称Golang)是一种开源的编程语言,由Google开发并于2009年首次发布。Go语言具有简洁、高效、可靠和易于阅读的特点,被设计用于解决大型项目的开发需求。它结合了静态类型

    2024年02月03日
    浏览(66)
  • 【Golang】Golang进阶系列教程--Go 语言 map 如何顺序读取?

    Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。 然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。 先看一段代码示例: 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。 首先,Go 语言

    2024年02月14日
    浏览(69)
  • 【Golang】Golang进阶系列教程--Go 语言数组和切片的区别

    在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。 数组和切片是两个常用的数据结构。它们都可以用于存储一组相同类型的元素,但在底层实现和使用方式上存在一些重要的区别。 Go 中数组的长度是不可改变的

    2024年02月15日
    浏览(61)
  • 【Golang】Golang进阶系列教程--Go 语言切片是如何扩容的?

    在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。 切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。 切片是一种引用类型,它有三个属性:指针,长度和容量。 底层源码定义如下: 指针: 指向

    2024年02月14日
    浏览(70)
  • 【Golang】三分钟让你快速了解Go语言&为什么我们需要Go语言?

    博主简介: 努力学习的大一在校计算机专业学生,热爱学习和创作。目前在学习和分享:数据结构、Go,Java等相关知识。 博主主页: @是瑶瑶子啦 所属专栏: Go语言核心编程 近期目标: 写好专栏的每一篇文章 Go 语言从 2009 年 9 月 21 日开始作为谷歌公司 20% 兼职项目,即相关

    2023年04月21日
    浏览(62)
  • Golang(Go语言)IP地址转换函数

    String形式的IP地址和Int类型互转函数 代码 输出如下:  

    2024年02月05日
    浏览(54)
  • Golang区块链钱包_go语言钱包

    Golang区块链钱包的特点 Golang区块链钱包具有以下几个特点: 1. 高性能 Golang是一种编译型语言,具有快速的执行速度和较低的内存消耗。这使得Golang区块链钱包在处理大规模交易数据时表现出色,能够满足高性能的需求。 2. 并发支持 Golang内置了轻量级线程——goroutine,以及

    2024年04月15日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包