性能比拼: Go vs Java
本内容是对知名性能评测博主 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 连接池,我们创建了一个自定义的处理器,并添加了 session 和 client 属性。然后,在初始化处理器时,我们调用辅助方法来建立与 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)测试重要得多。
如果您发现任何错误,请告诉我,以便我可以在下一个视频中修复它们。感谢您的观看,我们下个视频再见。
相关文章:
性能比拼: Go vs Java
本内容是对知名性能评测博主 Anton Putra Go (Golang) vs Java: Performance Benchmark 内容的翻译与整理, 有适当删减, 相关指标和结论以原作为准 在本视频中,我们将比较 Go 和 Java。 我们将基于 Golang 的 Fiber 框架和 Java 的 Spring Boot 创建几个简单的应用…...
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…...
CLIP | 训练过程中图像特征和文本特征的在嵌入空间中的对齐(两个投影矩阵的学习)
在多模态学习(Multimodal Learning)中,投影矩阵 W i W_i Wi 和 W t W_t Wt 是通过训练过程学习得到的。它们的作用是将图像特征 I f I_f If 和文本特征 T f T_f Tf 映射到一个共享的嵌入空间(embedding space…...
Java面试实战:从Spring Boot到微服务的深入探讨
Java面试实战:从Spring Boot到微服务的深入探讨 场景:电商场景的面试之旅 在某互联网大厂的面试间,面试官李老师正襟危坐,而对面坐着的是传说中的“水货程序员”赵大宝。 第一轮:核心Java与构建工具 面试官&#x…...
Tailwind CSS 开发入门:掌握基础语法要点
在前端开发中,Tailwind CSS 以原子化设计和实用类系统,构建精美页面的得力工具,摒弃传统 CSS 繁琐写法。掌握其基础语法是熟练运用它的关键,下面将详细介绍核心基础语法。 一、核心基础语法 1. 颜色类 Tailwind CSS 提供了丰富…...
Java八股 深入理解Spring的AOP 面向切面编程 底层 保姆级教程 手写例子
目录 概念 AOP 术语 1. 连接点(Jointpoint): 2. 切入点(Pointcut): 3. 通知(Advice): 4. 方面/切面(Aspect): 5. 引入ÿ…...
保生产 促安全 迎国庆
2021年的国庆节已经临近,与此同时陕化也迎来了祖国母亲的第七十二个生日,在这个普天同庆的日子里,陕化BDO分厂丁二醇单元化工一组的员工依然会坚守在工作的一线,为“保生产 促安全 迎国庆”护航掌舵,化工一组一直秉持着…...
【Flutter DevTools】性能优化的瑞士军刀
一、性能分析:帧率与资源监控 1.1 帧率监控(Performance面板) 通过Performance面板可实时捕获应用的渲染流水线数据。开发者点击"Record"按钮后,DevTools会以时间轴形式展示每一帧的构建、布局、绘制耗时。当帧率低于…...
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 ,并且我认为…...
鸿蒙NEXT开发键值型数据工具类(ArkTs)
import { AppUtil } from ./AppUtil; import { distributedKVStore } from kit.ArkData; import { BusinessError } from kit.BasicServicesKit;/*** 键值型数据库工具类* author CSDN-鸿蒙布道师* since 2025/04/18*/ export class KvUtil {private static kvStore: distribut…...
【数字图像处理】立体视觉信息提取
双目立体视觉原理 设一个为参考平面,一个为目标平面。增加了一个摄像头后,P与Q在目标面T上有分别的成像点 双目立体视觉:从两个不同的位置观察同一物体,用三角测量原理计算摄像机到该物体的距离的 方法 原理:三角测量…...
Linux ssh免密登陆设置
使用 ssh-copy-id 命令来设置 SSH 免密登录,并确保所有相关文件和目录权限正确设置,可以按照以下步骤进行: 步骤 1:在源服务器(198.120.1.109)生成 SSH 密钥对 如果还没有生成 SSH 密钥对,首先…...
CentOS7执行yum命令报错 Could not retrieve mirrorlist http://mirrorlist.centos.org
CentOS7执行yum命令报错 引更新yum源备份原有源创建新的源文件清理并重建缓存 引 CentOS 7 系统无法连接到 CentOS 的官方镜像站点。这通常是由于网络问题或 CentOS 7 已停止维护导致的(2024年6月30日后 CentOS 7 已进入 EOL) 报错明细: 已…...
【漏洞复现】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的初始化完成后的变量…...
下载electron 22.3.27 源码错误集锦
下载步骤同 electron源码下载及编译_electron源码编译-CSDN博客 问题1 从github 下载 dugite超时,原因没有找到 Validation failed. Expected 8ea2d0d3c9d9e4615069913207371ffe892dc10fb93975972f2f6e668f2e3b3a but got e3b0c44298fc1c149afbf4c8996fb92427ae41e…...
安卓的桌面 launcher是什么
安卓的桌面Launcher是一种安卓应用程序,它主要负责管理和展示手机主屏幕的界面以及相关功能,为用户提供与设备交互的主要入口。以下是其详细介绍: 功能 主屏幕管理:用户可以在主屏幕上添加、删除和排列各种应用程序图标、小部件…...
基础数学知识-线性代数
1. 矩阵相乘 c i j = a i k ∗ b k j c_{ij} = a_{ik} * b_{kj} cij=aik∗bkj 1. 范数 1. 向量的范数 任意一组向量设为 x ⃗ = ( x 1 , x 2 , . . . , x N ) \vec{x}=(x_1,x_2,...,x_N) x =(x1,x2,...,xN) 如下: 向量的1范数: 向量的各个元素的绝对值之和∥ …...
kubeadm极速部署Kubernetes 1.26.X 版本集群
1.1 Kubernetes 1.26版本集群部署环境准备 1.1.1 主机操作系统说明 序号操作系统及版本备注1CentOS7u9 1.1.2 主机硬件配置说明 需求CPU内存硬盘角色主机名值4C8G100GBmastermaster01值4C8G100GBworker(node)node01值4C8G100GBworker(node)node02 1.1.3 主机配置 1.1.3.1…...
重构未来智能:Anthropic 解码Agent设计哲学三重奏
第一章 智能体进化论:从工具到自主体的认知跃迁 1.1 LLM应用范式演进图谱 阶段技术形态应用特征代表场景初级阶段单功能模型硬编码规则执行文本摘要/分类进阶阶段工作流编排多模型协同调度跨语言翻译流水线高级阶段自主智能体动态决策交互编程调试/客服对话 1.1.…...
互联网大厂Java面试:微服务与分布式系统挑战
互联网大厂Java面试:微服务与分布式系统挑战 在互联网的大潮中,无数程序员怀揣着梦想,希望能在一线大厂找到自己的位置。今天的故事主角是马飞机,一位充满幽默感但技术略显水货的程序员。他来到了一家知名互联网公司参加Java开发…...
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包:…...
PoCL环境搭建
PoCL环境搭建 **一.关键功能与优势****二.设计目的****三.测试步骤**1.创建容器2.安装依赖3.编译安装pocl4.运行OpenCL测试程序 Portable Computing Language (PoCL) 简介 Portable Computing Language (PoCL) 是一个开源的、符合标准的异构计算框架,旨在为 OpenCL…...
【前端Skill】点击目标元素定位跳转IDE中的源代码
参考:https://juejin.cn/post/7326002010084311079 快手开源项目: https://github.com/zh-lx/code-inspector 目前在umi项目中用到 记录一下umi项目中如何使用 安装 npm i code-inspector-plugin -D --registryhttps://registry.npmmirror.com/ 配…...
OpenCV图像上加数字水印示例
OpenCV计算机视觉开发实践:基于Qt C - 商品搜索 - 京东 14.1 基本概念 当今,生成式人工智能(Artificial Intelligence Generated Content,AIGC)的火爆引燃了数字水印,说实话数字水印并不是一项新的技术&…...
Python爬虫从入门到实战详细版教程Char01:爬虫基础与核心技术
1.1 什么是网络爬虫? 1.1.1 定义与分类 网络爬虫:互联网世界的“信息捕手” 网络爬虫(Web Crawler),又称网络蜘蛛或网络机器人,是一种通过预设规则自动访问网页、提取数据的程序系统。从技术视角看,其核心任务是通过模拟浏览器行为向目标服务器发起请求,解析网页内容…...
