1. Go 性能调优之 —— 基准测试

原文链接:https://github.com/sxs2473/go...本文使用 Creative Commons Attribution-ShareAlike 4.0 International 协议进行授权许可。 基准测试 本节重点讨论如何使用 Go 测试框架构建一个有效的基准测试,并提供一些实用的技巧来避免性能缺陷。 基准测试的基本规则 在进行基准测试之前,我们必须要有一个稳定的环境来获得可重现的结果。 机器必须是空闲的——不要运行在共享硬件上,在长时间运行基准测试时不要进行其他操作 注...阅读全文

阅读:779 评论:0

golang垃圾回收

GC算法简介 查看: Golang 垃圾回收剖析中GC算法简介 GC性能的评价标准 摘自: https://studygolang.com/artic... 吞吐量:是指单位时间内是有多少时间是用来运行user application的。GC占用的时间过多,就会导致吞吐量较低。 最大暂停时间:基本上所有的垃圾回收算法,都会在执行GC的过程中,暂停user application。如果暂停时间过长,必然会影响用户体验,尤其是那些交互性较强的应用。 堆使用效率:影响堆使用效率的主要有两个因素,一个是...阅读全文

阅读:1950 评论:0

深入理解golang 的栈

线程栈(thread stacks)介绍 先回顾下linux的内存空间布局 简书_stack02.png 当启动一个C实现的thread时,C标准库会负责分配一块内存作为这个线程的栈。标准库分配这块内存,告诉内核它的位置并让内核处理这个线程 的执行。 在linux系统中,可通过 ulimit -s查看系统栈大小(8M)。 ulimit -s 10240可修改栈大小为10M。 简书_stack01.png 这里最大的一个问题是,分配大数组,或者循环递归函数时,默认的栈空间不够用,会导致Segmen...阅读全文

2018.11.06 13:32 风再起时ME
阅读:1399 评论:0

Go defer实现原理剖析

1. 前言defer语句用于延迟函数的调用,每次defer都会把一个函数压入栈中,函数返回前再把延迟的函数取出并执行。为了方便描述,我们把创建defer的函数称为主函数,defer语句后面的函数称为延迟函数。延迟函数可能有输入参数,这些参数可能来源于定义defer的函数,延迟函数也可能引用主函数用于返回的变量,也就是说延迟函数可能会影响主函数的一些行为,这些场景下,如果不了解defer的规则很容易出错。其实官方说明的defer的三个原则很清楚,本节试图汇总defer的使用场景并做简单说明。2. ...阅读全文

2018-11-07 16:57:05 萤火的萤
阅读:4219 评论:2

GO 中的调度:第三部分 - 并发

## 前奏 这篇文章是三部曲系列文章中的第三篇,这个系列的文章将会对 Go 中调度器背后的机制和语义做深入的了解。本文主要关注并发的部分。 Go 调度器系列文章: - [Go 中的调度器:第一部分 - 操作系统调度器](https://studygolang.com/articles/14264) - [Go 中的调度器:第二部分 - Go 调度器](https://studygolang.com/articles/15316) - [Go 中的调度器:第三部分 - 并发]...阅读全文

2018-12-16 13:37:20 barryz
阅读:2395 评论:2

头条后台研发面经(共三面)+架构师进阶路线分享

