• 栏目频道
底层I/O性能大PK:Python/Java被碾压,Rust有望取代C++
作者:
来源:
发布时间:2021-03-25 11:24:19
访问量:626

我发现一旦计算机没了互联网,我就无所事事。大多数时候,我们都使用笔记本电脑和智能手机访问其他地方存储或生成的信息。我们很难想象如果没有了网络通信,不面向用户的应用还有什么用处。尽管I/O操作与数据处理的比例可能有所不同,但此类操作可能会引发服务延迟。

实现后端服务的编程语言有许多。因此,人们对于比较这些语言的性能有着一种天然的好奇心,而比较的基准也各种各样。例如,有一个基准可以比较不同语言在解决不同的离线任务时的性能。还有一个基准TechEmpower,可以衡量Web框架的性能。这些度量非常实用,我们可以通过它们大致了解语言的性能。然而,一般这些基准都有特定的使用场合和特定的操作,所以不一定具有代表性。

因此,我对各个平台上基本I/O的不可降低的成本非常好奇。对TCP代理进行基准测试可能是最简单的情况。其中不涉及数据处理,只处理传入/传出连接,并中继原始的字节数据。微服务的速度基本上不可能比TCP代理更快,因为微服务所需做的处理不可能少于TCP代理,它的功能只会更多,比如在此基础上构建的其他功能:解析、验证、遍历、打包、计算等等。

在本文中,我们将比较以下解决方案:

  • HAProxy:TCP代理模式。这是一个使用C语言编写的成熟解决方案。http://www.haproxy.org/

  • draft-http-tunnel:一个使用C++的解决方案(以TCP模式运行),只有最基本的功能(trantor):https://github.com/cmello/draft-http-tunnel/(

  • http-tunnel:使用Rust(tokio)编写的简单的HTTP隧道 / TCP代理(在TCP模式下运行):https://github.com/xnuter/http-tunnel/

  • tcp-proxy:Golang解决方案:https://github.com/jpillora/go-tcp-proxy

  • NetCrusher:Java解决方案(Java NIO)。使用G1在JDK 11上运行基准测试:https://github.com/NetCrusherOrg/NetCrusher-java/

  • pproxy:基于asyncio的Python解决方案(以TCP代理模式运行):https://pypi.org/project/pproxy/

以上所有的解决方案均使用非阻塞I / O。

注意:我尽力挑选了Golang、Java和Python的最佳解决方案,如果你知道更好的解决方案,请在下方留言。

实际的后端是Nginx,具体配置为:以HTTP模式发送10kb的数据。

基准结果分为两组:

  • 基准、C、C++、Rust:高性能语言。

  • Rust、Golang、Java、Python:内存安全的语言。

没错,两组中都包含Rust。

方法的简要说明

  • 为TCP代理分配了两个核心(使用cpuset)。

  • 为后端分配了两个核心(Nginx)。

  • 请求速率从10k开始,最高至每秒25k请求。

  • 每50个请求共用一个连接(每个请求10kb)。

  • 测试在同一台虚拟机上运行,为的是避免网络噪音。

  • VM选择了针对计算优化的实例类型(独占所有分配到的CPU),为的是避免出现“嘈杂的邻居”问题。

  • 延迟测量分辨率为微秒(µs)。

我们比较的统计数据包括:

  • 百分位数(从p50到p99):关键统计数据。

  • 离群值(p99.9和p99.99):对于大型分布式系统的组件非常关键。

  • 最大延迟:最坏的情况永远不容忽视。

  • 修整后的均值tm99.9:去除0.1%的最佳/最差值后得到的均值,为的是捕捉中心趋势(不考虑离群值)。

  • 标准偏差:评估延迟的稳定性

<返回上一页

分享到微博 分享到QQ好友 分享到QQ空间 复制链接