Paper List

这里收集一些我喜欢的 paper按照 topic 分类大概只会简单评价一下我觉得这篇文章有意思的原因而不是尝试写读后感

Congestion Control

  • Restructuring Endpoint Congestion Control (pdf) 把所有拥塞控制算法归纳为 1) 收集 signal2) 进行决策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 看来只有一个进程但可以有多个线程以利用多核 CPU2) 这一 Instance 内跑了一个用户态 kernel 用来管理网卡和调度 Instance 内的多个程序并且重写了 libc 来将所有的 syscall 重定向到这个用户态 kernel3) 做了一系列调度的优化和 NIC buffer 的优化来解决 scale 到多 Instance 过程中遇到的挑战还有一些安全方面的考虑这里就不赘述了最终测试了多个未经修改的 Linux 二进制文件真是太酷了

    一个有意思的问题是比较 Junction 和 NetKernel 的优劣它们都实现了二进制兼容并且都假设二进制文件执行在 Linux 内核上我简单思考的结论是两者的区别还是落在了容器和虚拟机的区别上Junction 更像容器只要求用户提供要执行的程序的二进制文件而 NetKernel 针对虚拟机即用户提供一个完整 kernel 的场景因此带机量上 Junction 应该能更多实际上 NetKernel 并没有针对带机量做优化直觉上 NetKernel 需要过硬件虚拟化因此更慢而 Junction 甚至因为同一 Instance 内的程序共享地址空间能省一些 context switch 时的 TLB miss并且 Junction 对应用语义了解得更全面因此能做更细粒度更高效的调度但同时也可能有 noisy neighbor 问题总之隔离力度比虚拟机方法弱一些