摘要:
Golang - 分段锁实现并发安全Map 一.引言 我们一般有两种方式来降低锁的竞争: 第一种:减少锁的持有时间,sync.Map即是采用这种策略,通过冗余的数据结构,使得需要持有锁的时间,大大减少。 第二种:降低锁的请求频率,锁分解和锁分段技术即是这种思想的体现。 锁分段技术又可称为分段锁机制 阅读全文
摘要:
Golang - sync.map 设计思想和底层源码分析 一.引言 在Go v1.6之前,内置map是部分goroutine安全的,并发读没有问题,并发写可能有问题 在Go v1.6之后,并发读写内置map会报错,在一些知名的开源库都有这个问题,所以在Go v1.9之前,解决方案是加一个额外的大锁 阅读全文
摘要:
Golang - Map 内部实现原理解析 一.前言 Golang中Map存储的是kv键值对,采用哈希表作为底层实现,用拉链法解决hash冲突 本文Go版本:gov1.14.4,源码位于src/runtime/map.go 二.Map的内存模型 在源码中,表示map的结构体是hmap,是hashma 阅读全文
摘要:
Golang - slice 内部实现原理解析 一.Go中的数组和slice的关系 1.数组 在几乎所有的计算机语言中,数组的实现都是一段连续的内存空间,Go语言数组的实现也是如此,但是Go语言中的数组和C语言中数组还是有所不同的 C语言数组变量是指向数组第一个元素的指针 Go语言的数组是一个值,一 阅读全文
摘要:
#Golang-Context扫盲与原理解析 一.什么是Context? context是一个包,是Go1.7引入的标注库,中文译做上下文,准确的说是goroutine的上下文,包含goroutine的运行状态,环境,现场等信息。 context主要用于在goroutine之间传递上下文信息,比如取 阅读全文
摘要:
无限缓存channel的设计与实现 一.引言 Go语言的Channel有两种类型,一种是无缓存的channle,一个种是有缓存的channel,但是对于有缓存的channle来说,其缓存长度在创建时就已经固定了,中间也不能扩缩容,这导致对某些特定的业务场景来说不太方便 业务场景如下 : 爬虫场景,想 阅读全文
摘要:
如何优雅的关闭channel? channel关闭原则 "如何优雅的关闭channel?",这种问题经常在面试题中出现,究其原因,是因为channel创建容易,但是关闭"不易",原因有以下三点: 关闭时机未知,在不改变channel自身状态的条件下,无法知道他是否已经关闭 不能无脑关闭,如果一个ch 阅读全文
摘要:
Golang-channel底层实现精要 一.channel 背景知识 channel是Go语言内置的核心类型,可以将其看做一个管道,channel和goroutine一起为go并发编程提供了最优雅和便利的方案 在Go中有一句经典名言,永远不要通过共享内存来通信,而是要通过通信来共享内存,chann 阅读全文
摘要:
Golang调度器原理解析 本文主要介绍调度器的由来以及golang调度器为何要如此设计,以及GPM模型解析 一.调度器的由来 1.单进程时代 单进程时代不需要调度器,一切程序都是串行,所以单进程的操作系统会面临这样一个问题: 程序只能串行执行,一个进程阻塞了,其他进程啥事也做不了,只能等待,会造成 阅读全文
摘要:
go并发编程 一.背景知识介绍 1.进程和线程 进程是程序在操作系统中一次执行的过程,系统进行资源分配和调度的基本单位 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位 一个进程可以创建和撤销多个线程,同一个进程中的多个线程之间可以并发执行 2.并发和并行 阅读全文
摘要:
go 垃圾回收 本文基于整个go的gc发展,来研究其gc的演变过程,不单针对某个版本的gc,因为go的gc一直在演变 一.GO GC的发展历史 go v1.1 : 标记清除法,整个过程都需要STW go v1.3 : 标记清除法,标记过程仍然需要STW,但是清除过程并行化,gc pause约为几百m 阅读全文
摘要:
Go内存分配-原理解析 一. 背景介绍 先了解一下Linux系统内存相关的背景知识,有助于我们了解Go的内存分配 1.覆盖技术 在上古时代的内存管理中,如果程序太大,超过了空闲内存容量,就无法把全部程序装入内存中,这个时候诞生出了一种解决方案,即覆盖技术, 简而言之,就是把程序分为若干个块,只把哪些 阅读全文
摘要:
一致性Hash算法原理解析 一.引言 我们先来大致了解一下这个算法可以解决什么问题 背景问题:有N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均发到每台服务器上,每台服务器负载1/N的服务 1. 硬Hash映射 将每台服务器结点进行编号,0到N-1,Key%N就是映射到的服务器结点编号 阅读全文
摘要:
Mysql 常见面试题 1.索引 1.什么是索引? 索引是对数据库中一个或者多个值进行排序的数据结构,以便实现快速查询 2.Mysql索引是如何实现的? mysql索引使用的是B+树,主要是查询效率高,时间复杂度是O(log N),可以充分利用磁盘预读的特性,树可以有多个孩子节点,并且树深度很小,叶 阅读全文
摘要:
Docker 技术原理浅析 1.简介 简单介绍Docker使用的核心技术 利用Linux的Namespace功能,实现资源的隔离 利用Linux的cgroups功能,实现资源的限制 利用AUFS栈式叠加的文件系统(联合挂载),实现docker的分层结构和增量更新等能力 以下一切都基于操作系统资源分配 阅读全文
摘要:
k8s最佳实践:业务丢包问题排查 一.问题描述 有用户反馈大量图片加载不出来。 图片下载走的 k8s ingress,这个 ingress 路径对应后端 service 是一个代理静态图片文件的 nginx deployment,这个 deployment 只有一个副本,静态文件存储在 nfs 上, 阅读全文
摘要:
k8s最佳实践:cgroup kmem的内存泄露问题 1.前言 这篇文章的全称应该叫:[在某些内核版本上,cgroup 的 kmem account 特性有内存泄露问题],如果你遇到过 pod 的 "cannot allocated memory"报错,node 内核日志的“SLUB: Unable 阅读全文
摘要:
k8s 最佳实践:处理内存碎片化 内存碎片化造成的危害 节点的内存碎片化严重,导致docker运行容器时,无法分到大的内存块,导致start docker失败。最终导致服务更新时,状态一直都是启动中 在长时间运行的Linux操作系统中,系统日志有时会出现无法分配高阶内存的报错信息: Aug 4 22 阅读全文
摘要:
K8S部分业务POD内存持续泄露问题 1.前言 线上K8S集群有极少量的PHP业务,它们的POD内存持续走高直到OOM,相信与特殊代码场景有关,需要展开分析。 我从POD的内存监控原理入手,分析到底内存用到了哪些地方。 2.分析过程 第一步:分析pod的内存限制原理 容器化依赖Cgroup限制内存资 阅读全文
摘要:
Kubernetes 最佳实践:解决长连接服务扩容失效 1.问题背景 在现网运营中,有很多场景为了提高效率,一般都采用建立长连接的方式来请求。我们发现在客户端以长连接请求服务端的场景下,K8S的自动扩容会失效。 原因是客户端长连接一直保留在老的Pod容器中,新扩容的Pod没有新的连接过来,导致K8S 阅读全文
摘要:
Mysql锁机制及原理简析 一.前言 1.什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制。 锁保证数据并发访问的一致性、有效性; 锁冲突也是影响数据库并发访问性能的一个重要因素。 锁是Mysql在服务器层和存储引擎层的的并发控制 2.为什么要加锁? 数据库是一个多用户使用的共享资源。 阅读全文
摘要:
HTTP常见面试题 一.HTTP基本知识 1.HTTP 常见的状态码,有哪些? 「200 OK」是最常见的成功状态码,表示一切正常。如果是非 HEAD 请求,服务器返回的响应头都会有 body 数据。 「204 No Content」也是常见的成功状态码,与 200 OK 基本相同,但响应头没有 b 阅读全文
摘要:
SSL协议工作原理 在现代,A和B之间要进行安全,省心的网络通信,需要经过以下几个步骤 通过CA体系交换public key 通过非对称加密算法,交换用于对称加密的密钥 通过对称加密算法,加密正常的网络通信 在实际中,非对称加密只会用来传递一条信息,那就是用于对称加密的密钥。当用于对称加密的密钥确定 阅读全文