这里收集一些我喜欢的 paper
Congestion Control
- Restructuring Endpoint Congestion Control (pdf) 把所有拥塞控制算法归纳为 1) 收集 signal
2) 进行决策, 3) 修改发送速率的统一 workflow, 并尝试实现拥塞控制算法的 write-once, run anywhere, 目标和方法看起来都非常美好。 实现方式上我感觉硬拉到用户态进程去做有点没必要, 以及 congeston signal cover 的还是不够全。 例如 swift 要求的细粒度 RTT, 不过 CCP 的框架结构定义得很好, 扩展 signal 应该比较容易, 。 - Towards provably performant congestion control (pdf) 尝试用一个带若干参数的网络模型描述网络的行为
然后将拥塞控制算法描述为, 缩小网络模型的参数空间“ ” 很有意思的思考角度, 并且做出了一个综合系统。 通过网络模型的 spec 生成帕累托最优的拥塞控制算法, 还没仔细读。 不知道效果如何, 但听起来就很 promising, 感觉主要的限制。 如果有( 应该是网络模型不够真实) 但我很喜欢这个方法论, 。 - Toward Formally Verifying Congestion Control Behavior (pdf) 挖坑
上面的文章引用的。 应该有一部分 insight 来自这里, 。
Host Congestion
- Host Congestion Control (pdf) 将主板上的总线也看作一个网络
并且用拥塞控制的视角来看待总线带宽利用不足的问题, 指出了非常 insightful 的理解与解决主机拥塞的方向, 这篇文章指出 IIO buffer 占用是主机拥塞的一个拥塞信号。 并且可以简单地通过 ECN 控制网络应用发送速率, 或者通过 memory backpressure 控制其他, 非网络( 应用的访存速率) 这个框架看起来比较初步。 并且只在简单的 workload 下测试, 但可以进一步扩展其他的拥塞信号和控制手段, 看起来方向非常 promising, 。 - Understanding the Host Network (pdf) 同一个组的工作
对主机网络, 主板上的总线构成的网络( 进行更细粒度的建模) 并且发现了两种全新的主机拥塞模式, 有意思的是。 某种意义上他们先, 解决“ 了问题” 再, 理解“ 了问题” 。
Network OS
NetKernel: Making Network Stack Part of the Virtualized Infrastructure (pdf) 通过 patch guest OS 来将 socket 调用传给 host
并通过 host 上另外的 kernel-bypass network stack, 例如 mTCP( 来处理这些调用) 提升性能, 这个劫持的位置很好。 不用修改上层应用, 。 Demikernel (pdf) 这篇文章指出 kernel-bypass I/O 库的现状缺少很多操作系统该做的事情
提供统一接口( 提供应用间调度手段, ) 因此需要一个 kernel-bypass OS 来解决 kernel-bypass I/O 库, 如 DPDK/SPDK( 的几个痛点) 1) I/O 代码与设备强绑定: 难以用统一接口操作异构设备, 2) 没有易用的 zero-copy 接口和 3) 没有提供合理的调度手段, 如 DPDK 要求应用独占内核, 感觉干的事很重要。 但是迁移已有应用的开销有点大, 因为整个 I/O 接口都变了, 需要重写应用, 。 Making Kernel Bypass Practical for the Cloud with Junction (pdf) 扎实到恐怖的工作
无论是解决的问题还是解决的方法都是顶级, 目标是支持单机起 4000 个未修改的 Linux 二进制应用而不带来性能下降。 另有一篇 arXiv (pdf) 基于 Junction 实现 containerd 的原位替代, 这篇文章最震撼我的部分就是它无需修改二进制文件。 让我相信他能得到部署, 方法是。 1) 普通容器技术中多个进程在主机看来也是多个进程并且与主机共享 kernel: 而 Junction 做了一个 loader, 将同一个 Instance, 类似于一个容器( 的所有程序加载到同一地址空间内) 每个 Instance 在 Host 看来只有一个进程, 但可以有多个线程( 以利用多核 CPU, ) 2) 这一 Instance 内跑了一个用户态 kernel 用来管理网卡和调度 Instance 内的多个程序; 并且重写了 libc 来将所有的 syscall 重定向到这个用户态 kernel, 3) 做了一系列调度的优化和 NIC buffer 的优化来解决 scale 到多 Instance 过程中遇到的挑战; 还有一些安全方面的考虑。 这里就不赘述了, 最终测试了多个未经修改的 Linux 二进制文件。 真是太酷了, ! 一个有意思的问题是比较 Junction 和 NetKernel 的优劣
它们都实现了二进制兼容。 并且都假设二进制文件执行在 Linux 内核上, 我简单思考的结论是。 两者的区别还是落在了容器和虚拟机的区别上, Junction 更像容器。 只要求用户提供要执行的程序的二进制文件, 而 NetKernel 针对虚拟机, 即用户提供一个完整 kernel 的场景, 因此带机量上 Junction 应该能更多, 实际上 NetKernel 并没有针对带机量做优化( ) 直觉上 NetKernel 需要过硬件虚拟化因此更慢。 而 Junction 甚至因为同一 Instance 内的程序共享地址空间能省一些 context switch 时的 TLB miss, 并且 Junction 对应用语义了解得更全面。 因此能做更细粒度, 更高效的调度、 但同时也可能有 noisy neighbor 问题。 总之隔离力度比虚拟机方法弱一些? 。