golang内存泄漏场景(golang什么场景设置runtime.GOMAXPROCS=cpu数量会提高性能)

2024-10-16 22:15:32 1

golang内存泄漏场景(golang什么场景设置runtime.GOMAXPROCS=cpu数量会提高性能)

各位老铁们好,相信很多人对golang内存泄漏场景都不是特别的了解,因此呢,今天就来为大家分享下关于golang内存泄漏场景以及golang什么场景设置runtime.GOMAXPROCS=cpu数量会提高性能的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!

本文目录

golang什么场景设置runtime.GOMAXPROCS=cpu数量会提高性能

这是测试的代码// parallel package mainimport ( "fmt" "math/rand" "runtime" "sort" "time" )func testData() = seed.Intn(100000) } } return data }func test() { data := testData() ch := make(chan int) for i := 0; i 《 len(data); i++ { go func(ch chan int, data ) } for i := 0; i 《 len(data); i++ { 《-ch } }func main() { st := time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(2) st = time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(3) st = time.Now() test() fmt.Println(time.Since(st)) runtime.GOMAXPROCS(4) st = time.Now() test() fmt.Println(time.Since(st)) fmt.Println("Hello World!") }该代码的作用是生成10000个数组,每个数组有10000个int元素,分别调用不同CPU核数进行排序计算。用的是Go内置的排序函数。中的时间如下25.6269405s 14.1753705s 10.3508423s 8.5466479s分别是单核,2核,3核,4核的计算时间。的确用多核后计算速度提升很大。

golang sync.pool对象复用 并发原理 缓存池

***隐藏网址***

先上一个测试:

结论是这样的:

***隐藏网址***

sync.Pool是一个 协程安全 临时对象池 。数据结构如下:

local 成员的真实类型是一个 poolLocal 数组,localSize 是数组长度。这涉及到Pool实现,pool为每个P分配了一个对象,P数量设置为runtime.GOMAXPROCS(0)。在并发读写时,goroutine绑定的P有对象,先用自己的,没有去偷其它P的。go语言将数据分散在了各个真正运行的P中,降低了锁竞争,提高了并发能力。

不要习惯性地误认为New是一个关键字,这里的New是Pool的一个字段,也是一个闭包名称。其API:

如果不指定New字段,对象池为空时会返回nil,而不是一个新构建的对象。Get()到的对象是随机的。

原生sync.Pool的问题是,Pool中的对象会被GC清理掉,这使得sync.Pool只适合做简单地对象池,不适合作连接池。

pool创建时不能指定大小,没有数量限制。pool中对象会被GC清掉,只存在于两次GC之间。实现是pool的init方法注册了一个poolCleanup()函数,这个方法在GC之前执行,清空pool中的所有缓存对象。

为使多协程使用同一个POOL。最基本的想法就是每个协程,加锁去操作共享的POOL,这显然是低效的。而进一步改进,类似于ConcurrentHashMap(JDK7)的分Segment,提高其并发性可以一定程度性缓解。

注意到pool中的对象是无差异性的,加锁或者分段加锁都不是较好的做法。go的做法是为每一个绑定协程的P都分配一个子池。每个子池又分为私有池和共享列表。共享列表是分别存放在各个P之上的共享区域,而不是各个P共享的一块内存。协程拿自己P里的子池对象不需要加锁,拿共享列表中的就需要加锁了。

Get对象过程:

Put过程:

如何解决Get最坏情况遍历所有P才获取得对象呢:

方法1止前sync.pool并没有这样的设置。方法2由于goroutine被分配到哪个P由调度器调度不可控,无法确保其平衡。

由于不可控的GC导致生命周期过短,且池大小不可控,因而不适合作连接池。仅适用于增加对象重用机率,减少GC负担。2

执行结果:

单线程情况下,遍历其它无元素的P,长时间加锁性能低下。启用协程改善。

结果:

测试场景在goroutines远大于GOMAXPROCS情况下,与非池化性能差异巨大。

测试结果

