性能比拼: Go vs Java

news2025/4/23 22:18:56

本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准

在本视频中,我们将比较 Go 和 Java。

我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用程序,并使用 Prometheus 将它们部署到 Kubernetes。我们将从 Nginx Ingress 控制器收集延迟和流量信息。

为了收集基本的容器指标,例如 CPU 使用率,我们将部署 cAdvisor 作为一个守护进程集(DaemonSet)。您可以监控 CPU 使用率,既可以看作是分配给容器限制的百分比,也可以是实际使用的 CPU 核心数,并将请求(requests)和限制(limits)以线的形式绘制出来。在 Kubernetes 中,由于使用了 cgroups,测量 CPU 节流(throttling)至关重要,因为它会极大地影响应用程序的性能。

同样的情况也适用于内存。我们可以将其可视化为百分比,或者使用实际使用量,并标注请求(requests)和限制(limits)。监控 Nginx Ingress Pod 的 CPU 使用率也至关重要,至少需要关注这一点,因为它可能成为您应用程序的瓶颈,并显著增加延迟。

我们还将使用原生的 Prometheus 客户端来检测(instrument)我们应用程序的部分代码。例如,在这个仪表板中,我们将测量 S3 调用的请求持续时间和 MongoDB 插入操作的耗时。

由于我们将使用一个基于开源 MinIO 项目的自托管 S3 解决方案,我认为用 Prometheus 对其进行监控也是一个好主意。我们还将在 Kubernetes 中部署 MongoDB,并使用 Prometheus exporter 对其进行监控。

这些技术不仅对基准测试有用,对于日常运维也很有帮助。您可以在我的 GitHub 仓库中找到源代码。

首先,我们将使用 Terraform 创建 VPC 和 EKS。然后,为了在 VPC 内暴露我们的应用程序,我们将使用 Helm chart 和 Terraform 部署一个私有的 Nginx Ingress 控制器。接着,将 Go 语言和 Java 应用程序部署到 Kubernetes。

对于第一个测试,我们简单地使用 k6 负载测试工具来并排比较 Fiber 和 Spring Boot 应用程序。

对于第二个更贴近现实的测试,在每次请求中,我们将从 S3 存储桶下载一张图片,并将最后修改日期保存到 MongoDB 数据库。

现在,让我们来看一下代码。首先,您可以在 AWS 环境中找到用于创建所有网络组件和 EKS 的 Terraform 代码。然后,我们有 Prometheus 和其他监控组件。例如,MinIO 能够开箱即用地生成 Prometheus 指标。而要监控 MongoDB,我们需要单独部署 Prometheus exporter。

对于第一个测试,我们只需向客户端返回 10 个设备信息。Java 的实现也一样。在这里,我额外加入了一个 Prometheus 计数器变量,以防您想统计这个端点被调用了多少次。

对于第二个测试,在 Go 语言中,我们有一个 getImage Fiber 处理器(Handler),它使用 download 函数从 S3 存储桶拉取 S3 图片,并使用 save 函数将最后修改日期插入到 MongoDB。为了共享 S3 客户端和 MongoDB 连接池,我们创建了一个自定义的处理器,并添加了 sessionclient 属性。然后,在初始化处理器时,我们调用辅助方法来建立与 S3 和 MongoDB 的连接。您不必共享 S3 客户端,但每次访问 S3 时,它都会重新进行身份验证,这也会消耗时间。

谈到 Prometheus 指标,首先,我们需要在一个结构体(struct)中声明它们。然后创建一个 newMetrics 函数来初始化它们。在这个测试中,我使用了 summary 类型,这对于单个副本来说是没问题的,而且您不必预先设定时间间隔桶(interval buckets)。但是,如果您计划水平扩展此应用程序,您将无法聚合 summary 类型;请改用 histogram 类型来记录观测值。您可以这样做来记录观测值:简单地在函数调用之前和之后记录时间,或者,您当然可以使用中间件模式来包装这个函数,这取决于您。

