使用 kube-downscaler 降低Kubernetes集群成本
新钛云服已累计为您分享772篇技术干货


介绍
Kube-downscaler 是一款开源工具,允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。
在本文中,我们将详细介绍 kube-downscaler 的功能、安装和配置,以及它的用例和未来前景。
kube-downscaler的特点
Kube-downscaler 是一款基于调度的强大工具,用于在 Kubernetes 集群中对应用程序进行升级或降级。在本节中,我们将探讨该工具的一些关键功能:
与Kubernetes功能或工具的兼容性
Kube-downscaler 还支持水平 Pod 自动缩放 (HPA),并可以与 HPA 结合使用,以确保为应用程序维护所需的副本数量。这使得 kube-downscaler 能够为 Kubernetes 中的应用程序扩展提供额外的灵活性和细粒度的控制。
Karpenter 和 kube-downscaler 是两个可以结合使用的工具,可以为 Kubernetes 集群提供完整且强大的资源管理解决方案。通过结合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以从水平和垂直扩展中受益。 Downscaler 允许减少 Pod 数量,而 Karpenter 通过将 Pod 整合到更少或不同类型的机器上来优化节点利用率。
与Kubernetes功能或工具的兼容性
Kube-downscaler 还支持水平 Pod 自动缩放 (HPA),并可以与 HPA 结合使用,以确保为应用程序维护所需的副本数量。这使得 kube-downscaler 能够为 Kubernetes 中的应用程序扩展提供额外的灵活性和细粒度的控制。
Karpenter 和 kube-downscaler 是两个可以结合使用的工具,可以为 Kubernetes 集群提供完整且强大的资源管理解决方案。通过结合使用 Karpenter 和 kube-downscaler,Kubernetes 集群可以从水平和垂直扩展中受益。 Downscaler 允许减少 Pod 数量,而 Karpenter 通过将 Pod 整合到更少或不同类型的机器上来优化节点利用率。
根据定义的时间段自动扩展部署副本
Kube-downscaler 可以根据预定义的时间段自动扩展部署副本。这意味着我们可以设置一个计划,在一天、一周或一个月的特定时间增加或减少副本数量。
比如,如果我们知道应用程序在一天中的某些时段遇到高流量,则可以将 kube-downscaler 配置为在这些时段自动扩展副本,然后在流量减少时缩小副本。
这可以允许在预期峰值负载的情况下进行扩展,而不是等待峰值负载发生并由 HPA 处理。这可以帮助优化资源使用并确保您的应用程序始终可用且响应迅速。
但是 Kube-downscaler 主要用于缩小副本并优化集群的成本,我们通常使用 HPA 来管理扩展。
kube-downscaler的安装和配置
kubernetes集群上kube-downscaler安装说明
从 GitHub 克隆 kube-downscaler 存储库:
git clone <https://codeberg.org/hjacobs/kube-downscaler.git>
进入 kube-downscaler 目录:
cd kube-downscaler
编辑
deploy/kube-downscaler.yaml文件以根据您的具体需求自定义配置。例如,可以调整时区、计划和缩放规则。将配置应用到您的 Kubernetes 集群:
kubectl apply -f deploy/
此命令将部署 kube-downscaler 控制器并创建 kube-downscaler 部署。
可以通过检查 kube-downscaler 部署的日志来验证 kube-downscaler 控制器是否正在运行:
kubectl logs -f deployment/kube-downscaler
安装完成后,需要进行一下配置。
根据具体用户需求配置kube-downscaler
Kube-downscaler 通过在 Kubernetes 部署对象上使用注释来提供扩展计划的定制。
部署对象中的 downTimePeriod注释可用于指定不应扩展部署的停机时间段。
minReplicas 注释可用于设置部署的最小副本数。
这些字段与 kube-downscaler 注释结合使用,允许您根据特定的业务需求和资源利用模式创建自定义的扩展计划。
通过调整这些字段,可以配置 kube-downscaler 以优化应用程序可用性和成本效率的方式扩展部署。
以下是使用 kube-downscaler 进行部署的简单配置。
apiVersion: apps/v1
kind: Deployment
metadata:name: random-deploymentannotations:# Kube-downscalerdownscaler/downtimePeriod: "Mon-Fri 00:00-07:00 Europe/Berlin"downscaler/minReplicas: 1
spec:replicas: 2selector:matchLabels:app: randomtemplate:metadata:labels:app: randomspec:containers:- name: random-containerimage: random-image
通过此配置,从周一到周五午夜到早上 7 点(在欧洲/柏林时间线上),副本数量将减少到 1 个。
kube-downscaler 将根据定义的计划自动开始缩减 pod。
目前我们已经在 Kubernetes 集群上安装并运行了 kube-downscaler。
算法
Kube-downscaler 如果满足以下所有条件,将缩减部署的副本:
current time不是“uptime”计划的一部分,也不是“downtime”计划的一部分。 如果为 true,则按以下顺序评估计划:
downscaler/downscale-period或downscaler/downtime工作负载定义的注释downscaler/upscale-period或downscaler/uptime工作负载定义的注释downscaler/downscale-period或downscaler/downtime工作负载命名空间上的注释downscaler/upscale-period或downscaler/uptime工作负载命名空间上的注释--upscale-period或--default-uptimeCLI 参数--downscale-period或--default-downtimeCLI 参数UPSCALE_PERIOD或DEFAULT_UPTIME环境变量DOWNSCALE_PERIOD或DEFAULT_DOWNTIME环境变量
工作负载的命名空间不是排除列表的一部分:
如果提供排除列表,它将用于代替默认值(仅包括
kube-system)。
工作负载的标签与标签列表不匹配。
工作负载的名称不是排除列表的一部分
工作负载未标记为排除(注释
downscaler/exclude: "true"或downscaler/exclude-until: "2024-04-05")没有活动 Pod 强制整个集群进入正常运行时间(注释
downscaler/force-uptime: "true")
Minimum replicas最小副本数
默认情况下,部署将缩减为零副本。这可以通过部署或其命名空间的注释进行配置, downscaler/downtime-replicas 也可以通过 CLI 使用 --downtime-replicas .
Ex: downscaler/downtime-replicas: "1"
Specific workload特定工作负载
在正常的情况下 HorizontalPodAutoscalers ,该字段不能设置为零, 因此downscaler/downtime-replicas 至少 1 应设置为 。 关于 CronJobs ,它们的状态将按照我们的预期进行定义 suspend: true 。
注意点
请注意,默认的宽限期为 15 分钟适用于新的 nginx 部署,即
如果当前时间不在 ,它不会立即缩小
Mon-Fri 9-17 (Buenos Aires timezone),而是在 15 分钟后缩小。downscaler最终会记录如下内容:
INFO: Scaling down Deployment default/nginx from 1 to 0 replicas (uptime: Mon-Fri 09:00-17:00 America/Buenos_Aires, downtime: never)
请注意,如果 HorizontalPodAutoscaler (HPA) 与部署一起使用,请考虑以下事项:
如果需要缩减到 0 个副本,则应在 上
Deployment应用注释。这是一种特殊情况,因为minReplicas不允许在 HPA 上为 0。将部署副本设置为 0 实质上会禁用 HPA。在这种情况下,HPA 将发出事件,例如failed to get memory utilization: unable to get metrics for resource memory: no metrics returned from resource metrics API没有 Pod 可以从中检索指标。如果需要缩小大于 0,则应在 HPA 上应用注释。这允许在停机期间根据外部流量动态扩展 Pod,并在停机期间保持较低的
minReplicas流量,如果没有低流量。如果对部署而不是 HPA 进行批注,则会导致争用条件,即缩减部署,kube-downscalerHPA 在部署更高时minReplicas将其升级。
若要使用 在 HPA 上 --downtime-replicas=1 启用downscaler,请确保将以下注释添加到部署和 HPA。
$ kubectl annotate deploy nginx 'downscaler/exclude=true'
$ kubectl annotate hpa nginx 'downscaler/downtime-replicas=1'
$ kubectl annotate hpa nginx 'downscaler/uptime=Mon-Fri 09:00-17:00 America/Buenos_Aires'
详细配置
Uptime/downtime spec
downscaler通过命令行参数、环境变量或 Kubernetes 注释进行配置。
时间定义(例如 DEFAULT_UPTIME )接受以逗号分隔的规范列表,例如,以下配置将缩小非工作时间的所有部署:
DEFAULT_UPTIME="Mon-Fri 07:30-20:30 Europe/Berlin"
仅在周末和周五 20:00 后缩小:
DEFAULT_DOWNTIME="Sat-Sun 00:00-24:00 CET,Fri-Fri 20:00-24:00 CET'
每个时间规范可以采用以下两种格式之一:
重复规范格式
<WEEKDAY-FROM>-<WEEKDAY-TO-INCLUSIVE> <HH>:<MM>-<HH>:<MM> <TIMEZONE>.时区值可以是任何时区,例如“US/Eastern”、“PST”或“UTC”。绝对规范格式,
<TIME_FROM>-<TIME_TO>其中每个<TIME>格式都是ISO 8601日期和时间的格式<YYYY>-<MM>-<DD>T<HH>:<MM>:<SS>[+-]<TZHH>:<TZMM>。
基于periods的替代逻辑
您可以选择升级或缩减的时间段,而不是严格的正常运行时间或停机时间。时间定义是相同的。在这种情况下,放大或缩小只发生在时间段,其余时间将被忽略。
如果配置了升级或缩减周期,将忽略正常运行时间和停机时间。这意味着某些选项是互斥的,例如,您可以使用或 --default-downtime ,但不能同时使用 --downscale-period 两者。
此定义将在 19:00 到 20:00 之间缩减群集。如果手动升级集群,则在第二天 19:00-20:00 之前不会缩减集群。
DOWNSCALE_PERIOD="Mon-Sun 19:00-20:00 Europe/Berlin"
命令行选项
可用的命令行选项:
--dry-run仅运行模式:不更改任何内容,只需打印将要执行的操作
--debug调试模式:打印更多信息
--once仅运行一次循环并退出
--interval循环间隔(默认:30 秒)
--namespace将downscaler限制为仅在单个命名空间(默认:所有命名空间)中工作。这主要适用于 kube-downscaler 的部署者只能访问给定命名空间(而不是集群访问权限)的部署场景。如果与 同时
--exclude-namespaces使用 ,则不应用任何应用。--include-resources将此类资源缩小为逗号分隔列表。
--grace-period新部署在缩减部署之前的宽限期(以秒为单位)(默认值:15 分钟)。宽限期从创建部署时开始计算,即无论宽限期如何,更新的部署都将立即缩减。
--upscale-period仅在给定时间段内纵向扩展的替代逻辑(默认:从不),也可以通过环境变量
UPSCALE_PERIOD或通过每个部署downscaler/upscale-period上的注释进行配置--downscale-period仅在给定时间段内缩减的替代逻辑(默认:从不),也可以通过环境变量
DOWNSCALE_PERIOD或通过每个部署downscaler/downscale-period上的注释进行配置--default-uptime要纵向扩展的默认时间范围(默认:始终),也可以通过环境变量
DEFAULT_UPTIME或通过每个部署downscaler/uptime上的注释进行配置--default-downtime要缩减的默认时间范围(默认:从不),也可以通过环境变量
DEFAULT_DOWNTIME或通过每个部署downscaler/downtime上的注释进行配置--exclude-namespaces从降级中排除命名空间(正则表达式模式列表,默认:kube-system),也可以通过环境变量
EXCLUDE_NAMESPACES进行配置。如果与 同时--namespace使用 ,则不应用任何应用。--exclude-deployments从降级中排除特定部署/状态集/cronjobs(默认:kube-downscaler,downscaler),也可以通过环境变量
EXCLUDE_DEPLOYMENTS进行配置。尽管名称如此,但此选项将与任何包含的资源类型(Deployment,StatefulSet,CronJob等)的名称匹配。--downtime-replicas缩小到的副本的默认值,注释
downscaler/downtime-replicas优先于此值。--deployment-time-annotation可选:将使用的注释的名称,而不是资源的创建时间戳。如果您希望资源在部署后的宽限期 (
--grace-period) 内保持纵向扩展,则应使用此选项。注释的时间戳值的格式必须与 Kubernetes 的格式完全相同:creationTimestamp%Y-%m-%dT%H:%M:%SZ。建议:通过部署工具自动设置此批注。--matching-labels可选:kube-downscaleer 范围涵盖的工作负载标签列表。标签与列表中的任何工作负载都不匹配的所有工作负载都将被忽略。为了向后兼容,如果未指定此参数,kube-downscaler 将应用于所有资源。
Namespace Defaults命名空间默认值
DEFAULT_UPTIME 、 DEFAULT_DOWNTIME 和 FORCE_UPTIME 排除也可以使用命名空间注释进行配置。在配置的情况下,这些值将取代其他全局默认值。
apiVersion: v1
kind: Namespace
metadata:name: foolabels:name: fooannotations:downscaler/uptime: Mon-Sun 07:30-18:00 CET 命名空间级别支持以下批注:
downscaler/upscale-perioddownscaler/downscale-perioddownscaler/uptime:为此命名空间中的所有资源设置“正常运行时间”downscaler/downtime:为此命名空间中的所有资源设置“停机时间”downscaler/force-downtime:强制缩减此命名空间中的所有资源 - 可以是true/falsedownscaler/force-uptime:强制向上扩展此命名空间中的所有资源 - 可以是true/falsedownscaler/exclude:设置为 以true排除命名空间中的所有资源downscaler/exclude-until:暂时排除命名空间中的所有资源,直到给定的时间戳downscaler/downtime-replicas:覆盖默认目标副本以缩小到(默认值:零)
使用案例
该工具的主要用例是通过优化 Kubernetes 集群资源的利用率来降低成本。不过,它也可以用来预热集群,避免过度依赖 HPA。
虽然这不是其主要目的,但这种组合提供了一种替代解决方案,可确保应用程序的高可用性,同时最大限度地降低基础设施成本。
降低成本
kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。
服务中断预防
kube-downscaler 的另一个用例是防止高峰使用期间的服务中断。通过定义在高需求期间扩展资源的计划,kube-downscaler 可以帮助预先扩展部署并避免 HPA 延迟,以确保应用程序即使在高峰使用期间也保持可用和响应。
建议
基于预定义计划的扩展,这可能并不适合所有用例。此外,它不支持自动缩放,这意味着用户必须手动调整缩放计划以满足不断变化的需求。
另一种可供考虑的解决方案是 Keda。 Keda是一个开源项目,为Kubernetes应用程序提供动态自动伸缩功能。使用 Keda,用户可以根据各种指标(例如队列长度、CPU 使用率或自定义指标)设置自定义扩展规则。
这允许对资源使用进行更精细的控制,并确保应用程序始终能够正确扩展以满足需求。
此外,Keda 兼容广泛的 Kubernetes 应用程序,包括有状态和无状态应用程序,并支持多种事件源,例如 Azure Event Hubs、Kafka 和 RabbitMQ。
结论
Kube-downscaler 是管理 Kubernetes 集群中资源使用情况的强大工具。通过定义扩展计划,用户可以优化集群中的资源使用并降低成本,同时确保应用程序即使在高峰使用期间也保持可用和响应。
虽然 kube-downscaler 是管理 Kubernetes 集群中资源使用情况的一个有价值的工具,但它可能有一些限制。如果需要对资源扩展进行更精细的控制或需要自动扩展功能,那么可能值得考虑像 Keda 这样的替代解决方案。
推荐阅读