可以看到同样使用*sync.pool,较大池大小的命中率较高,性能远高于空池。

结论:pool在一定的使用条件下提高并发性能,条件1是协程数远大于GOMAXPROCS,条件2是池中对象远大于GOMAXPROCS。归结成一个原因就是使对象在各个P中均匀分布。

池pool和缓存cache的区别。池的意思是,池内对象是可以互换的,不关心具体值,甚至不需要区分是新建的还是从池中拿出的。缓存指的是KV映射,缓存里的值互不相同,清除机制更为复杂。缓存清除算法如LRU、LIRS缓存算法。

池空间回收的几种方式。一些是GC前回收,一些是基于时钟或弱引用回收。最终确定在GC时回收Pool内对象,即不回避GC。用java的GC解释弱引用。GC的四种引用:强引用、弱引用、软引用、虚引用。虚引用即没有引用,弱引用GC但有空间则保留,软引用GC即清除。ThreadLocal的值为弱引用的例子。

regexp 包为了保证并发时使用同一个正则,而维护了一组状态机。

fmt包做字串拼接,从sync.pool拿byte对象。避免频繁构建再GC效率高很多。

Go 1.12中出现的top命令RES参数异常增高的问题

偶然在生产上部署了一个版本之后发现,机器不断重启报警,后经过查询linux日志发现,原来是因为服务占用内存过高被内核给kill掉了。接下来就是查问题,本来以为是内存泄漏,上了pprof工具之后发现,内存占用稳定在2.6g,而top命令则很快看到 RES 参数暴涨到12g+(机器内存16g)后被内核杀掉。百思不得其解。后来在翻阅Go1.12发布说明时看到一段话:

***隐藏网址***

这段话的关键在于,Go1.12中使用的新的 MADV_FREE 模式,这个模式会更有效的释放无用的内存,但可能会让 RSS 增高,RSS是什么呢?Resident Set Size 常驻内存集,而top中 RES 参数的含义是进程使用的、未被换出的物理内存大小,也即常驻内存集。看到这里,试着在程序运行时加上这个参数 GODEBUG=madvdontneed=1 ,果然,内存稳定在2.7g,问题就此解决。

Go 中这么多创建 error 的方式,你真的了解它们各自的应用场景吗

在Go中,error是一种内建的数据类型。在Go中被定义为一个接口,定义如下:

由此可知,该接口只有一个返回字符串的Error函数,所有的类型只要实现了该函数,就创建了一个错误类型。

创建error的方式包括errors.New、fmt.Errorf、自定义实现了error接口的类型等。

2.1 通过errors.New方法创建

通过该方法创建的错误一般是可预知的错误。简单来说就是调用者通过该错误信息就能明确的知道哪里出错了,而不需要再额外的添加其他上下文信息,我们在下面的示例中详细说明。

我们看New方法的实现可知,实际上是返回了一个errorString结构体,该结构体包含了一个字符串属性,并实现了Error方法。代码如下:

error.New使用场景1

通过errors.New函数创建局部变量或匿名变量,且不在调用函数中进行值或类型判断的处理,只打印或记录错误日志的场景。

使用示例1

***隐藏网址***

使用示例2

***隐藏网址***

error.New使用场景2

将errors.New创建的错误赋值给一个全局的变量,我们称该变量为哨兵错误,该哨兵错误变量可以在被处理的时候使用 == 或 errors.Is来进行值的比较。

使用示例 : 在源码/src/io/io.go中定义的代表文件末尾的哨兵错误变量EOF。

在beego项目中,beego/core/utils/file.go文件中有这样的应用,当读取文件时,遇到的错误不是文件末尾的错误则直接返回,如果遇到的是文件末尾的错误,则中断for循环,说明文件已经读完文件中的所有内容了。如下:

2.2 通过fmt.Errorf方法创建

使用场景1:不带%w占位符

在创建错误的时候,不能通过errors.New创建的字符串信息来描述错误,而需要通过占位符添加更多的上下文信息,即动态信息。

使用示例:不带%w占位符

