当前位置: 首页 > news >正文

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

OpenAI故障复盘 - 阿里云容器服务与可观测产品如何保障大规模K8s集群稳定性

本文作者:

容器服务团队:刘佳旭、冯诗淳

可观测团队:竺夏栋、麻嘉豪、隋吉智

一、前言

Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准(CNCF Survey[1])。随着承接的业务规模越来越大,用户也在使用越来越大的 K8s 集群。Kubernetes 官方建议的最大集群规模是 5000 节点。甚至,如 OpenAI 通过技术优化,曾将 K8s 集群扩展至 7500 节点(Scaling Kubernetes to 7,500 nodes[2])。这种千级别节点的大规模 K8s 集群,会容易引起分布式系统内部瓶颈,但也增加了系统的脆弱性。

1.1 OpenAI 故障复盘分析

近日 OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时间 12 月 11 日下午 3 点左右起发生严重中断。故障的根因是在上线获取集群控制面监控数据的新的新可观测功能时,可观测的组件会在每个集群节点上对 K8s Resource API 发起访问,突发造成巨大的 Kubernetes API 负载,导致 K8s 控制平面瘫痪,进而使 DNS 服务发现功能中断,最终影响到了业务。(OpenAI 故障报告[3])

1.2 阿里云如何保障大规模 K8s 集群稳定性,以应对如此故障

这次故障在阿里云产品体系中直接相关的是阿里云容器服务(Kubernetes),以及阿里云可观测产品(Prometheus、Telemetry)产品。

故,我们对本次 OpenAI 故障高度重视,希望借此机会介绍我们在大规模 K8s 场景下我们的建设与沉淀。以及分享对类似故障问题的应对方案:包括在 K8s 和 Prometheus 的高可用架构设计方面、事前事后的稳定性保障体系方面。

阿里云容器服务团队(负责 Kubernetes 云产品)与阿里云可观测团队(负责 Prometheus 云产品)旨在为用户提供稳定可靠的 K8s 集群环境,以及使用可观测体系帮助用户构建全面的稳定性保障体系。我们的客户也有非常多上千节点的大规模 K8s 集群环境,在大规模 K8s 集群的稳定性保障体系方面有一定经验沉淀。

OpenAI 的大规模集群故障也是我们很好的学习案例,这里本文想借助这次案例为契机:

1. 介绍阿里云容器服务(K8s)、可观测团队(Prometheus)的大规模集群稳定性建设。

2. 以及用户在大规模 K8s 集群场景下的最佳实践,用户也需要采用正确的使用方式才能一起保障大规模 K8s 集群的稳定性。

二、当 K8s 集群规模过大会遇到哪些风险与挑战

K8s 集群控制面/数据面数据流图

2.1 K8s 集群的本质是分布式系统,剖析其中瓶颈才能对症下药

首先我们要简单介绍下 K8s 集群控制面、数据面的大致架构:

控制面负责集群的 API 层、调度、资源管理、云资源管理等控制面功能,K8s 组件:

apiserver/etcd/scheduler/kube-controller-manger/cloud-controller-manager

数据面负责集群的节点管理、Pod 生命周期管理、Service 实现等数据面功能,承载业务 Pod 的主体。包含:K8s 组件,kubelet/kube-proxy;系统组件,日志、监控、安全等组件;其他组件,用户业务组件。

控制面、数据面和云资源是有机结合的整体!集群的全链路中,任何一个组件、子链路成为瓶颈,都可能影响到集群的整体稳定性。

我们需要从 K8s 系统中发现瓶颈、治理以及优化瓶颈,最终实现 K8s 系统在给定云资源情况下的稳定、高效的利用。

三、稳定性增强-阿里云在大规模 K8s 集群场景的保障增强

3.1 大规模容器服务 ACK 集群的稳定性保障机制增强

大规模 ACK 集群通过高可用配置、托管组件稳定性增强和系统组件优化等综合技术,对集群的的稳定性进行全面优化和提升。

通过控制面可用区级别和节点级别的高可用配置,全部控制面组件实现高可用打散。以 APIServer 为例,多副本跨 AZ、跨节点高可用部署方式,任何一个 AZ 失效不影响服务可用性。在 3AZ 地域,ACK 托管集群控制面的 SLA 是 99.95%。对于不具备 3AZ 的地域,ACK 托管集群控制面 SLA 是 99.5%(不具备单可用区的故障容忍)。

托管核心组件进行弹性、资源隔离、限流、请求处理能力等方面的稳定性优化,例如:APIServer 支持自动弹性 VPA+HPA、etcd 支持基于推荐资源画像的 VPA、APIServer 的动态限流等等。

ACK 系统组件严格按照最佳规范进行优化和改造,降低对控制面的压力,包括:对控制面的 LIST 请求、消除对控制面资源消耗大的请求;对非 CRD 资源的 API 序列化协议不使用 JSON,统一使用 Protobuf 等等。

3.2 阿里云 Prometheus 对大规模集群场景的增强

本次导致 OpenAI 故障的根因是上线新的可观测能力时发生的,这里在阿里云体系中,直接对应着可观测团队容器监控产品-阿里云 Prometheus。

阿里云 Prometheus 与容器服务一直以来深度合作,对上千节点的大规模 K8s 场景也有很多深入的沉淀和建设。

