SlideShare a Scribd company logo
Golang	⾼高级讲义
xiaorui.cc	
github.com/rfyiamcool
v 0.2
menu
slice、map
runtime.scheduler
memory
gc
channel
escape analysis
netpoll
timer
sync lock
sync map
sync pool
slice
10 20 30 40 50
ptr len=2 cap=4
ptr len=3 cap=3
s2 := arr[2:]
s1 := arr[1:3] arr := [5]int{10, 20, 30, 40, 50}
• ptr
• 底层数组
• len
• 占⽤用个数
• cap
• 容量量⼤大⼩小
slice
• 函数值传递只需24字节 (array地址 + len + cap)
• append
• append会改变array的数据
• 当cap不不⾜足时,会重新make⼀一个新slice替换 ptr
• 函数传slice指针可解决ptr变更更问题
• slice 线程不不安全
map
map
hash table
hash1
hash2
…
hash x
bucket
key1
…
key8
value1
…
value8
bucket
key1
…
value8
overflow
bucket
key1
…
key8
value1
bucket
key1
…
value8
map
• map 可理理解为引⽤用
• map 内存释放问题
• go 1.10 value指针和值的性能
• map 线程不不安全
• sync.map
• segment lock map
scheduler
syscall
User Application
system call interface
SYSTEM
C Library function
User

Mode
Kernel
Mode
open()
write()
syscall
• how trap syscall
• when syscall ?
what PMG
G1 P1
goroutine
m1
thread runQ
schedulerG1
m0
P1
G
G G
G2 m1
P2 G
G
G
p link m only at the same time
p count affect parallel
more P
ext runtime struct
全局M列列表 runtime.allm 存放所有M的列列表
全局P列列表 runtime.allp 存放所有P的列列表
全局G列列表 runtime.allg 存放所有G的列列表
调度器器空闲M列列表 runtime.sched.midle 存放空闲M的列列表
调度器器空闲P列列表 runtime.sched.pidle 存放空闲P的列列表
调度器器可运⾏行行G队列列 runtime.shced.runq 存放可运⾏行行的G队列列
P可运⾏行行的G队列列 runq 存放当前P中可运⾏行行G
… … …
when to scheduler
channel
garbage collection
blocking syscall like file or network IO
time.Sleep
more
P status
• Pgcstop
• 正在进⾏行行垃圾回收
• Pidle
• 没有跟M关联
• Prunning
• 跟M关联
• Psyscall
• 系统调⽤用
• Pdead
• 减少 GOMAXPROCS
M status
• ⾃自旋中(spinning)
• M正在从运⾏行行队列列获取G, 这时候M会拥有⼀一个P
• 执⾏行行go代码中
• M正在执⾏行行go代码, 这时候M会拥有⼀一个P

• 执⾏行行原⽣生代码中
• M正在执⾏行行原⽣生代码或者阻塞的syscall, 这时M并不不拥有P

• 休眠中
• M发现⽆无待运⾏行行的G时会进⼊入休眠, 并添加到空闲M链表中, 这时M并不不拥有P