以下示例节选自gorm/schema/relationship.go的部分代码,当外键不合法时,通过fmt.Errorf("invalid foreign key:%s", foreignKey)返回带具体外键的错误。因为外键值是在运行时才能确定的。代码如下:

使用场景2:带%w的占位符

在有些场景下,调用者需要知道原始错误信息,一般会通过errors.Is函数进行判断该错误链中是否包含某种特定类型的原始错误值。

使用%w占位符创建的错误信息,其实会形成一个错误链。其用法如下:

我们再来看下源代码:

通过源码可知,如果fmt.Errorf中包含%w占位符,创建的是一个wrapError结构体类型的值。我们再来看下wrapError结构体的定义:

字段err就是原始错误,msg是经过格式化之后的错误信息。

使用示例:带%w的占位符

假设我们有一个从数据库查询合同的函数,当从数据库中查询到记录为空时,会返回一个sql.ErrNoRows错误,我们用%w占位符来wrap该错误,并返回给调用者。

好了,现在GetContract的调用者可以知道原始的错误信息了。在调用者逻辑中我们可以使用errors.Is来判断err中是否包含sql.ErrNoRows值了。我们看下调用者的代码:

使用场景 :这个是相对errors.New来说的,errors.New适用于对可预知的错误的定义。而当发生了不可预知的错误时,就需要自定义错误类型了。

使用示例 : 我们以go源码/src/io/fs/fs.go文件中的源码为例,来看下自定义错误类型都需要包含哪些元素。

首先看结构体,有一个error接口类型的Err,这个代表的是错误源,因为根据上面讲解的,在错误层层传递返回给调用者时,我们需要追踪每一层的原始错误信息,所以需要该字段对error进行wrap,形成错误链。另外,有两个字段Op和Path,分别代表是产生该错误的操作和操作的路径。这两个字段就是所谓的未预料到的错误:不确定是针对哪个路径做了什么错误引发了该错误。

我们看下该错误类型在代码中的应用:

应用1 :在go的文件src/embed/embed.go中的代码,当读取某目录时返回的一个PathError类型的错误,代表读取该目录操作时,因为是一个目录,所以不能直接读取文件内容。

应用2 :在go的文件src/embed/embed.go中的代码中,有文件读取的函数,当offset小于0时,返回了一个PathError,代表是在读取该文件的时候,参数不正确。

fs.ErrInvalid的定义如下:

由此可见,PathError中的三个字段值都是不可预知的,都需要在程序运行时才能具体决定的,所以这种场景时,则需要自定义错误类型。

另外,我们还注意到该自定义的类型中有Unwrap函数的实现,该函数主要是为了配合errors.Is和errors.As使用的,因为这两个函数在使用时是将错误链层层解包一一比对的。

根据上一节我们得到,通过%w占位符可以将错误组织成一个错误链。

errors.Is函数就是来判断错误链中有没有和指定的错误值相等的错误,相等于 == 操作符 。注意,这里是特定的错误值,就像gorm中定义的ErrRecordNotFound这样:

那么我们就可以这样使用errors.Is:

errors.As函数,这个函数是用来检查错误链中的错误是否是特定的类型 。如下代码示例是节选自etcd项目中etcd/server/embed/config_logging.go中的部分代码,代表的是err链中有没有能当做json.SyntaxError类型的错误的,如果能,则将err中的错误值赋值到syntaxError变量上,代码如下:

本文从应用场景的角度讲解了各种创建错误方式的实际应用场景。示例中的代码尽量的选自golang源码或开源项目。 同时,每种的应用场景并非绝对的,需要灵活应用。希望本文对大家在实际使用中能够有所帮助。

易语言转go

