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

golang 内置函数new() 和struct{} 初始化的区别

new() 这是一个用来分配内存的内置函数,它的第一个参数是一个类型,不是一个值,它的返回值是一个指向新分配的 t 类型的零值的指针。 在golang的代码定义如下: func new(t Type) *Type strut{} 直接使用struct{} 来初始化strut时,返回的是一个struct类型的值,而不是指针两者是不一样的 两者对比代码如下: type Student struct{ id int name string } func main(){ var s_1 *Student = new(Student) s_1.id = 100 s_1.name = "cat" var s_2 Student = Student{id:1,name:"tom"} fmt.Println...阅读全文

博文 2015-06-17 20:03:41 happinessaflower

Go 语言中Select与for结合使用时可能会遇到的坑

作为一个刚接触go编程的新鸟,是不是被它的某些新特性给吓到,尤其是之前已经习惯了C++的编程。对于Go语言,网上褒贬不一,有极力推崇的,如七牛的许式伟,其对go的评价极高,并预言Go的市场占有率会一直逐步上升,取代java,成为第一。也有极力贬低的,他们一般会网络上有各种博客帖子,详细的剖析了go的不妥之处。而我接触go这段时间之后,不得不说,它真的是一门很有意思的语言,为什么用有意思形容呢,借用一句装逼的话,存在即合理。go能够慢慢被国内国外的各大互联网公司用于服务器架构,它自有它的闪光之处,而至于有意思呢,就需要对它有兴趣的人慢慢去发现,(呃。。。。这个情景导入有点长,貌似有点跑偏) 好,言归正传,最近在用go开发项目的过程中突然发现一个坑,尤其是对于其它传统语言转来的人来说一不住注意就...阅读全文

博文 2015-11-13 15:00:00 u010511236

Go语言slice的那些坑

Go语言Google开发的适用于多核编程的语言。我感觉它像是C语言的现代版本,简单,并发支持友好,部署轻松。GO语言中保留关键字就只有25个,这也足以说明它的学习成本并不高。 然而,Go语言里面slice这个东西并不简单。初学者容易掉入坑中。此文件就试图把slice给讲解清楚。 下面先讲一下slice的一些基本特性。 1. slice内部有三个变量,分别是:ptr, len, cap ptr是用来存储数据的数组 cap是ptr数组的长度 len是实际数组的长度 2. 如何在初始化的时候,指定slice的长度? a := make([]int, 10) 这里make的时候,第2个参数,就是这个slice的长度。 这个时候它的capacity是多少呢? fmt.Println(cap(a)) 这...阅读全文

博文 2016-03-31 19:00:05 zhanchenxing

Go语言内幕(6):启动和内存分配初始化

本文由 伯乐在线 - yhx 翻译,黄利民 校稿。未经许可,禁止转载!英文出处:Siarhei Matsiukevich。欢迎加入翻译组。 《Go语言内幕(1):主要概念与项目结构》 《Go语言内幕(2):深入 Go 编译器》 《Go语言内幕(3):链接器、链接器、重定位》 《Go语言内幕(4):目标文件和函数元数据》 《Go语言内幕(5):运行时启动过程》 本文是 Golang 内部机制探索系列博客的后续。这个系列博客的目的是探索 Go 启动过程,这个过程也是理解 Go 运行时(runtime)的关键之处。本文中我们将一起去看看启动过程的第二个部分,分析参数是怎么被初始化的及其中有哪些函数调用等等。 启动顺序 我们从上次结束的地方继续。在 runtime.r0_to 函数中,我们还有一部分...阅读全文

博文 2016-06-01 14:49:26 伯乐在线

golang make()内置函数

内建函数 make 用来为 slice,map 或 chan 类型分配内存和初始化一个对象(注意:只能用在这三种类型上),跟 new 类似,第一个参数也是一个类型而不是一个值,跟 new 不同的是,make 返回类型的引用而不是指针,而返回值也依赖于具体传入的类型 make()函数在golang的代码如下: func make(t Type,size IntegerType) Type 使用make来创建slice,map,chanel说明如下: slice: var slice_ []int = make([]int,5,10) fmt.Println(slice_) var slice_1 []int = make([]int,5) fmt.Println(slice_1) var s...阅读全文

博文 2015-06-17 20:03:47 happinessaflower

golang学习之struct

结构体定义的一般方式如下: type identifier struct { field1 type1 field2 type2 ... } type T struct {a, b int} 也是合法的语法,它更适用于简单的结构体。 var t *T t = new(T) 变量 t 是一个指向 T的指针,此时结构体字段的值是它们所属类型的零值,使用 new 函数给一个新的结构体变量分配内存,它返回指向已分配内存的指针。 无论变量是一个结构体类型还是一个结构体类型指针,都使用同样的 选择器符(selector-notation) 来引用结构体的字段,即: type myStruct struct { i int } var v myStruct // v是结构体类型变量 var p *mySt...阅读全文

博文 2016-06-15 09:00:00 caiya928

go内存管理和垃圾收集简介

go语言的内存分两部分,一部分用作堆,供内存分配用,另一部分是bitmap,用来管理堆。两部分从同一地址开始,向高地址方向增长的是内存池,向低地址方向增长的是bitmap。 ##内存分配## 对于较大的内存申请,直接从堆上申请,释放时也直接返回给堆。 而当一个go routine申请小于32k字节的内存,则从go routine私有的内存池中分配内存。因为是私有的,所有在多数情况下,分配内存不需要上锁。如果私有内存池没有内存了,则需要向中心内存池申请内存,中心内存池是共享数据,此时需要上锁。如果中心内存池也没有内存了,则从堆里申请内存。 私有内存池和中心内存池里的内存都是按照大小分开管理的,这样,分配和释放内存都非常快,而且也不容易产生碎片。通常,中心内存池从堆上申请...阅读全文

golang中new和make区别

golang 中有两个内存分配机制 :new和make,二者有明显区别. new:用来初始化一个对象,并且返回该对象的首地址.其自身是一个指针.可用于初始化任何类型 make:返回一个初始化的实例,返回的是一个实例,而不是指针,其只能用来初始化:slice,map和channel三种类型 package main import ( "fmt" ) func main() { a := new([]int) fmt.Println(a) //输出&[],a本身是一个地址 b := make([]int, 1) fmt.Println(b) //输出[0],b本身是一个slice对象,其内容默认为0 } 通过这个例子可以看出,当对slice,map以及channel进行初始化时,使用make比n...阅读全文

Go的变量到底在堆还是栈中分配

Go的变量到底在堆还是栈中分配 2015-10-22 最近试着优化掉一些小对象分配,发现一个很诡异的问题:这段代码会在堆上分配对象! package main import ( "fmt" ) func main() { var a [1]int c := a[:] fmt.Println(c) } 看汇编代码 go tool compile -S test.golang "".main t=1 size=336 value=0 args=0x0 locals=0x98 0x0000 00000 (test.go:7) TEXT "".main(SB), $152-0 0x0000 00000 (test.go:7) MOVQ (TLS), CX 0x0009 00009 (test.go:...阅读全文

博文 2016-07-20 13:27:37 zenlife

玩转Golang之Struct结构体

先介绍一下go语言的类型系统 Golang中的类型系统 类型系统是指一个语言的类型体系结构。一个典型的类型系统通常包含如下基本内容:  基础类型,如byte、int、bool、float等;  复合类型,如数组、结构体、指针等;  可以指向任意对象的类型(Any类型);  值语义和引用语义;  面向对象,即所有具备面向对象特征(比如成员方法)的类型;  接口。 Go语言中的大多数类型都是值语义,并且都可以包含对应的操作方法。在需要的时候,你可以给任何类型(包括内置类型)“增加”新方法。而在实现某个接口时,无需从 该接口继承(事实上,Go语言根本就不支持面向对象思想中的继承语法),只需要实现该接口 要求的所有方法即可。任何类型都可以被Any类型引用。Any类型就是空接口,即inte...阅读全文

博文 2018-08-11 23:35:04 夏海社长

Go语言内存分配器的实现

前几天断断续续的写了3篇关于Go语言内存分配器的文章,分别是Go语言内存分配器设计、Go语言内存分配器-FixAlloc、Go语言内存分配器-MSpan,这3篇主要是本文的前戏,其实所有的内容本可以在一篇里写完的,但内容实在太多了,没精力一口气搞定。本文将把整个内存分配器的架构以及核心组件给详细的介绍一下,当然亲自对照着翻看一下代码才是王道。 内存布局结构图 我把整个核心代码的逻辑给抽象绘制出了这个内存布局图,它基本展示了Go语言内存分配器的整体结构以及部分细节(这结构图应该同样适用于tcmalloc)。从此结构图来看,内存分配器还是有一点小复杂的,但根据具体的逻辑层次可以拆成三个大模块——cache,central,heap,然后一个一个的模块分析下去,逻辑就显得特别清晰明了了。位于结构图...阅读全文

博文 2014-11-13 21:58:15 skoo

go语言中var

go语言中定义变量使用关键字var,如:var x int=4 也可以写成x:=4; 在函数中,:= 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。 (:= 结构不能使用在函数外,函数外的每个语法块都必须以关键字开始。) package main import ( "fmt" ) func main() { var x int = 4 fmt.Println(x)//输出4 fmt.Println(&x)//输出指针 //fmt.Println(*x) //错误 y := 4 fmt.Println(y)//输出4 fmt.Println(&y)//输出指针 //fmt.Println(*y) //错误 var v *int = new(int)//返回值为指针 fmt.Prin...阅读全文

Go语言内存分配器设计

Go语言的整个内存管理子系统主要由两部分组成——内存分配器和垃圾收集器(gc)。十一小长假期为了避开我泱泱大国的人流高峰,于是在家宅了3天把Go语言的内存分配器部分的代码给研究了一番,总的来说还是非常酷的,自己也学到了不少的东西,就此记录分享一下。整个内存分配器完全是基于Google自家的tcmalloc的设计重新实现了一遍,因此,想看看Go语言的内存分配器实现的话,强烈建议先读一读tcmalloc的介绍文档,然后看看Go runtime的malloc.h源码文件的注释介绍,这样基本就大概了解Go语言内存分配器的设计了。 Go的内存分配器主要也是解决小对象的分配管理和多线程的内存分配问题。(后面提到的内存分配器都是指代的Go语言实现的内存分配器)。内存分配器以32k作为对象大小的定夺标准,小...阅读全文

博文 2014-11-12 17:25:06 skoo

Go语言数据结构

当向一个新程序员解释Go语言时,我发现如果解释Go的数据是如何在内存中表示的,将有助于建立编写高效程序的良好直觉。 转载地址:http://www.open-open.com/lib/view/open1390373069882.html 基础类型 让我们从一些简单的例子开始: 变量i是int类型,在内存中占用一个32位的存储单位。(上图拿32位系统来举例;对以上的例子,只有指针才会在64位的机器上占用更多的空间——int始终是32位——然而我们仍然可以选择64位的系统。) 变量j是int32类型,因为它经过了显式的类型转化。尽管i和j有着同样的内存布局,但它们的类型是不一样的:像这样的赋值i = j会产生类型异常,必须通过显式的类型转换:i = int(j) 。 变量f是个浮点类型,上例中...阅读全文

博文 2015-04-09 11:00:01 Decadent_2014

Go中实现手动内存分配的坑

Go中实现手动内存分配的坑 2016-07-10 你一定想到过,分配一块大的内存,然后从里面切小的对象出来,手动管理对象分配。分配的开销非常小,就是offset加一下。尤其是有些场景,释放时直接把offset重置,就可以重用这块空间了。实现手动内存分配的好处是,减少小对象数目,从而减少垃圾回收时的扫描开销,降低延迟和提升整个性能。 想到不代表做过,做过会踩坑,这篇文章会把你可能要踩的坑都说一遍。不过先说结论:别这么干,不作死就不会死! TL;DR 扩容 开始很容易想用make([]byte)分配空间,如果大小不够时,还可以进行扩容。这是第一个陷阱。 不要append,别让它扩容。一旦发生扩容,会分配一块新的空间,而旧的slice将不再有任何变量引用它,于是会被垃圾回收掉。等等!之前分配的对象...阅读全文

go语言学习之路五:Go语言内存分配机制make&new

Go有两种分配内存的机制,规则很简单,下面来简单介绍一下。1、new函数New()函数可以给一个值类型的数据分配内存(不知道什么是值类型请前往切片那一部分),调用成功后返回一个初始化的内存块指针,同时该类型被初始化为0值,原型定义:func new(Type) * Typenew是一个分配内存的内置函数,但是不同于其他语言中new所做的工作,它只是将内存清零,而不是初始化内存。2、make函数Make()函数用于给引用类型分配内存空间,比如:slice,map,channal等,这里需要注意的一点是make()创建的是一个引用类型的对象,而不是一个内存空间的指针。Make()函数原型:func make(Type,size IntegerType)Type参数Type必须是一个引用类型(sl...阅读全文

Golang引用类型

引用类型包含 slice、map、channel 内置函数:new 为其分配零值内存 并返回指针 make 为其分配内存初始化结构 并返回对象 package main import ( "fmt" ) func main() { a := make([]int, 3) a[1] = 10 b := new([]int) b[1] = 20 //error : invalid operation: b[1] (type *[]int does not support indexing) ...阅读全文

博文 2016-09-12 12:00:34 lt695981642

Go语言内存分配器-MSpan

MSpan和FixAlloc一样,都是内存分配器的基础工具组件,但和FixAlloc没太大的交集,各自发挥功效而已。span(MSpan简称span)是用来管理一组组page对象,先解释一下page,page就是一个4k大小的内存块而已。span就是将这一个个连续的page给管理起来,注意是连续的page,不是东一个西一个的乱摆设的page。为了直观形象的感受一下span,还是得画个图吧,图形是最好的交流语言。 MSpan结构定义在malloc.h头文件中,代码如下: struct MSpan { MSpan *next; // in a span linked list MSpan *prev; // in a span linked list PageID start; // start...阅读全文

博文 2014-11-13 21:58:14 skoo

Go语言select的内存分配情况

最近看了Go runtime中关于select的实现(select in Go’s runtime),发现select语句位于for循环之内执行的时候,每一遍循环都需要在底层runtime中经历malloc对象到free对象的过程,我认为这个频繁的内存分配和释放的代价并不小,至少内存不是处于一种稳定的状态。因此,我实际的测试一把使用select来操作channel和不使用select操作channel两种情况下的内存情况。 测试过程都是运行程序3分钟,每一次循环sleep 1秒钟,每10秒钟采集一下内存使用情况的数据。为了更直观的感受,我使用goplot工具把采集到的内存数据绘制成了图表。 使用select 测试代码:https://gist.github.com/skoo87/672715...阅读全文

[Go] --- 指针和内存分配

Email : hahayacoder@gmail.com 1 Go语言中的指针和C语言中在使用上几乎没有什么差别,熟悉C语言应该很容易掌握,下面是Go语言中使用指针的代码 package main import "fmt" func main() { var value int = 1 //指向int型的指针 var pInt *int = &value //打印相关信息 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", value, pInt, *pInt) //通过指针修改指针指向的值 *pInt = 222 fmt.Printf("value = %d \n pInt = %d \n *pInt = %d \n", valu...阅读全文

博文 2014-10-10 12:00:01 qiurisuixiang

MongoDB 最佳实践及2.8版本特性与功能

主要流程 MongoDB 2.8 版本特性与功能 MongoDB 在赶集网的应用 MongoDB 最佳实践 MongoDB 2.8 版本特性与功能 TJ MongoDB 开发者 TJ 强调 MongoDB 没有实际意义上的锁,只有 Latch,门栓。 2.6 库级锁 Latch,没有 Lock,写内存的一刹那锁住内存 2.8 无锁的 MVCC 并发,WIREDTIGER,snapshot isolation 2.6 MMAP 内存映射,库级锁 2.8 MMAP 集合级锁 2.8 WIREDTIGER 无锁 WIREDTIGER 存储模式 LSM(HBASE, Cassandra) - Log Structured Merge B-TREE LSM 数据写内存,异步写硬盘 读性能有问题,性能一...阅读全文

博文 2015-04-18 22:00:00 灰仔

Go语言内存分配器-FixAlloc

昨天写了一篇Go语言内存分配器设计,记录了一下内存分配器的大体结构。在介绍内存分配器的核心实现前,本文先介绍一下内存分配器中一个工具组件——FixAlloc。FixAlloc称不上是核心组件,只是辅助实现整个内存分配器核心的一个基础工具罢了,由此可以看出FixAlloc还是一个比较重要的组件。引入FixAlloc的目的只是用来分配MCache和MSpan两个特定的对象,所以内存分配器中有spanalloc和cachealloc两个组件(见《Go语言内存分配器设计》的图)。MCache和MSpan两个结构在malloc.h中有定义。 定义在malloc.h文件中的FixAlloc结构如下,比较关键的三个字段是alloc、list和chunk,其他的字段主要都是用来统计一些状态数据的,比如分配了...阅读全文

博文 2014-11-13 21:58:14 skoo

golang实现Ringbuf

Ring buffer算法优点:高内存使用率,在缓冲buffer内存模型中,不太容易发生内存越界、悬空指针等 bug ,出了问题也容易在内存级别分析调试。做出来的系统容易保持健壮。 package main import ( "bytes" "fmt" ) type Ringbuf struct { buf []byte start, size int } func New(size int) *Ringbuf { return &Ringbuf{make([]byte, size), 0, 0} } func (r *Ringbuf) Write(b []byte) { for len(b) > 0 { start := (r.start + r.size) % len(r.buf) n ...阅读全文

博文 2015-10-20 23:00:12 webyh

Go 语言的内存管理

这篇博客是我在维尔纽斯的 [Go Meetup](https://www.meetup.com/Vilnius-Golang/events/249897910/) 演讲的总结。如果你在维尔纽斯并且喜欢 Go 语言,欢迎加入我们并考虑作演讲 在这篇博文中我们将要探索 Go 语言的内存管理,首先让我们来思考以下的这个小程序: ```go func main() { http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path)) }) http.ListenAndServe(":8080", nil) }...阅读全文

博文 2018-09-20 22:25:03 polaris

Golang实现大数乘法

大数乘法,简单的说,就是把小学学的列竖式计算的方法进行了实现。这其实也就是个乘法分配率的变形。 5 * 12 = 5 * (2 + 10) = 5 * 2 + 5 * 10 所以第二行竖式,12的十位1与5相乘的时候,需要再最后空一位,其实是在最后省略了一个0。十位就是省略一个0,也就是左移一位,那么百位就是左移两位。以此类推。 通过代码实现,相乘的两个数就不能用整形表示了,因为存不了很大的整数。需要用字符串表示。按位相乘,最后把结果错位相加就行。乘法的结果等于乘数的位数,所以可以申请一个和乘数位数相同的数组,然后错位相加即可。但是这样太麻烦了。 乘法是从个位开始,但是遍历字符串是从最高为开始的,所以要首先将输入字符串反转。用i表示被乘数的遍历索引,j表示乘数的索引。前面说了左移的位数和乘数...阅读全文

多线程并发下载器-gorc

gorc是类wget多线程下载器,支持直接从资源url并发获取资源 项目地址:https://github.com/V-I-C-T-O-R/gorc 使用说明: 1.手动选择模式和自动分配模式,参数:manual,默认为false/自动 2.指定并发线程数,参数:thread,默认为5 3.指定下载的url,参数:url 4.指定分块下载的块大小,参数:blockSize,例如,默认1代表16m,2代表32m,4代表64m,以此类推 5.指定分块下载失败后尝试次数,参数:attempt,默认为3 6.指定文件存放位置,参数:root,默认为项目的lib目录 7.程序使用秩序调用gorc.Download(url string)函数即可 ...阅读全文

govpr,golang实现的gmm-ubm声纹识别引擎

## 简介 govpr是golang 实现的基于 GMM-UBM 说话人识别引擎(声纹识别),可用于语音验证,身份识别的场景. 目前暂时仅支持汉语数字的语音,语音格式为wav格式(比特率16000,16bits,单声道) ## 安装 go get github.com/liuxp0827/govpr ## 示例 如下是一个简单的示例. 可跳转至 [example](https://github.com/liuxp0827/govpr/blob/master/example) 查看详细的例子,示例中的语音为纯数字8位数字.语音验证后得到一个得分,可设置阈值来判断验证语音是否为注册训练者本人. ```go package main import (...阅读全文

mongodb 最佳实践

MongoDB功能预览:http://pan.baidu.com/s/1k2UfW MongoDB在赶集网的应用:http://pan.baidu.com/s/1bngxgLp MongoDB在京东的使用:http://pan.baidu.com/s/1qWkawv6 MongoDB 在赶集网的应用 赶集网 DBA 选型失败的案例 选型成功的案例 服务化与运维 失败案例 不支持 join,数据库支持反范式 过多内联数据,索引庞大,性能过低 过多聚合及计算功能,数据库不堪重负 基于地理位置, mongodb 二级索引 schema free,无传统 DB DDL 负担 document 丰富的数据结构类型 mongodb 1.8 全局锁,读写超时非常严重 直到 2.0 DB 级锁,才有单库单表...阅读全文

博文 2016-01-25 03:00:01 jifeng

基于 GMM-UBM 说话人识别引擎(声纹识别) govpr

## 简介 govpr是golang 实现的基于 GMM-UBM 说话人识别引擎(声纹识别),可用于语音验证,身份识别的场景. 目前暂时仅支持汉语数字的语音,语音格式为wav格式(比特率16000,16bits,单声道) 安装 go get github.com/liuxp0827/govpr 示例 如下是一个简单的示例. 可跳转至 [example](https://github.com/liuxp0827/govpr/blob/master/example) 查看详细的例子,示例中的语音为纯数字8位数字.语音验证后得到一个得分,可设置阈值来判断验证语音是否为注册训练者本人.

阅读全文

[有奖调研] 美团云开发者调查问卷

![云云众生_美团云给你想要的自由 2.png](http://studygolang.qiniudn.com/161228/5cfc48b8cd6996ba354bb2f2208cf6a6.png) 美团云针对客户业务弹性变化特点,推出按需付费的灵活计费方式。冲击云计算市场价格底线,为企业提供高性价比的云服务解决方案。 本次调研将收集开发者在云服务使用过程中遇到的主要问题,以及新需求,借此完善美团云产品及解决方案,实现我们更好的服务于客户的宗旨。 [调研问卷地址] http://survey.meituan.com/?r=survey/index/sid/457371/lang/zh-Hans [奖励机制] 请准确并完整地填写调查问卷,我们将根据问卷的真实性、...阅读全文

[go语言]Buffered channel、slice和mutex的简单性能测试

测试代码: package main import ( "fmt" "runtime" "sync" "time" ) const COUNT = 1000000 func bench1(ch chan int) time.Duration { t := time.Now() for i := 0; i < COUNT; i++ { ch <- i } var v int for i := 0; i < COUNT; i++ { v = <-ch } _ = v return time.Now().Sub(t) } func bench2(s []int) time.Duration { t := time.Now() for i := 0; i < COUNT; i++ { s[i] = ...阅读全文

博文 2014-11-02 15:06:15 stevewang

Go手动内存分配

2013-10-27 Go手动内存分配 Go手动内存分配 用Go的时候,有时候又想自己管理内存。所以决定写个手动内存管理的包吧。就当无聊练练手... 总体设计 两级分配。较大内存以页为单位分配,每页4k。分配出去的大块内存只能是1页,2页,3页...较小内存使用buddy算法结合分配池的方式进行分配。buddy算法主要是方便回收,对于各种不规则大小则分别维护一个free的链表。 整体上基本类似于Go本身使用的内存管理算法,除了没有引入垃圾回收标记信息,以及对小对象使用buddy分配算法。 buddy算法 管理结点使用的内存跟最小最大结点相关。如果最小单元太小,则浪费过多的管理结点。管理结点数目=最小单元数目*2 如果最大单元过大,则需要用更长的整型来记录大小,单个管理结点的大小增加。 bud...阅读全文

博文 2015-03-17 10:25:55 zenlife

Dapper,大规模分布式系统的跟踪系统 by bigbully

概述 当代的互联网的服务,通常都是用复杂的、大规模分布式集群来实现的。互联网应用构建在不同的软件模块集上,这些软件模块,有可能是由不同的团队开发、可能使用不同的编程语言来实现、有可能布在了几千台服务器,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具。 Dapper--Google生产环境下的分布式跟踪系统,应运而生。那么我们就来介绍一个大规模集群的跟踪系统,它是如何满足一个低损耗、应用透明的、大范围部署这三个需求的。当然Dapper设计之初,参考了一些其他分布式系统的理念,尤其是Magpie和X-Trace,但是我们之所以能成功应用在生产环境上,还需要一些画龙点睛之笔,例如采样率的使用以及把代码植入限制在一小部分公共库的改造上。 自从Dapper发展成为...阅读全文

博文 2017-12-13 05:59:06 bigbully.github.io

Uber 的分布式追踪系统Jaeger

Jaeger是Uber的分布式跟踪系统。 大多数现有的Zipkin兼容仪表库支持概率采样,但他们希望在初始化时配置采样率。这种方法在大规模使用时导致几个严重问题: 给定的服务几乎没有洞察采样率对跟踪后端的总体流量的影响。 在Uber,商业交通展示强烈的每日季节性; 更多的人在高峰时段乘坐。固定采样概率对于非高峰业务来说太低,而对于高峰业务又太高。 Jaeger客户端库中的轮询功能旨在解决这些问题。通过将关于适当采样策略的决定移动到跟踪后端,我们免除服务开发人员猜测适当的采样率。这还允许后端在流量模式改变时动态地调整采样率。下图显示了从收集器到客户端库的反馈循环。 ![image](https://static.oschina.net/uploads/space/2017/0310/...阅读全文

开源项目 2017-03-10 03:00:51 网友

[go语言]一种自适应资源分配器的实现

在上一篇博文《利用缓冲信道来实现网游帐号验证消息的分发和等待》中提到提到利用缓冲信道来实现数据包的分发和等待,并给出了一个原型实现。但是其中的缓冲信道有一个不足,即只能允许一定数量的goroutine在同时使用SendAndReceive函数等待消息的分发;如果有更多的goroutine需要等待消息,则必须等其他goroutine获得消息并释放信道以后自己才能发送数据包并等待回应。这个不足在高并发时限制了系统的吞吐量。 为了解决这个问题,本文提供一种自适应的信道分配器的实现作为一种解决方案。因为信道也可以换成别的资源,所以认为它本质上是一种资源分配器。这个自适应资源分配器的原理是: 1.预先分配一定数量的资源放到缓冲信道(缓冲池)里,以便在申请资源时能够快速获得资源 2.如果申请资源时缓冲池...阅读全文

博文 2014-11-02 15:03:54 stevewang

[go语言]内存分配器性能测试

在C/C++里,自己动手实现内存分配器是很常见的事情,写过几年C/C++程序的人可能都做过这样的事情。这其中很重要的一个原因是C/C++不支持垃圾回收。但是既然go语言已经支持垃圾回收,还有必要自己去写一个内存分配器吗?我们做一个简单的测试看看结果怎么样。 测试平台: OS: ubuntu 12.04 x86_64 CPU: i5 2.27G MEMORY: 8G // ben1.go 自己实现内存分配器 package main type Pool struct { buf []byte } func (p *Pool) alloc(size int) []byte { if len(p.buf) < size { l := 1024 * 1024 for l < size { l += ...阅读全文

博文 2014-10-30 18:07:21 stevewang

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 atomic 32位机器问题

测试过程中发现一个atomic.AddInt64()报内存错误 32位window,linux下都不能正常运行 示例代码: package main import( "fmt" "sync/atomic" ) type item struct{ //c int32 d int32 a int64 } type Obj struct{ list map[string]*item } func (ob *Obj)Init(){ ob.list = make(map[string]*item) ob.list["a"] = &item{} } func (ob *Obj)Add(){ atomic.AddInt64(&ob.list["a"].a,12) fmt.Println(ob.list["...阅读全文

mysql5.6 rpm安装后运行错误

mysql5.6.16,rpm安装后运行,日志内出现以下错误: 2014-01-30 00:52:59 17504 [Warning] Buffered warning: Performance schema disabled (reason: init failed). 2014-01-30 00:52:59 17504 [Note] Plugin 'FEDERATED' is disabled. 2014-01-30 00:52:59 17504 [Note] InnoDB: The InnoDB memory heap is disabled 2014-01-30 00:52:59 17504 [Note] InnoDB: Mutexes and rw_locks u...阅读全文

为什么说go语言中的string是不可变的?

```go s := "foobar阿斯蒂芬" fmt.Println(s) fmt.Println(&s) s = "qweqweqweqweqwe" fmt.Println(s) fmt.Println(&s) ``` 这个不可变到底指的是啥意思?上面的代码不就使s这个string变量改变了吗?而且s的地址也没有变化(说明没有给s重新分配内存),那这样看来,s就是可变的呀,实在不懂,求解惑 ...阅读全文

Go语言内存分配机制

前言: 本文是学习<> -- 清华大学出版社(王鹏 编著) 的2014年1月第一版 做的一些笔记 , 如有侵权, 请告知笔者, 将在24小时内删除, 转载请注明出处! Go语言有两种内存分配机制 , 分别是内置函数 new() 和make(). - new() - 定义: func new(Type) * Type - 返回值是一个内存块指针 - new() 是一个内置函数, 不同于其他语言中的new操作符, 它只将内存清零, 而不是初始化内存. - make() - 定义: func make(Type, size IntegerType) Type - 在调用make() 函数时, Type必须是引用类型 (Slice , Map 或 Channel), Intege...阅读全文

1.9 新特性预览:Logging, interfaces, and allocation

该文翻译自:http://commaok.xyz/post/interface-allocs/几个星期前,Peter Bourgon在golang-dev开了一个关于标准化日志记录的帖子。 日志很常用,因此性能很快提升。 go-kit日志包使用结构化日志,接口如下:type Logger interface { Log(keyvals ...interface{}) error}调用代码:logger.Log("transport", "HTTP", "addr", addr, "msg", "listening")请注意,进入日志调用的所有内容都将转换为interface{}。 这意味着它分配了不少内存。与另一个结构化日志库zap进行比较。 Zap为了避免内存分配和interface{}使...阅读全文

博文 2017-02-13 02:42:51 方圆

golang对象内存分配

一、分配对象(源码) // 分配对象内存入口 func newobject(typ *_type) unsafe.Pointer { return mallocgc(typ.size, typ, true) } // 分配指定object的大小(bytes数) // 当分配的object大小 <= 32kb 使用每个P本地缓存空闲列表即可 // > 32 kB 直接堆上进行分配. func mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer { // 零长度对象 if size == 0 { return unsafe.Pointer(&zerobase) // 在heap上分配,则都指向预设的同一全局变量(零长度...阅读全文

博文 2019-01-07 19:34:46 神奇的考拉

golang中new和make区别

golang 中有两个内存分配机制 :new和make,二者有明显区别. new:用来初始化一个对象,并且返回该对象的首地址.其自身是一个指针.可用于初始化任何类型 make:返回一个初始化的实例,返回的是一个实例,而不是指针,其只能用来初始化:slice,map和channel三种类型 package main import ( "fmt" ) func main() { a := new([]int) fmt.Println(a) //输出&[],a本身是一个地址 b := make([]int, 1) fmt.Println(b) //输出[0],b本身是一个slice对象,其内容默认为0 } 通过这个例子可以看出,当对slice,map以及channel进行初始化时,使用make比n...阅读全文

博文 2015-06-17 20:02:37 chenbaoke

Socket 网络隧道 qTunnel

qTunnel 是 getqujing.com 使用的安全套接字隧道,是 [Stunnel/stud](http://www.oschina.net/p/stud) 的替代品。qTunnel 使用 Go 编写,为了提高数据传输率,它去掉了认证设置和 SSL 握手。         使用:

$ ./bin/qtunnel -h
Usage of ./bin/qtunnel:
    -backend="127.0.0.1:6400": host:port of the backend
    -clientmode=false: if running at ...阅读全文

测试一下golang协程资源占有率

GO版本:go version go1.4.2 linux/amd64 测试环境: [root@localhost mpro]# more /proc/cpuinfo | grep "model name" model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz model name : Intel(R) Core(TM) i5-4590 CPU @ 3.30GHz [root@localhost mpro]# [root@local...阅读全文

go文件操作

go语言支持的文件操作很多 1、传统的文件操作 导入文件操作需要的包 import "os" 1、文件的打开 f := os.Open(filepath) 2、文件的读取 f.Read([]byte) 3、文件的关闭 f.Close() 这里写代码片 openfile, err := os.Open(“test.go”)//正确打开文件返回err := nil //这里如果文件打开异常,则抛出错误 if err != nil { //panic函数会终止程序的运行,并且打印错误相当于C/C++中的assert()函数 panic(“open file error”) } //defer相当于C++中的析构函数,在程序结束之前,运行其后的函数 defer openfile.Close() //...阅读全文

博文 2016-05-27 15:00:03 u010165367

golang slice 和 string 重用

相比于 c/c++,golang 的一个很大的改进就是引入了 gc 机制,不再需要用户自己管理内存,大大减少了程序由于内存泄露而引入的 bug,但是同时 gc 也带来了额外的性能开销,有时甚至会因为使用不当,导致 gc 成为性能瓶颈,所以 golang 程序设计的时候,应特别注意对象的重用,以减少 gc 的压力。而 slice 和 string 是 golang 的基本类型,了解这些基本类型的内部机制,有助于我们更好地重用这些对象 slice 和 string 内部结构 slice 和 string 的内部结构可以在 $GOROOT/src/reflect/value.go 里面找到 type StringHeader struct { Data uintptr Len int } type...阅读全文

博文 2018-03-17 17:34:37 hatlonely

Go GC

大家好,我是 Okada([@ocadaruma](https://twitter.com/ocadaruma)),LINE 广告平台团队的成员。我对 Go 的 GC (垃圾收集器)有点感兴趣,甚至还促使我专门写一篇关于它的博客。Go 是一门由 Google 开发,并且支持垃圾收集的编程语言。Go 通过[管道](https://tour.golang.org/concurrency/2) 支持并发。很多的公司,包括 Google,都在使用 Go,LINE 也用 Go 来开发工具和服务。 ## Go GC 用 Go,你可以很容易地创建出低延时的应用。Go GC 似乎比其他语言的运行时要简单得多。对于 [Go 1.10](https://golang.org/doc/go1.10) 版本,它的垃...阅读全文

博文 2018-11-07 10:28:34 gogeof