对于 Java,您遵循相同的原则。声明指标,在这个例子中,我有 S3 和 MongoDB 的持续时间指标,并使用它们来记录观测值。对于 Java,您需要添加一些依赖项,以允许您使用 Prometheus 指标。要暴露 Prometheus 端点,您可以使用 application.yaml 配置,或者只是在代码中使用 setProperty 手动启用它。

最后,让我们看一下第一个测试场景。我们将从 1 个虚拟用户开始,在 5 分钟内缓慢扩展到 100 个用户。然后立即将用户数增加到 500 个,并保持 5 分钟。再过 5 分钟后,将用户扩展到 3000 个,直到其中一个应用程序失败。

第二个测试类似,我们只是减少了客户端数量,并使用了不同的端点。

我还必须提到,Java 现在具有容器支持,可以直接从 cgroup 获取限制。然而,有些人仍然建议手动设置最小和最大堆大小(Min and Max Heap size),而且那些 Java 的最大和最小内存百分比(Java Max and Min RAM percentages)非常令人困惑。

让我们开始运行第一个测试。正如您可能预期的那样,在这个简单的测试中,Java 的 CPU 使用率和内存使用率远高于 Go。

当我们达到大约每秒 600 次请求时,Java 根本无法处理它们并拒绝了请求。这在接下来的测试中会有所改变。

在这个包含详细 CPU 使用率的仪表板中,您可以看到 Java 进程受到了相当严重的节流(throttled)。

这是内存使用情况,在整个测试期间,Java 和 Go 的内存使用都保持平稳。

每次使用 Ingress 时,您必须至少监控 Ingress 控制器的 CPU 使用率。如果它们没有足够的资源,可能会导致延迟大幅增加,特别是当您使用 Nginx Ingress 的默认 Helm chart 时。

在测试结束时,您可以找到 Java 和 Go 的 P95 和 P90 延迟。

让我们运行第二个测试,即下载图片并保存最后修改日期。在开始时,您可以看到与第一个测试相同的模式:Java 的 CPU 使用率更高。但当请求达到每秒 20 次时,差异显著缩小。到测试结束时,当我们增加用户数量时,Go 语言的 CPU 现在变得更高了,这让我感到惊讶,并且延迟也急剧上升。

需要说明的是,这些测试仅仅代表了真实世界的场景,它们在比较语言本身方面可能不是很准确,因为我们使用了大量的外部库。但是,当您在生产环境中运行应用程序时,它们可以向您展示实际的差异。从 DevOps 的角度来看,这比斐波那契(Fibonacci)测试重要得多。

如果您发现任何错误,请告诉我,以便我可以在下一个视频中修复它们。感谢您的观看,我们下个视频再见。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341067.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ElMessageBox消息弹框(vue3总结)