推荐视频
相关文章:
使用 kube-downscaler 降低Kubernetes集群成本
新钛云服已累计为您分享772篇技术干货 介绍 Kube-downscaler 是一款开源工具,允许用户定义 Kubernetes 中 pod 资源自动缩减的时间。这有助于通过减少非高峰时段的资源使用量来降低基础设施成本。 在本文中,我们将详细介绍 kube-downscaler 的功能、安装…...
LeetCode热题100——哈希表
哈希表 1.两数之和2.字母异位词分组3.最长连续序列 1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。可以按任意顺序返回答案。 // 题解思路:使用哈…...
Kubeadm
目录 绪论:实验步骤 1、环境准备 2、所有节点安装docker 3、所有节点安装kubeadm,kubelet和kubectl 4、部署K8S集群 5、部署 Dashboard 6、安装Harbor私有仓库 master(2C/4G,cpu核心数要求大于2) 192.168.…...
【Overload游戏引擎细节分析】PBR材质Shader---完结篇
PBR基于物理的渲染可以实现更加真实的效果,其Shader值得分析一下。但PBR需要较多的基础知识,不适合不会OpenGL的朋友。 一、PBR理论 PBR指基于物理的渲染,其理论较多,需要的基础知识也较多,我在这就不再写一遍了&…...
C++设计模式_18_State 状态模式
State和Memento被归为“状态变化”模式。 文章目录 1. “状态变化”模式1.1 典型模式 2. 动机 (Motivation)3. 代码演示State 状态模式3.1 常规方式3.2 State 状态模式 4. 模式定义5. 结构( Structure )6. 要点总结7. 其他参考 1. “状态变化”模式 在组件构建过程中…...
详解final, abstract, interface关键字
一.final关键字 1.final关键字介绍 ——final关键字可以去修饰类、方法、属性和局部变量 2.final关键字的作用 1)final修饰类,这个类不能被其他类继承 2)final修饰方法,方法不能被重写 3)final修饰属性,属…...
统计特殊四元组
题记: 给你一个 下标从 0 开始 的整数数组 nums ,返回满足下述条件的 不同 四元组 (a, b, c, d) 的 数目 : nums[a] nums[b] nums[c] nums[d] ,且a < b < c < d 示例 1: 输入: nums [1,2,3…...
腾讯云轻量应用服务器“镜像”怎么选择合适?
腾讯云轻量应用服务器镜像怎么选择?如果是用来搭建网站可以选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科txybk.com来详细说下腾讯云轻量应用服务器镜像的选择方法: 腾讯云轻量应用服务器镜像选择 轻量…...
Ruby模块和程序组织
和类一样,模块是一组方法和常量的集合。 和类不同,模块没有实例,取而代之的是可以将特殊模块的功能添加到一个类或者指定对象之中。 Class类是Module类的一个子类,因此每一个类对象也是一个模块对象 一、模块创建和基础应用 编写…...
14、SpringCloud -- WebSocket 实时通知用户
目录 实时通知用户需求:代码:前端:后端:WebSocket创建 websocket-server 服务添加依赖:配置 yml 和 启动类:前端:后端代码:注意:测试:总结:实时通知用户 需求: 用户订单秒杀成功之后,对用户进行秒杀成功通知。 弹出个提示框来提示。 代码: 前端:...
智能井盖传感器推荐,万宾科技助力城市信息化建设
随着科技产品更新换代进程加快,人工智能在人们日常生活之中逐渐普及开来,深入人们生活的方方面面,影响城市基础设施建设工程。例如在大街小巷之中的井盖作为城市基础建设的一个重要部分,一旦出现松动倾斜或凸起等异常问题…...
3D模型格式转换工具HOOPS Exchange对工业级3D产品HOOPS的支持与应用
一、概述 HOOPS Exchange是一套高性能模型转换软件库,可以给软件提供强大的模型的导入和导出功能,我们可以将其单独作为转换工具使用,也可以将其集成到自己的软件中。 同样,HOOPS 的其它产品,也离不开HOOPS Exchange…...
table 表体滚动, 表头、表尾固定
在开发报表中,如果报表数据行过多页面无法全部显示,或者内容溢出div,需要把表头和表尾固定表体滚动这样就可以在页面上全部显示,并且不会溢出div 效果:最终实现效果 代码:<!DOCTYPE html> <html&g…...
第57篇-某钩招聘网站加密参数分析【2023-10-31】
声明:该专栏涉及的所有案例均为学习使用,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!如有侵权,请私信联系本人删帖! 文章目录 一、前言二、网站分析1.X-S-HEADER参数2.请求参数data3.响应机密值data一、前言 网址: aHR0cHM6Ly93d3cubGFnb3UuY29t…...
C语言数据结构之数据结构入门
目录 数据结构介绍 数据结构发展史 何为算法 数据结构基础 基本概念和术语 四大逻辑结构(Logic Structure) 数据类型 理解复杂度概念 时间空间复杂度定义 度量时间复杂度的方法 程序运行时的内存与地址 编程预备 数据结构介绍 数据结构发展…...
如何知道服务器的某个端口是否打开
1、telnet 命令:telnet ip port,port即端口,我们一般最常见的命令就是telnet,但是telnet使用的是tcp协议,换句话说telnet只能检测tcp的这个端口打开了没 若是端口打开,会出现下列信息 失败的是这个 如…...
【ICCV‘23】One-shot Implicit Animatable Avatars with Model-based Priors
文章目录 前置知识 前置知识 1)SMPL模型 \quad SMPL这类方法只建模穿很少衣服的人体(裸体模型),它只能刻画裸体角色的动画,并不能刻画穿衣服的人体的动画 2)data-efficient \quad 这个词推荐用ÿ…...
关于息肉检测和识别项目的总结
前言 整体的思路:首先息肉数据集分为三类: 1.正常细胞 2. 增生性息肉 3. 肿瘤要想完成这个任务,首先重中之重是分割任务,分割结果的好坏, 当分割结果达到一定的准确度后,开始对分割后的结果进行下游分类…...
Jetson Xavier NX FFmpeg支持硬件编解码
最近在用Jetson Xavier NX板子做视频处理,但是CPU进行视频编解码,效率比较地下。 于是便考虑用硬解码来对视频进行处理。 通过jtop查看,发现板子是支持 NVENC硬件编解码的。 1、下载源码 因为需要对ffmpeg进行打补丁修改,因此需要编译两份源码 1.1、编译jetson-ffmpeg …...
518抽奖软件,为什么说比别的抽奖软件更美观精美?
518抽奖软件简介 518抽奖软件,518我要发,超好用的年会抽奖软件,简约设计风格。 包含文字号码抽奖、照片抽奖两种模式,支持姓名抽奖、号码抽奖、数字抽奖、照片抽奖。(www.518cj.net) 精致美观功能 字体平滑无锯齿图片放大后清晰…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...