你好,使用golang写动态库,再使用易语言写界面,肯定有不少人有这种想法吧;但中间有些坑,这里留下一些解决方法。一、如何编译?请先安装gcc编译器,选择32位由于易语言只支持32位dll,使用64位会出错,例如找不到此函数;必须先设置两项配置:set GOARCH=386,set CGO_ENABLED=1,用cmd;编译命令:go build -ldflags "-s -w" -buildmode=c-shared -o dlldemo.dll dlldemo.go 。二、形参与返回值在go中,除了 string 特殊外,其他int、bool,等基本类型原本怎样还是怎样;传 string 与返回值 string 都改成 *C.char 类型,其他基本类型不用改;有三个方法比较重要,C.CString 转成c字符串,C.GoString 转成go字符串 , C.free 释放内存;只要用到 C.CString 此方法,就必须记得释放内存。三、内存泄漏如果使用了 C.CString 却不使用 C.free ,内存暂用只会越来越大,最后奔溃;释放内存时,请不要重复取地址,例如 unsafe.Pointer(&xx变量) ,这样等于没释放;也可能是vc6的原因,使用 defer 在即将出栈时释放,会造成易语言得不到返回值;解决方法,声明全局变量,将结果赋值给全局变量,专门定义一个释放函数例如FreeAll() 用于释放!四、如何调用在填写dll命令时,请在填写,在库中对应命令名时,前面加个 @ ,不然会出现栈错误;每次调用返回值是文本型dll命令时,请都使用前面准备的 FreeAll() 释放内存!通过易语言的便捷,为自己的golang小项目加点gui吧,这里留下源码,给有需要的人。希望能帮到你。

golang复用http.request.body

***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** ***隐藏网址*** NopCloser returns a ReadCloser with a no-op Close method wrapping the provided Reader r. NopCloser用一个无操作的Close方法包装Reader r返回一个ReadCloser接口。 这样我们就可以再次使用c.request来进行处理了。 ***隐藏网址***

关于golang内存泄漏场景到此分享完毕,希望能帮助到您。

golang内存泄漏场景(golang什么场景设置runtime.GOMAXPROCS=cpu数量会提高性能)

本文编辑:admin

本文相关文章:


golang内存泄漏场景(Go 1.12中出现的top命令RES参数异常增高的问题)

golang内存泄漏场景(Go 1.12中出现的top命令RES参数异常增高的问题)

“golang内存泄漏场景”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看golang内存泄漏场景(Go 1.12中出现的top命令RES参数异常增高的问题)!本文目录Go 1.12中出现的top命令RES参数异常增高的问题

2024年8月29日 17:25

更多文章:


猎杀潜航3怎么样才能控制战舰?为什么猎杀潜航3生涯开始会在非洲西海岸

猎杀潜航3怎么样才能控制战舰?为什么猎杀潜航3生涯开始会在非洲西海岸

本文目录猎杀潜航3怎么样才能控制战舰为什么猎杀潜航3生涯开始会在非洲西海岸我玩猎杀潜航4为何总是被敌舰发现跪求教程 请高手指点一二 另外4里面的作战地图为何没鱼雷显示啊猎杀潜航3怎么样才能控制战舰杀潜航III攻略 想玩好 猎杀潜航III首先

2024年6月20日 06:52

qq国际版官方网站(“手机QQ国际版”怎么加国外的好友)

qq国际版官方网站(“手机QQ国际版”怎么加国外的好友)

大家好,关于qq国际版官方网站很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于“手机QQ国际版”怎么加国外的好友的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

2024年6月11日 08:32

二维码生成器永久免费(群二维码怎么永久有效)

二维码生成器永久免费(群二维码怎么永久有效)

其实二维码生成器永久免费的问题并不复杂,但是又很多的朋友都不太了解群二维码怎么永久有效,因此呢,今天小编就来为大家分享二维码生成器永久免费的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录群二维码怎么永久有效想要个

2024年7月23日 20:39

宽带拨号上网账号密码(PPPoE的用户名和密码是什么)

宽带拨号上网账号密码(PPPoE的用户名和密码是什么)

大家好,关于宽带拨号上网账号密码很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于PPPoE的用户名和密码是什么的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!本

2024年8月12日 14:26

最近很热的云视频是什么意思能做什么?爱云视网络摄像头如何使用