不管是本次 OpenAI 故障直接相关的容器服务 K8s 控制面观测能力[4],还是数据可靠性上,还是可观测组件本身对集群造成的负载上,都有重点优化建设。以下是一些具体的工作内容:

更智能的服务发现与多副本采集架构 - 消除热点

阿里云 Prometheus 结合支撑众多阿里云产品、阿里集团内部大规模生产集群中可观测能力建设的多年经验,首先对采集探针架构完成了升级改造,实现控制本次 OpenAI 所遇到故障爆炸半径与影响面的目标

我们采用两级角色体系解耦了 Prometheus 采集过程中的两类关注点:

1. Master 角色负责实时地服务发现、任务调度与配置分发

• 所有标准类型的资源对象数据均通过二进制 Protobuf 编码获取,以便在大规模环境中获得更好的性能

• 默认仅一个 Pod 实例对 K8s API Server 建立 List && Watch 通信,降低 API Server 访问压力

• 在必要情况下通过主备双副本实现高可用工作

2. Worker 角色负责高效地指标采集、Metric Relabel 处理与数据上报

• 可依据采集目标规模以及各个目标上暴露的指标量规模进行 Scale Out

• 由于 Worker 不直接对 K8s API Server 通信,扩大角色实例数量对 API Server 无影响

阿里云 Prometheus 部署、数据流架构图

这正是阿里云 Prometheus 采集探针相对于目前业界众多社区开源或商业版本探针的重要区别,该架构实现保障了采集能力的扩展绝不会对 API Server 等关键组件造成冲击——并不是直接引入 StatefulSet、DaemonSet 工作负载模式实现多副本的采集。

特别地,通过“配置管理中心”的服务端能力建设解除了配置分发行为对 K8s API Server 的依赖,进一步降低访问压力。此外,Master 与 Worker 的自监控指标同步上报云端存储,供云产品工程师实时掌握各采集探针的运行状况、性能水位与异常信息,确保及时对故障集群进行告警与应急。

适应大规模集群的 Exporters 优化改造 - 减少负载

完成采集探针自身改造,支撑万级目标稳定高效采集的同时,我们也对 Kubernetes+Prometheus 社区生态中常见 Exporter 在大规模集群中的运行稳定性进行了重写与优化。

以 kube-state-metrics 为例,作为 K8s 集群资源可观测事实意义上的标准,它在面临海量资源对象(不仅仅 Pod,还有 ConfigMap、Ingress、Endpoint 等)情况下需要更多的内存运行资源来避免 OOMKilled,当节点规格限制不足以执行 VPA 操作时,官方推荐方案仍然是通过 StatefulSet 工作负载拉起多个 kube-state-metrics 副本,并且每个实例都对 K8s API Server 执行完整的 List&Watch 访问后,再通过 Shard Hash 的方式来实现 HPA 的目标——这同样会酿生本次 OpenAI 的故障。

为此,我们也积极拥抱大数据社区的前沿技术,如:通用内存列式数据格式,对 kube-state-metrics 进行重构改写,获得更高的数据压缩比,通过单副本运行即可实现大规模集群中资源状态指标的稳定产出,避免造成对 K8s API Server 的访问压力。

实现业务故障隔离的托管采集探针 - 旁路采集方案

传统 Prometheus 采集探针直接部署在用户容器集群内,对集群内服务发现的采集目标定期抓取指标数据并上报阿里云 Prometheus 数据网关。

虽然云产品工程师具备对采集探针专业化的运维监控技能,但由于没有直接操作集群环境的权限,以往线上技术支持流程,都依赖将命令发给用户执行操作,不仅效率低,并且可能遇到交流中理解不一致导致的排查方向错误。

另外当灾难发生时,由于采集探针与业务同集群无法正常工作,但灾难阶段又正是用户最需要一双“眼睛”来观测系统与业务的受损程度的时候。

因而,我们着手转向 Serverless 这种服务模型。Prometheus 采集探针本质上是个 Probe,不一定要部署在用户集群,只要满足网络打通的条件,所有探针运行在云产品托管的集群池中,即可将采集能力 Serverless 化,不仅可降低用户集群资源负担,也有助于提升组件运维的灵活度。

在 OpenAI 本次故障中,由可观测组件引起 K8s API Server/ CoreDNS 服务不可用,同时导致集群内所有的观测活动陷入瘫痪,在最需要可观测的时刻,却进入了盲区。而使用托管探针模式,则将观测组件本身与集群的故障隔离开来。尽管由于 API Server 不可用,无法及时发现新的监控目标,但已调度下发的采集任务仍可继续执行,数据上报至云端存储也不再依赖于集群内的 CoreDNS。

综上,使用托管形态的阿里云 Prometheus 容器监控服务可以屏蔽用户环境复杂性,组件运行稳定性得到了更好的保障,为更快的灾难恢复提供架构支撑,在这种灾难性故障下,托管探针模式的阿里云 Prometheus 容器监控服务依然能够确保一定程度的数据完整性。

可靠的数据链路 - "out-of-band" 带外数据链路建设

可观测性的另一个挑战是,监控采集组件如果部署在用户集群侧,当集群环境出现问题时,监控系统也会一并宕掉,不能起到观测异常现场的作用。