![image.png](https://static.studygolang.com/181216/d1248fff78c6b96bd28c7ced82b875ef.png) 后端研发工程师 找牛客大佬要到了白金码,跳过死亡笔试,直接视频面,面试从3点开始,断断续续到晚上8点结束。 每个面试官给我的感觉都是怎么这么高冷啊。 一面: 1 写一个题,找一个无序数组的中位数 2 写了个快排,然后让我找到无序数组第k大的一个数,我说先排序再找,实际上可以用快排的pa...阅读全文

2018-12-16 20:10:36 Javaspring12
阅读:1309 评论:0

一个GO语言性能问题的发现和解决

1事件起因事情起因于公司一位同事在内部邮件组中post了一个问题,一个使用了go1.8.3写的业务程序跑了一段时间后出现部分goroutine卡在等待一个锁ForkLock的现象,同事认为这是go1.8.3的bug,升级到 go1.10 后没有再重现。为了搞清楚这个事情,同事在 github 上发了 issue :https://github.com/golang/go/issues/26836,期间也做了很多重现的尝试,但并未重现。 我浏览了一下出现该问题的业务代码,大概的使用方式是父进程调用...阅读全文

2018-12-18 11:21:32 UCloud技术公告牌
阅读:661 评论:0

Golang并发模型:轻松入门协程池

goroutine是非常轻量的,不会暂用太多资源,基本上有多少任务,我们可以开多少goroutine去处理。但有时候,我们还是想控制一下。 比如,我们有A、B两类工作,不想把太多资源花费在B类务上,而是花在A类任务上。对于A,我们可以来1个开一个goroutine去处理,对于B,我们可以使用一个协程池,协程池里有5个线程去处理B类任务,这样B消耗的资源就不会太多。 控制使用资源并不是协程池目的,使用协程池是为了更好并发、程序鲁棒性、容错性等。废话少说,快速入门协程池才是这篇文章的目的。 协程池指...阅读全文

阅读:689 评论:0

来自老司机golang面试官的经验分享:面试你很大几率会遇到的go语言面试题

正在准备golang面试的小伙伴,很荣幸,你能看到这篇文章,希望每一个看到这篇分享的小伙伴都能找到自己称心如意的工作!​ 编程语言类:Go是什么?使用Go编程有什么好处?Go支持类型继承吗?Go支持运营商超载吗?Go支持方法重载吗?Go支持指针算术吗?Go支持通用编程吗?Go是一个区分大小写的语言吗?Go中变量的静态类型声明是什么?Go中变量的动态类型声明是什么?你能在Go中的单个声明中声明多种类型的变量吗?如何在Go中打印变量的类型?什么是指针?break语句的目的是什么?继续声明的目的是什么...阅读全文

2019.04.10 17:36 QFdongdong
阅读:6866 评论:0

图解Go的select语句原理

Go 的select语句是一种仅能用于channl发送和接收消息的专用语句,此语句运行期间是阻塞的;当select中没有case语句的时候,会阻塞当前的groutine。所以,有人也会说select是用来阻塞监听goroutine的。 还有人说:select是Golang在语言层面提供的I/O多路复用的机制,其专门用来检测多个channel是否准备完毕:可读或可写。 以上说法都正确。 I/O多路复用 我们来回顾一下是什么是I/O多路复用。 普通多线程(或进程)I/O image 每来一个进程,都...阅读全文

阅读:2003 评论:0

一探B站后台架构, 他山之石, 何以攻玉? -- 仅从一个一线Golang开发者的角度谈B站4.22代码

4月22日, B站部分后台源代码因为某愤怒的员工, 被上传至Github. 本文我们不讨论安全, 法律 (根据代码漏洞, 去恶意攻击或者获利是违法的! 我们工作时也要注意代码安全), 我仅从开发者的角度谈谈, 这份代码我们能学到什么? B站Golang生态建设, 代码规范, 工具建设, 技术栈选择, 对于Go在部门或公司的推广又有哪些值得借鉴? 首先必须得说, B站这份代码整体还是不错的, 不是说组件或者基础库多么的厉害, 而是从整体目录分布, 业务代码分布, API易用性, 业务代码风格, 工...阅读全文

2019.04.24 22:47* 七月天_5092
阅读:19179 评论:5

(转载)反应式编程在微服务下的重生

反应式编程在好几年前就已经出现了,它原理是基于反应式编****宣言。但是,由于反应式编程推广速度比较缓慢,导致很多人现在对其不是很了解。 反应式编宣言:** https://www.reactivemanifesto.org 本文将从微服务角度阐述反应式编程,在深入解读之前,先为大家简单地介绍一些反应式编程的基本概念。 反应式编程概念简化版 1. 设计思想 反应式编程的提出,是在分布式编程刚兴起不久。当时没有各种 PaaS 平台,而分布式系统中,常常出现一个节点出问题,导致整个系统瘫痪的情况。所...阅读全文

阅读:1466 评论:0

图解Golang的内存分配

## 一般程序的内存分配 在讲Golang的内存分配之前,让我们先来看看一般程序的内存分布情况: ![](https://i6448038.github.io/img/go_mem/mem.png) 以上是程序内存的逻辑分类情况。 我们再来看看一般程序的内存的真实(真实逻辑)图: ![](https://i6448038.github.io/img/go_mem/mem1.png) ## Go的内存分配核心思想 Go是内置运行时的编程语言(runti...阅读全文

2019-06-10 14:18:00 RyuGou
阅读:778 评论:0

如何快速提升 Go 程序性能?

快速提升 Go 程序性能的实用技巧,你值得了解一下。作者 | Stephen Whitworth译者 | 弯月,责编 | 屠敏出品 | CSDN(ID:CSDNnews)我对软件性能的话题十分感兴趣。虽然我说不清究竟是为什么。我忍受不了慢吞吞的服务和程序,而且似乎有此种感受的人不止我一个,比如还有Greg Linden:我们尝试过在A/B测试中,将页面的延迟增加100毫秒,结果发现如此微小的延迟也会导致整体性能的大幅下降。——亚马逊,Greg Linden根据我的经验,糟糕的性能通常来自两个方面...阅读全文

阅读:1601 评论:0

Go 回答之如何阅读 Go 源码

我的知乎回答,问题是关于如何阅读 Go 源码。地址。胡扯了些自己的想法。 Go 的源码在安装包的 src/ 目录下。怎么看它的源码呢?直接看吧!没人教的情况下,只能自己撸了。当然,这种内容一般也不会有人教。 怎么撸? Go 源码中,应该可分为与语言息息相关的部分,和官方提供的标准库。与语言实现相关的肯定是最难的,不是那么容易理解。可以先主要看标准库,其他的可以先大概了解下。 先把源码目录整体扫一遍,大概看看涉及了哪些模块,然后再挑自己喜欢的部分进行更深一步的学习与研究。建议每个目录都简单写个 h...阅读全文

2019-09-01 20:32:32 波罗学
阅读:1369 评论:0

Uber Go 风格指南(译)

博客地址:note.mogutou.xyz/articles/20… Uber Go 风格指南 译文:github.com/Allenxuxu/u… 原文:github.com/uber-go/gui… 简介 风格是指规范代码的共同约定。风格一词其实是有点用词不当的,因为共同约定的范畴远远不止 gofmt 所做的源代码格式化这些。 本指南旨在通过详尽描述 Uber 在编写 Go 代码中的注意事项(规定)来解释其中复杂之处。制定这些注意事项(规定)是为了提高代码可维护性同时也让工程师们高效的使用 ...阅读全文

2019年10月13日 惜朝_
阅读:2769 评论:1

golang面试常考问题

1.golang 1.进程模型 2.读写锁 3.syncMap 4.grpc 5.垃圾回收机制 2.mysql 1.优化案例 2.索引原理 3.docker 1.多步构建, 2.cgroup 4.k8s hpa 5.istio 6.elk 7.五种io模型 https://www.jianshu.com/p/a95bcb116765 8.如何实现分布式锁 9.channel 10.分布式算法 1.一致性hash 2.raft 3.时间轮阅读全文

阅读:1560 评论:0

Go 开发关键技术指南 | Go 面向失败编程 (内含超全知识大图)

作者 | 杨成立(忘篱) 阿里巴巴高级技术专家 关注“阿里巴巴云原生”公众号,回复 Go 即可查看清晰知识大图! 导读:从问题本身出发,不局限于 Go 语言,探讨服务器中常常遇到的问题,最后回到 Go 如何解决这些问题,为大家提供 Go 开发的关键技术指南。我们将以系列文章的形式推出《Go 开发的关键技术指南》,共有 4 篇文章,本文为第 2 篇。 Could Not Recover 在 C/C++ 中, 最苦恼的莫过于上线后发现有野指针或内存越界,导致不可能崩溃的地方崩溃; 最无语的是因为很早...阅读全文

2019-12-29 12:32:35 阿里巴巴云原生
阅读:679 评论:0

Go Runtime的调度器

以goroutine形式进行Go并发编程是一种非常方便的方法,但有没有想过他是如何有效地运行这些goroutine?下面从设计的角度,深入了解和研究Go运行时调度程序,以及如何在性能调试过程中使用它来解释Go程序的调度程序跟踪信息。 要了解为什么需要有一个运行时的调度以及它是如何工作的,先要回到操作系统的历史上,在这里将找到答案,因为如果不了解问题的根源。 操作系统的历史 1. 单用户(无操作系统) 1. 批处理 单编程 运行完成 1. 多程序 多程序的目的是使C...阅读全文

2021-06-17 07:46:16 13161658867
阅读:1344 评论:0