最近很热的云视频是什么意思能做什么?爱云视网络摄像头如何使用

本文目录最近很热的云视频是什么意思能做什么爱云视网络摄像头如何使用中青云视的联系方式云视频网络电视盒看一会就黑屏怎么办王牌电视云视能连接无线网吗云视链是什么最近很热的云视频是什么意思能做什么云视频是指基于云计算商业经济发展模式,可以进行分析

2024年6月12日 12:39

万能一键root工具(我红米note增强版,安卓4.4.2系统,试了所有软件,都不能root,请问到底该如何root)

万能一键root工具(我红米note增强版,安卓4.4.2系统,试了所有软件,都不能root,请问到底该如何root)

今天给各位分享我红米note增强版,安卓4.4.2系统,试了所有软件,都不能root,请问到底该如何root的知识,其中也会对我红米note增强版,安卓4.4.2系统,试了所有软件,都不能root,请问到底该如何root进行解释,如果能碰巧

2024年7月23日 08:34

caj云阅读手机版(怎么在手机上看caj格式文件)

caj云阅读手机版(怎么在手机上看caj格式文件)

本篇文章给大家谈谈caj云阅读手机版,以及怎么在手机上看caj格式文件对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。本文目录怎么在手机上看caj格

2024年7月2日 23:01

可以下载软件的app(苹果下载软件的app叫什么软件)

可以下载软件的app(苹果下载软件的app叫什么软件)

其实可以下载软件的app的问题并不复杂,但是又很多的朋友都不太了解苹果下载软件的app叫什么软件,因此呢,今天小编就来为大家分享可以下载软件的app的一些知识,希望可以帮助到大家,下面我们一起来看看这个问题的分析吧!本文目录苹果下载软件的a

2024年8月15日 23:51

英雄联盟电脑版(如何下载英雄联盟(电脑版)游戏客户端)

英雄联盟电脑版(如何下载英雄联盟(电脑版)游戏客户端)

今天给各位分享如何下载英雄联盟(电脑版)游戏客户端的知识,其中也会对如何下载英雄联盟(电脑版)游戏客户端进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!本文目录如何下载英雄联盟(电脑版)游戏客户端为啥下载电脑版英雄联盟

2024年5月29日 10:01

电脑游戏加速器哪个好用(网游加速器哪个好用)

电脑游戏加速器哪个好用(网游加速器哪个好用)

大家好,如果您还对电脑游戏加速器哪个好用不太了解,没有关系,今天就由本站为大家分享电脑游戏加速器哪个好用的知识,包括网游加速器哪个好用的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录网游加速器哪个好用电脑加速器哪个

2024年5月17日 07:26

composer(composer是什么意思)

composer(composer是什么意思)

本文目录composer是什么意思Composer 自动加载原理如何安装composerComposer是什么意思composer重音在哪如何安装Composercomposer是什么意思composer的意思是n.作曲家高考讲解英美词态变

2024年7月2日 17:47

wps2007怎么下载(如何在电脑上下载wps)

wps2007怎么下载(如何在电脑上下载wps)

大家好,如果您还对wps2007怎么下载不太了解,没有关系,今天就由本站为大家分享wps2007怎么下载的知识,包括如何在电脑上下载wps的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录如何在电脑上下载wps怎么在

2024年8月27日 18:55

ps分层素材(psd分层素材在ps里面怎么分层)

ps分层素材(psd分层素材在ps里面怎么分层)

本文目录psd分层素材在ps里面怎么分层分层素材如何在photoshop里用用photoshop做gif图片,怎样将素材分层ps中的分层素材那个地方有好的而且是免费另外怎么可以避免电脑辐射!谢谢.如何将ps文件分层导入AE里psd分层素材在

2024年1月6日 07:20

英雄三国下载(游戏英雄三国 玩的时候游戏闪退,怎么办)

英雄三国下载(游戏英雄三国 玩的时候游戏闪退,怎么办)