阿里云容器服务通过建设“带外数据链路(out-of-band)”来解决此问题。

ControlPlane 组件自身监控数据的带外数据链路

反映集群稳定性的关键指标、ControlPlane 组件的监控指标[5]数据,通过托管侧的组件透出数据,不受集群本身环境影响,我们内部称为“带外数据链路(out-of-band)”。当集群本身异常时,只会影响和集群内部环境相关的“带内链路(in-band)”,而不会影响这些“带外数据链路(out-of-band)”。保证了集群稳定性的关键数据的可靠性。

阿里云容器服务托管集群,通过部署单独的组件监控 ControlPlane 组件自身的监控数据。当关键控制面组件异常时,保证监控数据的可靠性。

容器层以下的节点的虚拟机、硬件、操作系统层问题的带外数据链路

同理,集群关键组件的事件、能感知集群中的节点(ECS)底层异常的主动运维事件,也通过“带外数据链路”(out-of-band)直接写入到用户的 SLS 事件中心中。

以此方案形成与用户集群环境完全解耦的数据源、数据采集链路,保证监控数据的可靠性。

参考文档:容器服务托管节点池[6]对 ECS 系统事件[7]的透出。

四、最佳实践 - 用户如何正确地使用大规模 K8s 集群

K8s 本质是一个非常易用的分布式系统,分布式系统由于 PAC 原则,永远都存在承载能力的上限。

这里就还是需要 K8s 集群的用户,不管作为 K8s 组件开发者,还是 K8s 运维人员,采用正确的使用方式来使用 K8s 集群,才能在千级别节点的大规模 K8s 集群中保证集群的稳定性。

在此经过阿里云容器服务团队的经验沉淀,我们提供涵盖事前预防观测、事后快速定位和恢复的成熟产品能力,帮助用户构建集群稳定性运维体系。

4.1 集群规模控制(容量规划)&正确的发布流程(安全发布流程)

首先,站在运维的角度来看,我们需要时刻考虑减小爆炸半径。

首先当用户的业务规模还未发展成需要一个大规模 K8s 集群来承载的程度时,我们建议用户通过合理的容量规划来控制集群规模的大小,如可以通过微服务架构等方式,拆分业务的部署结构在不同的集群上,以此来减小 K8s 规模。

其次,站在发布的安全生产流程上,我们需要考虑可灰度、可回滚、可监控的安全发布最佳实践。且每批灰度间隔需要充分观测逻辑是否符合预期,且在观测到异常问题后应该马上回滚。

4.2 事前 - 观测能力与关键报警配置

成熟的集群控制面观测能力

首先用户可以通过我们阿里云容器服务提供的集群 ControlPlane 观测能力,清晰感知到集群控制面组件的当前状态。我们提供 ACK 集群控制面监控大盘[8],以及控制面组件日志监控[9]功能,帮助用户清晰透明地观测集群稳定性问题。

查看 ACK 集群控制面监控大盘[8]

在我们遇到的典型大规模集群故障场景,如下图:

场景 1:用户侧组件异常请求泛滥,导致 APIServer 负载过高;

场景 2:大请求导致的 K8s 集群 SLB 带宽被打满,导致 APIServerRT 飙升、或者只读请求飙升。

我们可以通过集群控制面观测能力剖析问题,样例如下:

上面可观测能力可以帮助决策出精准的诊断路径:

【问题快速发现】依据 API-Server 指标水位进行问题定位。

【根因快速定位】依据 API-Server 访问日志定位问题瓶颈应用,并精准降级,详见本文 4.3.4 节,如何快速定位对控制面组件造成主要压力的“元凶”请求组件,并快速降级。

【止血/闭环问题】停止/优化应用的 List-Watch 资源行为、性能,最佳实践参考本文 4.2.3 节,阿里云的组件稳定性优化。

经历经验沉淀的关键报警规则

虽然有强大的可观测能力,但用户不可能每时每刻盯着监控大盘,阿里云容器服务报警中心功能[10]为客户提供经过经验沉淀的 K8s 集群运维关键报警规则模版。

其中包括上文所提到的集群核心组件异常报警规则,可以覆盖如 ControlPlane 组件异常、APIServer 的 SLB 带宽打满等场景的预警。

非常推荐用户确保这些报警规则开启并订阅通知到负责集群运维的 SRE 人员。您只需要购买集群时默认开启报警规则;或在容器服务控制台,运维管理->报警配置中开启规则并添加通知对象即可订阅。

开发 K8s 组件的最佳实践

规范组件 LIST 请求

必须使用全量 LIST 时添加 resourceVersion=0,从 APIServer cache 读取数据,避免一次请求访问全量击穿到 etcd;从 etcd 读取大量数据,需要基于 limit 使用分页访问。加快访问速度,降低对控制面压力。

序列化编码方式统一

对非 CRD 资源的 API 序列化协议不使用 JSON,统一使用 Protobuf,相比于 JSON 更节省传输流量。

优选使用 Informer 机制

大规模场景下,频繁 LIST 大量资源会对管控面 APIServer 和 etcd 产生显著压力。频繁 LIST 的组件需要切换使用 Informer 机制。基于 Informer 的 LIST+WATCH 机制优雅的访问控制面,提升访问速度,降低对控制面压力。