Goroutine status
goroutine视⻆角
go, 产⽣生新的g, 放到本地队列列或全局队列列
gopark, g置为waiting状态, 等待显示goready唤醒, 在poller中⽤用得较多
goready, g置为runnable状态, 放⼊入全局队列列
gosched, g显示调⽤用runtime.Gosched让出资源, 置为runnable状态, 放
⼊入全局队列列
goexit, g执⾏行行完退出, g所属m切换到g0栈, 重新进⼊入schedule
g陷⼊入syscall:
net io和部分file io, 没有事件则gopark;
普通的阻塞系统调⽤用返回时,m重新进⼊入schedule
work stealing
G
G G
G G G G G
G G G
P P P
M M M
G
go func()
G
find G
go work stealing
1. pop from local runq
2. pop from global runq
3. pop from netpoller
4. pop from other p’ runq
抢占
G G G G
P P
sysmon
if block ?
M M
G
M
syscall
block
• prunning
• pmg long time
• psyscall
• syscall long time
sysmon
1. netpoll(获取fd事件)
2. retake(抢占)
3. forcegc(按时间强制执⾏gc)
4. scavenge heap(释放⾃由列表中多余的项
减少内存占⽤)
5. more
循环调⽤用存在于整个⽣生命周期
min = 20us; max = 10ms
多功能
sysmon !
unlink m & g case
G1 m0
P G
G
G1
Epoll Event
G
network io
1. network io syscall
2. unlink m & g
3. m pop from runq
4. m run g context
unlink p&m case
G1 m0
P G
G
G1
m1
syscall
G
disk io
1. disk io syscall
2. ulink p & m
3. wakep or newM
4. link p & m
memory
memory
• 基于tcmalloc构建的多级内存池
• mcache: per-P cache,可以认为是 local cache。
• mcentral: 全局 cache,mcache 不不够⽤用的时候向 mcentral 申请。
• mheap: 当 mcentral 也不不够⽤用的时候,通过 mheap 向操作系统申请。
• mspan: 内存分配的基本单位
memory
• mspan 默认 8k 起
• spans 512M
• bitmap 16G
• arena 512G
memory
free[128]
spans
bitmap
…
arena_start
arena_used
arena_end
central[67]
Mheap
mcentral 全局67个
lock
sizeclass
…
tiny
tinyoffset
local_nsmallfree
local_nlargefree
alloc[67]
mcache; 跟P数⽬目相等
next
prev
startAddr
sizeclass
freelist
spans bitmap arena
mspan
系统虚拟地址空间
memory
// class bytes/obj bytes/span
…
// 2 16 8192
// 3 32 8192
// 4 48 8192
// 5 64 8192
…
// 23 448 8192
…
// 43 4096 8192
…
// 64 27264 81920
// 65 28672 57344
// 66 32768 32768
tiny
tinyoffset
alloc[67]
next
prev
sizeclass
startAddr
freelist
next
prev
sizeclass
startAddr
freelist
alloc = [67]sizeclass
每⾏行行的sizeclass包含
⼀一个mspan链表
mcache
mspan
…
4k 4k
if malloc 30 byte ;
alloc memory rule
• 如果object size>32KB, 则直接使⽤用mheap来分配空间;
• 如果object size<16Byte, 则通过mcache的tiny分配器器来分配;
• 如果16Byte < object size < 32KB,⾸首先尝试通过sizeclass对应的分配器器分
配;
• 如果mcache没有空闲的span, 则向mcentral申请空闲块;
• 如果mcentral也没空闲块,则向mheap申请并进⾏行行切分;
• 如果mheap也没合适的span,则向系统申请新的内存空间。
object relase rule
• 如果object size>32KB, 直接将span返还给mheap的⾃自由链;
• 如果object size<32KB, 查找object对应sizeclass, 归还到mcache⾃自由
链;
• 如果mcache⾃自由链过⻓长或内存过⼤大,将部分span归还到mcentral;
• 如果某个范围的mspan都已经归还到mcentral,则将这部分mspan归还
到mheap⻚页堆;
• ⽽而mheap会定时将释放的内存归还到系统;
gc
desc gc
Golang 采⽤用了了标记清除的GC算法
Golang的标记清除是⼀一个三⾊色标记法的实现,对于三⾊色标记法,"三⾊色"的概
念可以简单的理理解为:
⽩白⾊色:还没有搜索过的对象(⽩白⾊色对象会被当成垃圾对象)
灰⾊色:正在搜索的对象
⿊黑⾊色:搜索完成的对象(不不会当成垃圾对象,不不会被GC)
when trigger gc
• gcTriggerHeap
• 当前分配的内存达到⼀一定值就触发GC
• default GCGO=100
• gcTriggerTime
• 当⼀一定时间没有执⾏行行过GC就触发GC
• two minutes
• gcTriggerCycle
• 要求启动新⼀一轮的GC, 已启动则跳过, ⼿手动触发GC的runtime.GC()会使⽤用这个条件
• gcTriggerAlways
• 强制触发GC
gc process
1. ⾸首先创建三个集合:⽩白、灰、⿊黑。
2. 将所有对象放⼊入⽩白⾊色集合中。
3. 然后从根节点开始遍历所有对象,把可追溯的对象从⽩白⾊色集合放⼊入灰⾊色集合。
4. 之后遍历灰⾊色集合,将灰⾊色对象引⽤用的对象从⽩白⾊色集合放⼊入灰⾊色集合,之后将此灰
⾊色对象放⼊入⿊黑⾊色集合。
5. 重复4直到灰⾊色中⽆无任何对象。
6. 通过写屏障检测对象有变化,重复以上操作。
7. 回收所有⽩白⾊色对象
GC 扫描标记
GC 清除
GC 重置
forcegc & return os
Sysmon 会强制两分钟进⾏行行⼀一次 GC
每5分钟会释放⼀一些span, 归还操作系统
map的释放情况
⼤大量量的使⽤用big map下会出现对象被清楚,但释放不不⼲干净 !
map = nil
debug.FreeOSMemory()
channel的释放情况
Channel被清空后,⼤大约10分钟释放内存 .
debug.FreeOSMemory()
元素被gc清除后,什什么时候释放内存归还 OS ?
编码说 5分钟, 但事实不不是这样…
⼿手动触发 FreeOSMemory() 会更更好的释放 !
debug
GODEBUG=gctrace=1
func printMem() {
runtime.ReadMemStats(&mem)
log.Println("mem.Sys: ", mem.Sys/1024/1024)
log.Println("mem.Alloc: ", mem.Alloc/1024/1024)
log.Println("mem.TotalAlloc: ", mem.TotalAlloc/1024/
log.Println("mem.HeapAlloc: ", mem.HeapAlloc/1024
log.Println("mem.HeapSys: ", mem.HeapSys/1024/1
log.Println("mem.HeapObjects: ", mem.HeapObjects
}
keyword
写屏障 ?
并发GC ?
heap 内存什什么时候归还系统?
golang1.9 gc的改进 ?
stack
stack
逃逸分析
Stack Heap
逃逸分析
产⽣生引⽤用, 直接堆逃逸
逃逸分析
fmt引起的对象堆逃逸...
逃逸分析
所以;
不不要肯定的认为 某个 对象在heap or stack上 .
• 分析汇编
• go tool compile -S xxx.go
• 对象分布分析
• go tool compile -m xxx.go
netpoller
func (fd *FD) Read() -->
func (pd *pollDesc) wait -->
func poll_runtime_pollWait -->
func netpollblock()
阻塞中 …
netpoller
sysmon
唤醒中 …
go timer
timer.After
timer.NewTimer timer.Tick
go timer
小顶堆
sync.pool
obj
obj
obj
objP
P
obj
obj
obj
obj
GC
sync.pool
• 使⽤用slice做缓冲对象存储
• mutex 保护 shared slice
• shared会被偷⾛走, private 留留个本
sync.map
sync.map
sync.Mutex
G
G
G
G
G1
G2
sema waiting queue
• cas
• 适当减少syscall
• 通过runtime调度唤醒
sync.Mutex
G
G
G
G
G1
G2
sema waiting queue
• atomic.CompareAndSwap
• 适当减少syscall
• 通过runtime调度唤醒
• 双检查锁机制
• 使⽤用互斥量量保护wait queue
sync.Mutex
Mutex也不不廉价
sync.Mutex
• sync.Mutex 锁性能不不是问题
• noDeferLock 轻易易⼲干到 5000w/s
• DeferLock 也可以到 1700w/s
• 锁竞争才是最⼤大问题
open 10个Goroutine
思考 ?
• 为什什么已经有cas指令,还在syscall futex ?
• golang 底层都谁在调⽤用futex锁 ?
• 是否可以适当规避futex的使⽤用 ?
channel设计
buf
sendx
recvx
lock
sendq
recvq
closed
circular queue
send index
receive index
mutex
Hchan
2 1 0
ch := make(chan Task, 3)
1
0
Heap
alloc an hchan on the heap
wait send q
wait recv q
g
elem
…
g1
task
sudog
send full channel?
G1
calls into the scheduler
set G1 to waiting
unlink G1, M
ch <- task, but chan is full
G1
M
P
G2 runnable
G1
waiting
schedule a runnable G
from the P runqueue
runQ
is block, so gopark()
resuming goroutines
G2
calls into the scheduler
set G1 to runnable
puts it on runqueue
task := <- chan, then sender can run G2
M
P
G1
runnable
return to G2
runQ
goready(G1)
G0
current G
direct write
G4 Stack
G3 Stack
stack
Heap
G3直接把数据copy给G4 sudog⾥里里elem地址!
tools
go tool pprof
go tool trace
go-torch
go test -bench=. -benchmem …
link
https://github.com/qyuhen
https://www.youtube.com/watch?v=C1EtfDnsdDs
https://github.com/golang/go/tree/master/src
https://github.com/golang/go/issues
“Q & A”
–rfyiamcool

More Related Content

What's hot

Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
琛琳 饶
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
MongoDB
 
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The HoodLarge-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Lei (Harry) Zhang
 
淘宝主备数据库自动切换
淘宝主备数据库自动切换淘宝主备数据库自动切换
淘宝主备数据库自动切换
mysqlops
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)ykdsg
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
Renaun Erickson
 
Apache trafficserver
Apache trafficserverApache trafficserver
Apache trafficserverDin Dindin
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang Li
Ceph Community
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
rewinx
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
Yang Guanjun
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Ceph Community
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术团队
 
Traffic server overview
Traffic server overviewTraffic server overview
Traffic server overview
qianshi
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
Alex Lau
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0
jinqing zhu
 
Ceph perf-tunning
Ceph perf-tunningCeph perf-tunning
Ceph perf-tunning
Yang Guanjun
 
Lamp优化实践
Lamp优化实践Lamp优化实践
Lamp优化实践zhliji2
 
Ceph monitor-op
Ceph monitor-opCeph monitor-op
Ceph monitor-op
Yang Guanjun
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
國昭 張
 

What's hot (20)

Monitor is all for ops
Monitor is all for opsMonitor is all for ops
Monitor is all for ops
 
MongoDB at Qihoo 360
MongoDB at Qihoo 360MongoDB at Qihoo 360
MongoDB at Qihoo 360
 
Large-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The HoodLarge-Scale Cluster Mangement & Kubernetes Under The Hood
Large-Scale Cluster Mangement & Kubernetes Under The Hood
 
淘宝主备数据库自动切换
淘宝主备数据库自动切换淘宝主备数据库自动切换
淘宝主备数据库自动切换
 
Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)Java线上应用问题排查方法和工具(空望)
Java线上应用问题排查方法和工具(空望)
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
Apache trafficserver
Apache trafficserverApache trafficserver
Apache trafficserver
 
Design realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang LiDesign realization and application of RBD NBD - Wang Li
Design realization and application of RBD NBD - Wang Li
 
高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践高性能Web服务器Nginx及相关新技术的应用实践
高性能Web服务器Nginx及相关新技术的应用实践
 
Cephfs架构解读和测试分析
Cephfs架构解读和测试分析Cephfs架构解读和测试分析
Cephfs架构解读和测试分析
 
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao ZhangBuilding the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
Building the Production Ready EB level Storage Product from Ceph - Dongmao Zhang
 
美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践美团点评技术沙龙010-Redis Cluster运维实践
美团点评技术沙龙010-Redis Cluster运维实践
 
Traffic server overview
Traffic server overviewTraffic server overview
Traffic server overview
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
 
主库自动切换 V2.0
主库自动切换 V2.0主库自动切换 V2.0
主库自动切换 V2.0
 
Ceph perf-tunning
Ceph perf-tunningCeph perf-tunning
Ceph perf-tunning
 
Lamp优化实践
Lamp优化实践Lamp优化实践
Lamp优化实践
 
Ceph monitor-op
Ceph monitor-opCeph monitor-op
Ceph monitor-op
 
Docker進階探討
Docker進階探討Docker進階探討
Docker進階探討
 
Windbg入门
Windbg入门Windbg入门
Windbg入门
 

Similar to Golang advance

Java GC Tuning
Java GC TuningJava GC Tuning
Java GC Tuning
pprun
 
Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc锐 张
 
JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
zhongbing liu
 
Sun jdk 1.6 gc
Sun jdk 1.6 gcSun jdk 1.6 gc
Sun jdk 1.6 gc
bluedavy lin
 
Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄锐 张
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇bluedavy lin
 
Heap exploitation
Heap exploitationHeap exploitation
Heap exploitation
Angel Boy
 
Rootkit 101
Rootkit 101Rootkit 101
Rootkit 101
WEI CHIEH CHAO
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOpenSourceCamp
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理yin gong
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理yin gong
 
快快樂樂SIMD
快快樂樂SIMD快快樂樂SIMD
快快樂樂SIMD
Wei-Ta Wang
 
实战HotSpot JVM GC
实战HotSpot JVM GC实战HotSpot JVM GC
实战HotSpot JVM GC
digitalsonic
 
Jvm memory
Jvm memoryJvm memory
Jvm memorybenewu
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt锐 张
 
C++工程实践
C++工程实践C++工程实践
C++工程实践Shuo Chen
 
Tokyo系列介绍(一)
Tokyo系列介绍(一)Tokyo系列介绍(一)
Tokyo系列介绍(一)jiandong yang
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
Kito Cheng
 

Similar to Golang advance (20)

Java GC Tuning
Java GC TuningJava GC Tuning
Java GC Tuning
 
Sun jdk-1.6-gc
Sun jdk-1.6-gcSun jdk-1.6-gc
Sun jdk-1.6-gc
 
JVM及其调优
JVM及其调优JVM及其调优
JVM及其调优
 
Sun jdk 1.6 gc
Sun jdk 1.6 gcSun jdk 1.6 gc
Sun jdk 1.6 gc
 
Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄Sun jdk 1.6内存管理 -使用篇-毕玄
Sun jdk 1.6内存管理 -使用篇-毕玄
 
Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇Sun jdk 1.6内存管理 -使用篇
Sun jdk 1.6内存管理 -使用篇
 
Heap exploitation
Heap exploitationHeap exploitation
Heap exploitation
 
Rootkit 101
Rootkit 101Rootkit 101
Rootkit 101
 
Osc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresqlOsc scott linux下的数据库优化for_postgresql
Osc scott linux下的数据库优化for_postgresql
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理
 
Java垃圾收集原理
Java垃圾收集原理Java垃圾收集原理
Java垃圾收集原理
 
快快樂樂SIMD
快快樂樂SIMD快快樂樂SIMD
快快樂樂SIMD
 
实战HotSpot JVM GC
实战HotSpot JVM GC实战HotSpot JVM GC
实战HotSpot JVM GC
 
Jvm memory
Jvm memoryJvm memory
Jvm memory
 
服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt服务器端性能优化 提升Qps、rt
服务器端性能优化 提升Qps、rt
 
ch7-pv1-modules
ch7-pv1-modulesch7-pv1-modules
ch7-pv1-modules
 
C++工程实践
C++工程实践C++工程实践
C++工程实践
 
Tokyo系列介绍(一)
Tokyo系列介绍(一)Tokyo系列介绍(一)
Tokyo系列介绍(一)
 
Jvm内存管理基础
Jvm内存管理基础Jvm内存管理基础
Jvm内存管理基础
 
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽COSCUP 2014 : open source compiler 戰國時代的軍備競賽
COSCUP 2014 : open source compiler 戰國時代的軍備競賽
 

More from rfyiamcool

Redis cluster那些事儿
Redis cluster那些事儿Redis cluster那些事儿
Redis cluster那些事儿
rfyiamcool
 
python高级内存管理
python高级内存管理python高级内存管理
python高级内存管理
rfyiamcool
 
Micro service
Micro serviceMicro service
Micro service
rfyiamcool
 
分析mysql acid 设计实现
分析mysql acid 设计实现分析mysql acid 设计实现
分析mysql acid 设计实现
rfyiamcool
 
Raft
Raft Raft
Raft
rfyiamcool
 
cdn的那些事儿
cdn的那些事儿cdn的那些事儿
cdn的那些事儿
rfyiamcool
 
大话redis设计实现
大话redis设计实现大话redis设计实现
大话redis设计实现
rfyiamcool
 
python gil
python gilpython gil
python gil
rfyiamcool
 
async io frame
async io frameasync io frame
async io frame
rfyiamcool
 
异步io框架的实现
异步io框架的实现异步io框架的实现
异步io框架的实现
rfyiamcool
 
美妙的多进程管理
美妙的多进程管理美妙的多进程管理
美妙的多进程管理
rfyiamcool
 

More from rfyiamcool (11)

Redis cluster那些事儿
Redis cluster那些事儿Redis cluster那些事儿
Redis cluster那些事儿
 
python高级内存管理
python高级内存管理python高级内存管理
python高级内存管理
 
Micro service
Micro serviceMicro service
Micro service
 
分析mysql acid 设计实现
分析mysql acid 设计实现分析mysql acid 设计实现
分析mysql acid 设计实现
 
Raft
Raft Raft
Raft
 
cdn的那些事儿
cdn的那些事儿cdn的那些事儿
cdn的那些事儿
 
大话redis设计实现
大话redis设计实现大话redis设计实现
大话redis设计实现
 
python gil
python gilpython gil
python gil
 
async io frame
async io frameasync io frame
async io frame
 
异步io框架的实现
异步io框架的实现异步io框架的实现
异步io框架的实现
 
美妙的多进程管理
美妙的多进程管理美妙的多进程管理
美妙的多进程管理
 

Golang advance