摘要: 为什么需要内存分配器? 总说周知,内存作为一种相对稀缺的资源,在操作系统中以虚拟内存的形式来作为一种内存抽象提供给进程,这里可以简单地把它看做一个连续的地址集合{0, 1, 2, ..., M},由栈空间、堆空间、代码片、数据片等地址空间段组合而成,如下图所示(出自CS:APP3e, Bryant 阅读全文
posted @ 2021-06-15 19:03 erenming 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 最近做了许多有关Go内存优化的工作,总结了一些定位、调优方面的套路和经验,于是,想通过这篇文章与大家分享讨论。 发现问题 性能优化领域有一条总所周知的铁律,即:不要过早地优化。编写一个程序,首先应该保证其功能的正确性,以及诸如设计是否合理、需求等是否满足,过早地优化只会引入不必要的复杂度以及设计不合 阅读全文
posted @ 2021-01-09 22:47 erenming 阅读(2048) 评论(0) 推荐(0) 编辑
摘要: 第10章-批处理 系统分类: 服务(在线系统):服务等待客户端的请求或指令到达。会尽快地返回结果 批处理系统(离线系统):拥有大量的输入数据,通过跑一个job来处理它,并生成输出数据 流处理系统(near-real-time system):stream job operates on events 阅读全文
posted @ 2020-11-22 15:47 erenming 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 分布式数据,replication and partition Replication: keeping a copy of the same data on sevral differrent nodes, or in different locations Partition: splittio 阅读全文
posted @ 2020-09-06 22:59 erenming 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 第一章 可靠性 针对系统的容错设计,提高系统错误的抛出率,而不是忽略它(除了安全这种不可恢复类型的),尽量避免failure 硬件错误 硬件自身容许设计 软件系统的灵活性与弹性。即容许整台机器异常,而不影响系统 软件错误 影响范围大,连锁反应,排查难。bug,依赖服务错误等 避免:考虑全面,全面测试 阅读全文
posted @ 2020-08-30 13:47 erenming 阅读(282) 评论(0) 推荐(0) 编辑
摘要: 问题的发现 周五,本是一个风清气爽,令人愉悦的日子。我本还在美滋滋地等待着下班,然而天有不测,有用户反应容器日志看不到了,根据经验我知道,日志采集&收集链路上很可能又发生了阻塞。 登录目标容器所在机器找到日志采集容器,并娴熟地敲下docker logs --tail 200 -f <containe 阅读全文
posted @ 2020-08-02 13:09 erenming 阅读(400) 评论(0) 推荐(0) 编辑
摘要: 问题的发现 前段时间,我们一个基于libbeat开发的日志采集服务经常发生OOM的告警,OOM的排查大都比较简单,直接查看目标容器的内存变化情况即可。如图所示 从上图可以看出,内存随着时间呈线增长的趋势,然后在到达阈值之后瞬间降为0,实际上就是OOM了。 相信稍微有点经验的同学,应该都能大致断定这是 阅读全文
posted @ 2020-06-27 15:58 erenming 阅读(1203) 评论(0) 推荐(0) 编辑
摘要: 总所周知,大多数语言中,字典的底层是哈希表,而且其算法也是十分清晰的。无论采用链表法还是开放寻址法,我们都能实现一个简单的哈希表结构。对于Go来说,它是具体如何实现哈希表的呢?以及,采取了哪些优化策略呢? 内存模型 map在内存的总体结构如下图所示。 头部结构体 即为map编译后的内存表示,这里需要 阅读全文
posted @ 2020-03-25 11:26 erenming 阅读(386) 评论(0) 推荐(0) 编辑
摘要: 最近闲来无事,深入研究了slice在Golang中的实现并简要阅读了其相关的底层实现代码后,对于实际工作中的一些slice相关代码的写法与Bug有了一种豁然开朗的感觉。故记录下来,与君分享。 数组 vs 切片 对于初学者来说,我们必须分清楚数组与切片的区别。 在Go中,数组与其他语言并无太大区别,都 阅读全文
posted @ 2020-02-15 17:32 erenming 阅读(171) 评论(0) 推荐(0) 编辑
摘要: 在编写web应用中,我们常常会遇到这样的需求,比如,我们需要上报每个API的运行时间到运维监控系统。这时候你可以像下述代码一样将统计的逻辑写到每个路由函数中。 然而,这显然有悖 原则,我们需要将这些非业务逻辑剥离出来以实现解耦。这时候,中间件就能派上用场了,为了简单起见,我们这里将采用标准库 来实现 阅读全文
posted @ 2019-12-21 19:53 erenming 阅读(661) 评论(0) 推荐(0) 编辑