客户端访问资源频度

客户端控制访问大规模全量资源的频度,降低对管控的资源和带宽压力。

对 APIServer 访问的中继方案

大规模场景下,对于 Daemonset、ECI pod 等对 APIServer 进行访问的场景,可以设计可横向扩容的中继组件,由中继组件统一访问 APIServer,其他组件从中继组件获取数据。例如 ACK 的系统组件 poseidon 在 ECI 场景下作为 networkpolicy 中继使用。降低管控的资源和带宽压力,提升稳定性。

当前阿里云 Prometheus 也是采用此类中继逻辑来减少的集群负载,从而避免随 K8s 和部署应用的规模笛卡尔积式地增大对集群的负载,当然此类中继逻辑都需要针对组件定制开发。

4.3 事后 - 快速恢复与止血

K8s 故障的应急处理与快速恢复,不仅需要建立常态化的故障演练和应急支撑机制,还应涵盖从故障发生到恢复的全链路响应流程,包括故障的实时监测、精准定位,以及问题的及时解决。

定期演练和应急预案

需要通过定期开展演练与评估,持续优化和演进应急预案,可以提升整体故障应对能力和恢复速度,减少故障对业务的影响时长和严重程度。这种系统性的能力建设,将为 K8s 环境的稳定性和可靠性提供强有力的保障。

从具体应急措施的角度,控制面由于请求压力过大导致出现无响应、OOM 甚至雪崩,本质上需要限制请求,尤其是 LIST 大量资源的请求,这些请求处理的过程中对 etcd 和 apiserver 都会带来显著的开销;apiserver 作为 etcd 的一种缓存,集群中全部资源会缓存在 apiserver 内存中,与此同时请求到达 apiserver 后,apiserver 处理请求过程中产生的编解码也会占用缓存,如果请求频繁而且请求资源数量巨大,都会导致控制面 apiserver 内存骤增。

同时,在有条件的情况下,尽量扩容 Master 节点/组件内存和 CPU 资源。在实际应急中,这个措施出于硬件资源的限制不总是能满足,此时就需要更加依靠限流策略应急。

应急的限流策略

应急的限流策略包括(1)降低 apiserver inflight request 参数,需要重启 APIServer 或者(2)根据监控发现访问压力过大的请求,下发在故障演练充分验证过的 APF 限流规则,包括针对指定 UA(例如 OpenAI 案例中的 Telemetry 组件对应的 UA)实现动态生效的限流效果。

CoreDNS 缓存策略可能会造成误导

注意,不建议做 CoreDNS 的永久缓存[11](serve_stale 开启),当真实发生集群控制面异常时,延长 CoreDNS 内的缓存并不能延续业务 Pod 的正常运转状态,CoreDNS 内过期缓存的 DNS 解析关系会让业务 Pod 发起的访问触达到完全错误的 IP 地址。

并且 CoreDNS 的缓存时长会一定程度上掩盖控制面组件已经异常的现象,造成集群还正常运转的假象,增加排查难度与排查时间。

快速定位对控制面组件造成主要压力的“元凶”请求组件,并快速降级

如何通过控制面监控大盘,定位到主要压力来源。

通过 daemonset 方式部署的组件,并对集群控制面有高频率、大范围的 list、watch 请求是我们所遇到的集群控制面故障的最大元凶。

(阿里云容器服务 APIServer 监控大盘的客户端粒度分析)

阿里云容器服务 APIServer 监控大盘,提供追溯调用来源方 client/操作资源 resource/操作行为 verb 等细粒度指标。

帮助 K8s 集群用户在出现控制面高负载预警或故障时能准确定位到大负载压力的来源,并帮助决策快速降级掉“元凶”应用,快速恢复整个集群稳定性。

admission controller (准入控制器) 造成的压力

K8s 提供动态准入(Dynamic Admission Control)能力,由 admissionwebhook 配置以及 admissioncontroller 组成,是 K8s 非常杰出的机制,能像 AOP 一样帮助进行集群资源生命周期的改造行为。

但是 admissionwebhook 是第二大部分我们遇到的集群控制面故障的元凶,admissionwebhook 由于会把用户自定义行为加入到 K8s 关键的资源生命周期中,可能加大 K8s 集群本身的不稳定性。同时由于 admissionwebhook 会拦截所有监听的 k8s 对象的请求,若定义不当,admissionwebhook 在大规模 K8s 集群下会产生海量的 APIServer 负担。阿里云容器服务的控制面监控大盘专门设计,希望通过控制面监控大盘,定位到 admission controller 造成的压力。

(阿里云容器服务 APIServer 监控大盘的准入控制 admissionwebhook 负载分析)

五、总结

K8s 是业界主流的基础设施架构,Prometheus 也已经成为新一代指标监控的实施标准,我们面对的是巨大的客户体量,超大规模的 K8s 集群可能遇到的风险及挑战是不可避免的。

我们只有持续关注故障沉淀下来的经验,希望通过一次次故障事件学习并自审,不断优化,才能在应对挑战时更加从容,以求更好地为用户提供更稳定、更可靠的基础设施。

链接

[01] CNCF Survey

https://www.cncf.io/reports/cncf-annual-survey-2023/