一 展示各种内容 const checkCheckbox (check: any, formEl: any) > {ElMessageBox({title: "服务协议及隐私权政策",message: h("p", null, [h("span", null, "我已阅读并同意 "),h("span",{style: "color: #477F…

Jupyter Notebook 中切换/使用 conda 虚拟环境的方式(解决jupyter notebook 环境默认在base下面的问题)

使用 nb_conda_kernels 添加所有环境 一键添加所有 conda 环境 conda activate my-conda-env # this is the environment for your project and code conda install ipykernel conda deactivateconda activate base # could be also some other environment conda in…

Tailwind CSS 开发入门:掌握基础语法要点

在前端开发中,Tailwind CSS 以原子化设计和实用类系统,构建精美页面的得力工具,摒弃传统 CSS 繁琐写法。掌握其基础语法是熟练运用它的关键,下面将详细介绍核心基础语法。 一、核心基础语法 1. 颜色类 Tailwind CSS 提供了丰富…

Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子

目录 概念 AOP 术语 1. 连接点(Jointpoint): 2. 切入点(Pointcut): 3. 通知(Advice): 4. 方面/切面(Aspect): 5. 引入&#xff…

C++std::map

1. 概述​​ ​​定义​​:std::map 是C标准模板库(STL)中的关联容器,以键值对(key-value pairs)形式存储元素,支持快速查找和有序访问。 ​​- 头文件​​:#include ​​底层实现​…

dispaly: inline-flex 和 display: flex 的区别

display: inline-flex 和 display: flex 都是 CSS 中用于创建弹性盒子布局(Flexbox)的属性值,但它们之间有一些关键的区别,主要体现在元素如何在页面上被渲染和它们对周围元素的影响。 主要区别 1,块级 vs 行内块级 d…

性能比拼: Elixir vs Go(第二轮)

本内容是对知名性能评测博主 Anton Putra Elixir vs Go (Golang) Performance Benchmark (Round 2) 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 这是第二轮关于 Elixir 和 Go 的对比测试。我收到了一份来自 Elixir 创作者的 Pull Request ,并且我认为…

【数字图像处理】立体视觉信息提取

双目立体视觉原理 设一个为参考平面,一个为目标平面。增加了一个摄像头后,P与Q在目标面T上有分别的成像点 双目立体视觉:从两个不同的位置观察同一物体,用三角测量原理计算摄像机到该物体的距离的 方法 原理:三角测量…

【漏洞复现】Struts2系列

【漏洞复现】Struts2系列 1. 了解Struts21. Struts2 S2-061 RCE (CVE-2020-17530)1. 漏洞描述2. 影响版本3. 复现过程 1. 了解Struts2 Apache Struts2是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的…

Sentinel源码—5.FlowSlot借鉴Guava的限流算法二

大纲 1.Guava提供的RateLimiter限流使用示例 2.Guava提供的RateLimiter简介与设计 3.继承RateLimiter的SmoothBursty源码 4.继承RateLimiter的SmoothWarmingUp源码 3.继承RateLimiter的SmoothBursty源码 (1)SmoothBursty的初始化流程 (2)SmoothBursty的初始化完成后的变量…

重构未来智能:Anthropic 解码Agent设计哲学三重奏

第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…

Gradle与Idea整合

文章目录 1. Groovy 简介2. Groovy 安装[非必须]3. 在idea中创建java工程 1. Groovy 简介 在某种程度上,Groovy可以被视为Java的一种脚本化改良版,Groovy也是运行在JVM上,它可以很好地与Java代码及其相关库进行交互操作。它是一种成熟的面向对象编程语言…

基于springboot+vue的校园二手物品交易平台

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

OpenCV图像上加数字水印示例

OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 14.1 基本概念 当今,生成式人工智能(Artificial Intelligence Generated Content,AIGC)的火爆引燃了数字水印,说实话数字水印并不是一项新的技术&…

Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术

1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…

Day-1 漏洞攻击实战

实训任务1 漏洞攻击实战一 使用 御剑 得到网站后台地址 数据库登录与日志配置​​ 使用默认密码 root:root 登录phpMyAdmin,执行 SHOW VARIABLES LIKE general% 查看日志状态。 开启日志功能:set global general_log "ON";(配图&…

AOSP Android14 Launcher3——RecentsView最近任务数据加载

最近任务是Launcher中的一个重要的功能,显示用户最近使用的应用,并可以快速切换到其中的应用;用户可以通过底部上滑停顿进入最近任务,也可以在第三方应用底部上滑进最近任务。 这两种场景之前的博客也介绍过,本文就不…

基于深度学习的校园食堂菜品智能结算系统

校园食堂菜品智能结算系统说明文档 1. 系统概述 本系统是一款基于YOLO深度学习算法的校园食堂菜品智能结算平台,旨在通过计算机视觉技术实现食堂菜品的自动识别与结算,提高结算效率,减少人工成本,优化用户体验。系统采用PyQt5框…

【UniApp】Vue2 scss 预编译器默认已由 node-sass 更换为 dart-sass

从 HBuilderX 4.56 ,vue2 项目也将默认使用 dart-sass 预编译器。 vue2开发者sass预处理注意: sass的预处理器,早年使用node-sass,也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。node-sass已经停维很久了。 另…

AI 硬件定制:开启智能新时代的钥匙

AI 硬件定制:开启智能新时代的钥匙 在科技飞速发展的当下,人工智能(AI)已不再是遥不可及的概念,它正以惊人的速度融入我们生活的方方面面。从智能手机中的语音助手,到工厂里的自动化生产线,AI 的身影无处不在。而在这股 AI 浪潮中,AI 硬件定制正逐渐崭露头角,成为推动…