rust实现一个mysql驱动_使用Rust编写用户态驱动程序

概览

在云计算技术的发展史上,如何提高单个服务器的并发度,一直是热门的研究课题。在20年前,就有著名的“C10K”问题,即如何利用单个服务器每秒应对10K个客户端的同时访问。这么多年大量的实践证明,异步处理和基于事件(即epoll,kqueue和iocp)的响应方式成为处理这类问题的事实上标准方法。

不过,人类的追求是永无至今的。15年后,当摩尔定律在硬件上的理论提升有1000倍时,有人对并发数量提出了更高的要求,"C10K"升级为"C10M"问题,即每秒应对10M个客户端的同时访问。咋眼一看,怎么会有这样的服务,需要每秒处理上千万的并发?实际上这样的需求是广泛存在的,典型的例子就是DNS服务器、网络授时服务以及基于内存的key-value服务器。这种服务的特点是,一次客户请求涉及的计算量可能会很少,大部分时间均花在了IO上。所以根据Amdahl定律,优化的重点需放在如何减少I/O路径上的开销。

最早提出"C10M"问题的Robert Graham认为,减少开销的关键之一在于绕过操作系统,即"kernel bypass",因为我们使用的操作系统在设计之初并没有考虑高并发的场景,而I/O路径上的大部分例程又在内核空间中,大量无谓的消耗花在了内核空间和用户空间上下文的切换上。解决的方法就是将I/O路径(对于网络请求来讲,就是驱动和网络协议栈)全部实现在用户空间,这样可以最大程度的减少内核的干预,并且通过轮询(polling)而不是硬件中断的方法来获取网卡上的请求(而对于存储器来讲,就是complete信息)。再结合其他优化方法,例如协程和零拷贝技术,可以将并发性能优化到极致,具体请见“内核才是问题的根本”。

基于这样的背景,一种未来的趋势是出更多的硬件驱动将在用户空间中实现,而这种趋势似乎正在慢慢成为现实。例如Intel的DPDK相关的技术,以及RDMA和XDP,都是此类思路的具体实践。在本文中,我们将尝试用Rust语言来实现一个极其简单的Intel ixgbe 10G网络控制器驱动,并在编写测试程序测试其基础性能。

需要特别说明的是,本文的目的之一是探寻Rust语言编写驱动的优缺点,所以对于具体的网络接口的硬件细节关注较少,所以实现基本上是在C语言版本的驱动emmericp/ixy的基础上进行Rust移植。本文的相关代码请移步Github仓库。

为什么用Rust?

Rust是一款能够保证安全和较高性能的静态编译型语言,其目标在于取代C,成为系统软件的主要实现语言。Rust充分利用了LLVM等最新的编译优化和静态分析技术,能够将安全和性能,这两个看似矛盾的目标很好的结合在一起,而我认为这正是驱动程序所不断追求的两个目标。几乎所有的安全检查都是在编译的过程中通过静态分析加以解决&

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值