[02] Scaling Kubernetes to 7,500 nodes

https://openai.com/index/scaling-kubernetes-to-7500-nodes/

[03] OpenAI 故障报告

https://status.openai.com/incidents/ctrsv3lwd797

[04] 容器服务 K8s 控制面观测能力

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/monitor-control-plane-components/?spm=a2c4g.11186623.0.i1

[05] ControlPlane 组件的监控指标

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/monitor-control-plane-components/?spm=a2c4g.11186623.help-menu-85222.d_2_9_3_4.2532123eK3yhIa

[06] 容器服务托管节点池

https://www.alibabacloud.com/help/zh/ack/ack-managed-and-ack-dedicated/user-guide/overview-of-managed-node-pools?spm=a2c63.p38356.0.i5

[07] ECS 系统事件

https://www.alibabacloud.com/help/zh/ecs/user-guide/overview-of-ecs-system-events?spm=a2c63.p38356.0.i11#DAS

[08] ACK 集群控制面监控大盘

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/view-control-plane-component-dashboards-in-ack-pro-clusters?spm=a2c4g.11186623.0.i3

[09] 控制面组件日志监控

https://www.alibabacloud.com/help/zh/ack/ack-managed-and-ack-dedicated/user-guide/collect-control-plane-component-logs-of-ack-managed-cluster?spm=a2c63.p38356.help-menu-85222.d_2_9_2_5.43d44d31DICEnA

[10] 报警中心功能

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/alert-management?spm=a2c4g.11186623.0.i2

[11] CoreDNS 的永久缓存

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/dns-resolution-policies-and-caching-policies?spm=a2c4g.11186623.help-menu-85222.d_2_3_6_2.416b26cbrKataV#section-wvr-c0p-mtx

相关文章:

OpenAI 故障复盘 - 阿里云容器服务与可观测产品如何保障大规模 K8s 集群稳定性

本文作者: 容器服务团队:刘佳旭、冯诗淳 可观测团队:竺夏栋、麻嘉豪、隋吉智 一、前言 Kubernetes(K8s)架构已经是当今 IT 架构的主流与事实标准(CNCF Survey[1])。随着承接的业务规模越来越大,用户也在使…...

【深度学习】Pytorch:加载自定义数据集

本教程将使用 flower_photos 数据集演示如何在 PyTorch 中加载和导入自定义数据集。该数据集包含不同花种的图像,每种花的图像存储在以花名命名的子文件夹中。我们将深入讲解每个函数和对象的使用方法,使读者能够推广应用到其他数据集任务中。 flower_ph…...

vue js实现时钟以及刻度效果

2025.01.08今天我学习如何用js实现时钟样式&#xff0c;效果如下&#xff1a; 一、html代码如下&#xff1a; <template><!--圆圈--><div class"notice_border"><div class"notice_position notice_name_class" v-for"item in …...

js基础---注释与结束符

JavaScript 基础&#xff1a;注释与结束符 注释 注释是代码中用于解释说明的部分&#xff0c;不会被执行&#xff0c;主要有两种类型&#xff1a; 单行注释 符号&#xff1a;//作用&#xff1a;从符号开始到该行末尾的所有内容都会被忽略&#xff0c;不会被执行。示例代码&…...

from pytorch3d import _C问题

离线安装pytorch3d后&#xff0c;先测试&#xff1a; import pytorch3d 没问题后&#xff0c;再测试&#xff1a; from pytorch3d import _C 单独测试会出现&#xff1a; ImportError: libc10.so: cannot open shared object file: No such file or directory 或者类似不…...

PHP进阶-在Ubuntu上搭建LAMP环境教程

本文将为您提供一个在Ubuntu服务器上搭建LAMP&#xff08;Linux, Apache, MySQL, PHP&#xff09;环境的完整指南。通过本文&#xff0c;您将学习如何安装和配置Apache、MySQL、PHP&#xff0c;并将您的PHP项目部署到服务器上。本文适用于Ubuntu 20.04及更高版本。 一、系统更新…...

SQLite 命令

关于《SQLite 命令》的文章&#xff0c;我可以为您提供一个概要。SQLite是一个轻量级的嵌入式关系数据库管理系统&#xff0c;它以单个文件的形式存储数据&#xff0c;非常适合用于不需要传统数据库服务器的场景。SQLite3的命令行工具&#xff08;sqlite3.exe&#xff09;是一个…...

ASP.NET Core 实现微服务 - Consul 配置中心

这一次我们继续介绍微服务相关组件配置中心的使用方法。本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大&#xff0c;还是让我爱不起来。因为前面我们已经介绍了使用Consul 做为服务注册发现的组件 &#xff0c;那么干脆继续使用 Consul 来作为配置…...

自定义Java注解及其应用

上一篇博客&#xff1a;Java注解 写在前面&#xff1a;大家好&#xff01;我是晴空๓。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正&#xff0c;感谢大家的不吝赐教。我的唯一博客更新地址是&#xff1a;https://ac-fun.blog.csdn.net/。非常感谢大家的支持。…...

回归预测 | MATLAB实GRU多输入单输出回归预测

回归预测 | MATLAB实GRU多输入单输出回归预测 目录 回归预测 | MATLAB实GRU多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实GRU多输入单输出回归预测。使用GRU作为RNN的一种变体来处理时间序列数据。GRU相比传统的RNN有较好的记…...