本文目录游戏英雄三国 玩的时候游戏闪退,怎么办英雄三国和英雄联盟哪个好 说明理由 谢谢LOL和英雄三国哪个好玩 都介绍下!三国中有“三国英雄属马超”之说,在你心目中谁才是真正的英雄英雄三国和LOL哪个比较好玩游戏英雄三国 玩的时候游戏闪退,

2024年6月6日 06:37

cad迷你看图官网(有什么好的cad浏览软件 知乎)

cad迷你看图官网(有什么好的cad浏览软件 知乎)

各位老铁们好,相信很多人对cad迷你看图官网都不是特别的了解,因此呢,今天就来为大家分享下关于cad迷你看图官网以及有什么好的cad浏览软件 知乎的问题知识,还望可以帮助大家,解决大家的一些困惑,下面一起来看看吧!本文目录有什么好的cad浏

2024年8月27日 21:15

苹果手机怎么关闭软件资源库?曼恒软件的资源库怎么找

苹果手机怎么关闭软件资源库?曼恒软件的资源库怎么找

大家好,今天小编来为大家解答以下的问题,关于软件库资源,苹果手机怎么关闭软件资源库这个很多人还不知道,现在让我们一起来看看吧!本文目录苹果手机怎么关闭软件资源库曼恒软件的资源库怎么找手机软件资源库怎么关闭星河软件库永存地址小马软件库是真的吗

2024年8月18日 02:05

ps新手入门教程(ps新手怎么作图从哪学起)

ps新手入门教程(ps新手怎么作图从哪学起)

“ps新手入门教程”相关信息最新大全有哪些,这是大家都非常关心的,接下来就一起看看ps新手入门教程(ps新手怎么作图从哪学起)!本文目录ps新手怎么作图从哪学起photoshopcs6零基础入门教程ps基础教程 新手入门ps绘画入门教程ps

2024年6月29日 06:13

您认为脱口秀和单口相声有什么区别?囧叔:人们对尤文在欧冠的期望超实际,C罗首发战那不勒斯C罗有无必要出战本轮意甲

您认为脱口秀和单口相声有什么区别?囧叔:人们对尤文在欧冠的期望超实际,C罗首发战那不勒斯C罗有无必要出战本轮意甲

本文目录您认为脱口秀和单口相声有什么区别囧叔:人们对尤文在欧冠的期望超实际,C罗首发战那不勒斯C罗有无必要出战本轮意甲战那不勒斯前阿莱格里提辞职,阿涅利劝其留下,囧叔执教能力如何谁更适合这支尤文为何有人说黄西的脱口秀很尴尬你如何评价今晚80

2024年5月17日 05:19

自动定时关机(如何给电脑设置定时自动关机)

自动定时关机(如何给电脑设置定时自动关机)

本文目录如何给电脑设置定时自动关机怎么让电脑定时自动关机如何让计算机定时关机如何给电脑设置定时自动关机笔记本电脑设置自动关机或者定时关机,你可以使用定时关机3000时关机3000专业的电脑定时关机软件、电脑自动关机软件、家长的好帮手、满足各

2024年6月25日 07:05

下载消灭星星2022免费版(求 消灭星星经典版下载)

下载消灭星星2022免费版(求 消灭星星经典版下载)

大家好,如果您还对下载消灭星星2022免费版不太了解,没有关系,今天就由本站为大家分享下载消灭星星2022免费版的知识,包括求 消灭星星经典版下载的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!本文目录求 消灭星星经典版下

2024年7月9日 07:25

近期文章

本站热文

iphone vpn设置(ios设置vpn快捷开关)
2024-07-22 15:01:12 浏览:2342
windows12正式版下载(操作系统Windows Server 2012 R2,在哪能下载到,公司用的)
2024-07-20 17:26:53 浏览:1736
client mfc application未响应(每次进cf就提示client MFC Application未响应该怎么办啊!急急急)
2024-07-20 11:15:58 浏览:1168
java安装教程(win10如何安装JAVA)
2024-07-19 19:55:49 浏览:1164
标签列表

热门搜索