数据中心里的并发编程

数据中心里的并发编程

2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

数据中心:互联网 & AI 时代的幕后英雄

乌兰察布云谷:全国最低电价 + 全年 10 个月自然风冷

center

2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

数据中心程序:特点

“A network of computing and storage resources that enable the delivery of shared applications and data.” (CISCO)

以海量分布式数据 (存储) 为中心

  • 实时的 “小数据处理”
    • 内容分发、用户认证、视频直播、弹幕……
  • 离线的 “大数据处理”
    • 内容索引、数据挖掘……

我们的生活离不开数据中心应用

  • AI、搜索、社交、支付、游戏……
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

数据中心里的并发编程

Challenge: 高可靠、低延迟的多副本分布式存储和计算

  • 数据保持一致 (Consistency)、服务时刻可用 (Availability)、容忍机器离线 (Partition tolerance) 不可兼得

center

2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

数据中心里的并发编程

高吞吐 (QPS) & 低延迟的事件处理

  • 处理事件可能需要读写持久存储或请求网络上的服务
    • 延迟不确定
  • 线程维护和上下文切换都会带来开销

假设有数千/数万个请求同时到达服务器……

  • “Denial of Service, DoS”
    • 全国的小爱音箱在小米汽车发布会上同步瘫痪
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

协程:操作系统 “不感知” 的上下文切换

和线程概念相同 (独立堆栈、共享内存)

  • 但 “一直执行”,直到 yield() 主动放弃处理器
    • yield() 是函数调用
      • 只需保存/恢复 non-volatile 的寄存器
      • (线程切换需要保存/恢复全部寄存器)
    • 但 sleep (I/O) 时,所有协程都 “卡住了”
      • 失去了并行
// 只可能是 1122 或 2211
void T1() { printf("1"); printf("1"); yield(); }
void T2() { printf("2"); printf("2"); yield(); }
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

Go 和 Goroutine

小孩子才做选择,多处理器并行和轻量级并发我全都要!

  • Goroutine: 概念上是线程,实现是线程和协程的混合体

Goroutine 实现

  • 每个 CPU 上有一个 Go Worker,运行协程
  • 协程执行 blocking API (sleep, read)
    • 偷偷调用 non-blocking 的版本
    • 成功 → 立即继续执行
    • 失败 → 立即 yield 到另一个需要 CPU 的 goroutine
      • 太巧妙了!完全不浪费!
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

Go 语言中的同步与通信

Do not communicate by sharing memory; instead, share memory by communicating. ——Effective Go

共享内存 = 万恶之源

  • 信号量/条件变量:实现了同步,但没有实现 “通信”
    • 数据传递完全靠手工 (没上锁就错了)

但 UNIX 时代就有一个实现并行的机制了

  • cat *.txt | wc -l
    • 管道是一个天然的生产者/消费者!
    • 为什么不用 “管道” 实现协程/线程间的同步 + 通信呢?
      • Channels in Go
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

走向分布式计算

“Leader/follower” 架构

  • 有一个集中的 “总控” 负责调度
  • 在可靠的消息机制上实现任务分派
    • Leader 串行处理所有请求
    • 例子:哲学家吃饭时,由服务员掌管叉子

你可能会觉得,管叉子的人是性能瓶颈?

  • 一大桌人吃饭,每个人都叫服务员的感觉
  • Premature optimization is the root of all evil (D. E. Knuth)
2024 南京大学《操作系统:设计与实现》
数据中心里的并发编程

走向分布式计算 (cont'd)

抛开 workload 谈优化就是耍流氓

center

  • 吃饭的时间通常远远大于请求服务员的时间
  • 如果一个 manager 搞不定,可以分多个 (fast/slow path)
2024 南京大学《操作系统:设计与实现》