ISP流程--去马赛克详解

前言 本期我们将深入讨论ISP流程中的去马赛克处理。我们熟知&#xff0c;彩色图像由一个个像元组成&#xff0c;每个像元又由红、绿、蓝&#xff08;RGB&#xff09;三通道构成。而相机传感器只能感知光的强度&#xff0c;无法直接感知光谱信息&#xff0c;即只有亮暗而没有颜色…...

用户注册模块用户校验(头条项目-05)

1 用户注册后端逻辑 1.1 接收参数 username request.POST.get(username) password request.POST.get(password) phone request.POST.get(phone) 1.2 校验参数 前端校验过的后端也要校验&#xff0c;后端的校验和前端的校验是⼀致的 # 判断参数是否⻬全 # 判断⽤户名是否…...

【大数据】Apache Superset:可视化开源架构

Apache Superset是什么 Apache Superset 是一个开源的现代化数据可视化和数据探索平台&#xff0c;主要用于帮助用户以交互式的方式分析和展示数据。有不少丰富的可视化组件&#xff0c;可以将数据从多种数据源&#xff08;如 SQL 数据库、数据仓库、NoSQL 数据库等&#xff0…...

如何搭建 Vue.js 开源项目的 CI/CD 流水线

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…...

OCR文字识别—基于PP-OCR模型实现ONNX C++推理部署

概述 PaddleOCR 是一款基于 PaddlePaddle 深度学习平台的开源 OCR 工具。PP-OCR是PaddleOCR自研的实用的超轻量OCR系统。它是一个两阶段的OCR系统&#xff0c;其中文本检测算法选用DB&#xff0c;文本识别算法选用CRNN&#xff0c;并在检测和识别模块之间添加文本方向分类器&a…...

国产3D CAD将逐步取代国外软件

在工业软件的关键领域&#xff0c;计算机辅助设计&#xff08;CAD&#xff09;软件对于制造业的重要性不言而喻。近年来&#xff0c;国产 CAD 的发展态势迅猛&#xff0c;展现出巨大的潜力与机遇&#xff0c;正逐步改变着 CAD 市场长期由国外软件主导的格局。 国产CAD发展现状 …...

GoLand 如何集成 Netty?

目录 1.回答问题&#xff1a; 2.以下是实现类似 Netty 功能的步骤&#xff1a; 2.1 实现基本的网络通信功能&#xff1a; 3. 使用 Go 的第三方库实现 Netty 功能 4.实现类似 Netty 的事件循环&#xff1a; 5. 运用场景&#xff1a; 1.回答问题&#xff1a; 要在 GoLand 中…...

C++中 为什么要把基类指针指向子类对象?

为什么要把基类指针指向子类对象&#xff1f; 1&#xff09;实现多态性 动态绑定行为&#xff1a;通过基类指针指向子类对象&#xff0c;可以利用 C 的多态机制。当基类中有虚函数&#xff0c;并且子类重写了这些虚函数时&#xff0c;通过基类指针调用虚函数&#xff0c;实际调…...

2025年第三届“华数杯”国际赛A题解题思路与代码(Matlab版)

游泳竞技策略优化模型代码详解&#xff08;MATLAB版&#xff09; 第一题&#xff1a;速度优化模型 本部分使用MATLAB实现游泳运动员在不同距离比赛中的速度分配策略优化。 1. 模型概述 模型包含三个主要文件&#xff1a; speed_optimization.m: 核心优化类plot_speeds.m: …...

做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

图&#xff1a; 股票自选助手 这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据&#xff0c;支持添加、删除和更新股票信息。 功能特点 支持添加自选股票实时显示股票价格和涨跌幅一键更新所有股票数据支持删除不需要的股票使用中…...

深入探索 ScottPlot.WPF:在 Windows 桌面应用中绘制精美图表的利器

一、ScottPlot.WPF 简介 ScottPlot.WPF 是基于 ScottPlot 绘图库专门为 Windows Presentation Foundation (WPF) 框架量身定制的强大绘图组件。它无缝集成到 WPF 应用程序中,为开发者提供了一种简洁、高效的方式来可视化数据,无论是科学研究中的实验数据展示、金融领域的行情…...

Spring bean的生命周期和扩展

接AnnotationConfigApplicationContext流程看实例化的beanPostProcessor-CSDN博客&#xff0c;以具体实例看bean生命周期的一些执行阶段 bean生命周期流程 生命周期扩展处理说明实例化:createBeanInstance 构造方法&#xff0c; 如Autowired的构造方法注入依赖bean 如UserSer…...

【Docker】docker compose 安装 Redis Stack

注&#xff1a;整理不易&#xff0c;请不要吝啬你的赞和收藏。 前文 Redis Stack 什么是&#xff1f; 简单来说&#xff0c;Redis Stack 是增强版的 Redis &#xff0c;它在传统的 Redis 数据库基础上增加了一些高级功能和模块&#xff0c;以支持更多的使用场景和需求。Redis…...

Life Long Learning(李宏毅)机器学习 2023 Spring HW14 (Boss Baseline)

1. 终身学习简介 神经网络的典型应用场景是,我们有一个固定的数据集,在其上训练并获得模型参数,然后将模型应用于特定任务而无需进一步更改模型参数。 然而,在许多实际工程应用中,常见的情况是系统可以不断地获取新数据,例如 Web 应用程序中的新用户数据或自动驾驶中的…...

JavaEE之线程池

前面我们了解了多个任务可以通过创建多个线程去处理&#xff0c;达到节约时间的效果&#xff0c;但是每一次的线程创建和销毁也是会消耗计算机资源的&#xff0c;那么我们是否可以将线程进阶一下&#xff0c;让消耗计算机的资源尽可能缩小呢&#xff1f;线程池可以达到此效果&a…...

错误修改系列---基于RNN模型的心脏病预测(pytorch实现)

前言 前几天发布了pytorch实现&#xff0c;TensorFlow实现为&#xff1a;基于RNN模型的心脏病预测(tensorflow实现)&#xff0c;但是一处繁琐地方 一处错误&#xff0c;这篇文章进行修改&#xff0c;修改效果还是好了不少&#xff1b;源文章为&#xff1a;基于RNN模型的心脏病…...

修改之前的代码使得利用设备树文件和Platform总线设备驱动实现对多个LED的驱动【只是假想对LED进行驱动,并没有实际的硬件操作】

引言 在下面这篇博文中&#xff1a; 利用Linux的Platform总线设备驱动实现对多个LED的驱动【只是假想对LED进行驱动,并没有实际的硬件操作】 我们利用Platform总线设备驱动的思想实现了对多个LED的驱动。 Platform总线设备驱动以及其它的总线设备驱动都将驱动分成了三个部分…...

从CentOS到龙蜥:企业级Linux迁移实践记录(龙蜥开局)

引言&#xff1a; 在我们之前的文章中&#xff0c;我们详细探讨了从CentOS迁移到龙蜥操作系统的基本过程和考虑因素。今天&#xff0c;我们将继续这个系列&#xff0c;重点关注龙蜥系统的实际应用——特别是常用软件的安装和配置。 龙蜥操作系统&#xff08;OpenAnolis&#…...

多云架构,JuiceFS 如何实现一致性与低延迟的数据分发

随着大模型的普及&#xff0c;GPU 算力成为稀缺资源&#xff0c;单一数据中心或云区域的 GPU 资源常常难以满足用户的全面需求。同时&#xff0c;跨地域团队的协作需求也推动了企业在不同云平台之间调度数据和计算任务。多云架构正逐渐成为一种趋势&#xff0c;然而该架构下的数…...

Jenkins持续集成与交付安装配置

Jenkins 是一款开源的持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;工具&#xff0c;它主要用于自动化软件的构建、测试和部署流程。为项目持续集成与交付功能强大的应用。下面我们来介绍下它的安装与配置。 环境准备 更新系统组件&#xff08;这…...

十大排序简介

十大排序简介 一、排序分类二、排序思路1&#xff0e;冒泡排序&#xff08;Bubble Sort&#xff09;2&#xff0e;选择排序&#xff08;Selection Sort&#xff09;3&#xff0e;插入排序&#xff08;Insertion Sort&#xff09;4&#xff0e;希尔排序&#xff08;Shell Sort&a…...

uniapp小程序中隐藏顶部导航栏和指定某页面去掉顶部导航栏小程序

uniappvue3开发小程序过程中隐藏顶部导航栏和指定某页面去掉顶部导航栏方法 在page.json中 "globalStyle": {"navigationStyle":"custom",}, 如果是指定某个页面关闭顶部导航栏&#xff0c;在style中添加"navigationStyle": "cus…...

echarts:dataZoom属性横向滚动条拖拽不生效

问&#xff1a; 拖拽的过程中&#xff0c;第一次向右拖拽正常&#xff0c;然后就报错&#xff1a; echarts报错&#xff1a; var pointerOption pointerShapeBuilder[axisPointerType](axis,pixeValue,otherExtent),(axis,pixeValue,otherExtent)下划线红色报错&#xff1a;…...

【Leetcode 热题 100】739. 每日温度

问题背景 给定一个整数数组 t e m p e r a t u r e s temperatures temperatures&#xff0c;表示每天的温度&#xff0c;返回一个数组 a n s w e r answer answer&#xff0c;其中 a n s w e r [ i ] answer[i] answer[i] 是指对于第 i i i 天&#xff0c;下一个更高温度…...

R数据分析:多分类问题预测模型的ROC做法及解释

有同学做了个多分类的预测模型,结局有三个类别,做的模型包括多分类逻辑回归、随机森林和决策树,多分类逻辑回归是用ROC曲线并报告AUC作为模型评估的,后面两种模型报告了混淆矩阵,审稿人就提出要统一模型评估指标。那么肯定是统一成ROC了,刚好借这个机会给大家讲讲ROC在多…...

如何用 SSH 访问 QNX 虚拟机

QNX 虚拟机默认是开启 SSH 服务的&#xff0c;如果要用 SSH 访问 QNX 虚拟机&#xff0c;就需要知道虚拟机的 IP 地址&#xff0c;用户和密码。本文我们来看看如何获取这些参数。 1. 启动虚拟机 启动过程很慢&#xff0c;请耐心等待。 2. 查看 IP 地址 等待 IDE 连接到虚拟机。…...

交响曲-24-3-单细胞CNV分析及聚类

CNV概述 小于1kb是常见的插入、移位、缺失等的变异 人体内包含<10% 的正常CNV&#xff0c;我们的染色体数是两倍体&#xff0c;正常情况下&#xff0c;只有一条染色体表达&#xff0c;另一条沉默&#xff0c;当表达的那条染色体发生CNV之后&#xff0c;表达数量就会成倍增加…...

java远程调试debug

文章目录 首先被调试的服务配置idea 中配置远程调试连接上被调试服务打断点开始调试 首先被调试的服务配置 被调试的 java 服务需要开启允许被远程调试的配置&#xff0c;具体就是启动脚本中&#xff0c;加上允许被远程调试以及相应端口 # 针对JDK15.-1.8 -agentlib:jdwptran…...

操作系统之系统调用

系统调用 从上文简介得知&#xff0c;操作系统是计算机硬件和软件之间的桥梁&#xff0c;通过管理计算机软件和硬件资源&#xff0c;最终为我们用户提供服务。就如同一个管家帮助我们对CPU&#xff08;进程&#xff09;的管理、内存的管理、设备的管理、文件的管理。而我们如何…...

【docker】exec /entrypoint.sh: no such file or directory

dockerfile生成的image 报错内容&#xff1a; exec /entrypoint.sh: no such file or directory查看文件正常在此路径&#xff0c;但是就是报错没找到。 可能是因为sh文件的换行符使用了win的。...

CAPL概述与环境搭建

CAPL概述与环境搭建 目录 CAPL概述与环境搭建1. CAPL简介与应用领域1.1 CAPL简介1.2 CAPL的应用领域 2. CANoe/CANalyzer 安装与配置2.1 CANoe/CANalyzer 简介2.2 安装CANoe/CANalyzer2.2.1 系统要求2.2.2 安装步骤 2.3 配置CANoe/CANalyzer2.3.1 配置CAN通道2.3.2 配置CAPL节点…...

ML-Agents:智能体(三)

注&#xff1a;本文章为官方文档翻译&#xff0c;如有侵权行为请联系作者删除 Agent - Unity ML-Agents Toolkit–原文链接> ML-Agents&#xff1a;智能体&#xff08;一&#xff09; ML-Agents&#xff1a;智能体&#xff08;二&#xff09; ML-Agents&#xff1a;智能体&a…...

【harbor】离线安装2.9.0-arm64架构服务制作和升级部署

执行: .prepare 【作用就是产生一些配置信息 和docker-compose.yaml文件&#xff0c;然后docker-compose发布docker】 harbor官网地址&#xff1a;Harbor 参考文档可以看这里&#xff1a;部署 harbor 2.10.1 arm64 - 简书。 前提环境准备&#xff1a; 安装docker 和 docker…...

可视化-Visualization

可视化-Visualization 1.Introduction Visualization in Open CASCADE Technology is based on the separation of: on the one hand – the data which stores the geometry and topology of the entities you want to display and select, andon the other hand – its pr…...

完整化安装kubesphere,ks-jenkins的状态一直为init

错误描述&#xff1a; 打印日志&#xff1a; kubectl describe pod ks-jenkins-7fcff7857b-gh4g5 -n kubesphere-devops-system 日志描述如下&#xff1a; Events: Type Reason Age From Message ---- ------ ---- …...

halcon三维点云数据处理(十)locate_cylinder_3d

目录 一、locate_cylinder_3d例程代码二、gen_binocular_rectification_map函数三、binocular_disparity函数四、自定义函数select_best_candidates五、自定义函数remove_shadowed_regions 一、locate_cylinder_3d例程代码 1、读取或者创建3D形状模型&#xff0c; 2、根据双目…...

【CSS】设置滚动条样式

文章目录 基本语法用法案例 基本语法 在CSS中&#xff0c;可以使用 ::-webkit-scrollbar 和相关伪元素来为滚动条设置样式&#xff0c;但请注意这些伪元素是非标准的&#xff0c;主要用于WebKit内核浏览器&#xff08;如Chrome、Safari&#xff09;。 ::-webkit-scrollbar CSS …...

一个运行在浏览器中的开源Web操作系统Puter本地部署与远程访问

文章目录 前言1.关于Puter2.本地部署Puter3.Puter简单使用4. 安装内网穿透5.配置puter公网地址6. 配置固定公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站…...

支持selenium的chrome driver更新到131.0.6778.264

最近chrome释放新版本&#xff1a;131.0.6778.264 如果运行selenium自动化测试出现以下问题&#xff0c;是需要升级chromedriver才可以解决的。 selenium.common.exceptions.SessionNotCreatedException: Message: session not created: This version of ChromeDriver only s…...

conda+jupyter+pycharm:如何在Windows conda环境下运行jupyter并使用浏览器或者pycharm运行.ipynb

1 安装conda 2 conda环境下安装jupyter pip install jupyter3 设置jupyter配置文件 1&#xff09;创建 jupyter_notebook_config.py文件 jupyter notebook --generate-config 2&#xff09;设置密码 3&#xff09;设置参数 直接将以下参数修改为自己的配置后复制到配置文件…...