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

Etcd 可观测最佳实践

简介

Etcd 是一个高可用的分布式键值存储系统,它提供了一个可靠的、强一致性的存储服务,用于配置管理和服务发现。它最初由 CoreOS 开发,现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性,能保证数据在所有节点间保持同步。

Etcd 作为一个关键的分布式键值存储系统,广泛应用于 Docker、Kubernetes等分布式系统中,用于存储配置信息、服务发现、领导者选举等,它保证了集群数据的强一致性和高可用性。因此对 Etcd 可观测是非常重要的,尤其是在生产环境中,观测 Etcd 的运行指标可以帮助及时发现和解决潜在的问题,确保集群的稳定性和可靠性。

Etcd 自带 metrics 接口,可以通过 curl 命令访问默认的 “/metrics” 端点来查看可用的指标。如果 Etcd 集群配置了 TLS,还需要指定客户端证书和密钥等信息 。

curl http://<etcd-node-ip>:2379/metrics

观测云是一款统一的可观测平台,可实现对多云、云原生、中间件、应用等进行实时可观测。观测云数据的采集是通过 DataKit 来实现的,DataKit 自带的有 Etcd 采集器,不依赖 Prometheus,只需要安装 DataKit,开通 Etcd 采集器,配置 metrics url 、证书、密钥等信息,即可采集到 Etcd 指标到观测云。下面是在 Kubernetes 集群部署 DataKit 并开通 Etcd 采集器的示例。

操作步骤

部署 DataKit

登录观测云控制台,点击「集成」 -「DataKit」 - 「Kubernetes」,下载 datakit.yaml,拷贝第 3 步中的 token。

编辑 datakit.yaml ,把 token 粘贴到 ENV_DATAWAY 环境变量值中“token=”后面,设置环境变量 ENV_CLUSTER_NAME_K8S 的值并增加环境变量 ENV_NAMESPACE,这两个环境变量的值一般和集群名称对应,一个工作空间集群名称要唯一。

        - name: ENV_NAMESPACEvalue: xxxx

把 datakit.yaml 上传到可以连接到 Kubernetes 集群的主机上,执行如下命令。

kubectl apply -f datakit.yaml
kubectl get pod -n datakit

开通 Etcd 采集

KubernetesPrometheus 是 DataKit 的一个采集器,它根据自定义配置实现自动发现 Prometheus 服务并进行采集,极大简化了采集 Kubernetes 集群中 Etcd 指标的复杂度。

apiVersion: v1
kind: ConfigMap
metadata:name: datakit-confnamespace: datakit
data:etcd.conf: |-  [inputs.kubernetesprometheus]      [[inputs.kubernetesprometheus.instances]]role       = "pod"namespaces = ["kube-system"]selector   = "component=etcd,tier=control-plane"      scrape   = "true"scheme   = "https"port     = "2379"path     = "/metrics"interval = "60s"[inputs.kubernetesprometheus.instances.custom]measurement        = "etcd"job_as_measurement = false[inputs.kubernetesprometheus.instances.custom.tags]node_name        = "__kubernetes_node_name"cluster_name_k8s = "k8s-dev"[inputs.kubernetesprometheus.instances.auth]bearer_token_file = "/var/run/secrets/kubernetes.io/serviceaccount/token"[inputs.kubernetesprometheus.instances.auth.tls_config]insecure_skip_verify = falseca_certs = ["/rootfs/etc/kubernetes/pki/etcd/ca.crt"]cert     = "/rootfs/etc/kubernetes/pki/etcd/peer.crt"cert_key = "/rootfs/etc/kubernetes/pki/etcd/peer.key"
再把 etcd.conf 挂载到 DataKit 的 /usr/local/datakit/conf.d/kubernetesprometheus/etcd.conf 下面,最后重新部署 DataKit。- mountPath: /usr/local/datakit/conf.d/kubernetesprometheus/etcd.confname: datakit-confsubPath: etcd.conf

指标

登录观测云控制台,点击「指标」 -「指标管理」,输入“etcd”,就能查询采集到的指标。

Etcd 采集器默认会把所有指标都采集到观测云,为了减少时间线,需要使用 pipeline,drop 未被使用的指标。登录观测云控制台,点击「管理」 -「新建Pipeline」,选择“指标”、“etcd”,drop_key(grpc_server_started_total) 即是不采集 grpc_server_started_total 指标。

完整解析规则如下:

drop_key(grpc_server_started_total)
drop_key(etcd_cluster_version) 
drop_key(etcd_debugging_auth_revision)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_rebalance_duration_seconds_sum)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_spill_duration_seconds_sum)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_bucket)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_count)
drop_key(etcd_debugging_disk_backend_commit_write_duration_seconds_sum)
drop_key(etcd_debugging_lease_granted_total)
drop_key(etcd_debugging_lease_renewed_total)
drop_key(etcd_debugging_lease_revoked_total)
drop_key(etcd_debugging_lease_ttl_total_bucket)
drop_key(etcd_debugging_lease_ttl_total_count)
drop_key(etcd_debugging_lease_ttl_total_sum)
drop_key(etcd_debugging_mvcc_compact_revision)
drop_key(etcd_debugging_mvcc_current_revision)
drop_key(etcd_debugging_mvcc_db_compaction_keys_total)
drop_key(etcd_debugging_mvcc_db_compaction_last)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_db_compaction_pause_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_db_compaction_total_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_events_total)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_bucket)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_count)
drop_key(etcd_debugging_mvcc_index_compaction_pause_duration_milliseconds_sum)
drop_key(etcd_debugging_mvcc_pending_events_total)
drop_key(etcd_debugging_mvcc_range_total)
drop_key(etcd_debugging_mvcc_slow_watcher_total)
drop_key(etcd_debugging_mvcc_total_put_size_in_bytes)
drop_key(etcd_debugging_mvcc_watch_stream_total)
drop_key(etcd_debugging_mvcc_watcher_total)
drop_key(etcd_debugging_server_lease_expired_total)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_bucket)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_count)
drop_key(etcd_debugging_snap_save_marshalling_duration_seconds_sum)
drop_key(etcd_debugging_snap_save_total_duration_seconds_bucket)
drop_key(etcd_debugging_snap_save_total_duration_seconds_count)
drop_key(etcd_debugging_snap_save_total_duration_seconds_sum)
drop_key(etcd_debugging_store_expires_total)
drop_key(etcd_debugging_store_reads_total)
drop_key(etcd_debugging_store_watch_requests_total)
drop_key(etcd_debugging_store_watchers)
drop_key(etcd_debugging_store_writes_total)
drop_key(etcd_disk_backend_defrag_duration_seconds_bucket)
drop_key(etcd_disk_backend_defrag_duration_seconds_count)
drop_key(etcd_disk_backend_defrag_duration_seconds_sum)
drop_key(etcd_disk_backend_snapshot_duration_seconds_bucket)
drop_key(etcd_grpc_proxy_cache_hits_total)
drop_key(etcd_grpc_proxy_cache_keys_total)
drop_key(etcd_grpc_proxy_cache_misses_total)
drop_key(etcd_grpc_proxy_events_coalescing_total)
drop_key(etcd_grpc_proxy_watchers_coalescing_total)
drop_key(etcd_mvcc_db_open_read_transactions)
drop_key(etcd_mvcc_delete_total)
drop_key(etcd_mvcc_hash_duration_seconds_bucket)
drop_key(etcd_mvcc_hash_duration_seconds_count)
drop_key(etcd_mvcc_hash_duration_seconds_sum)
drop_key(etcd_mvcc_hash_rev_duration_seconds_bucket)
drop_key(etcd_mvcc_hash_rev_duration_seconds_count)
drop_key(etcd_mvcc_hash_rev_duration_seconds_sum)
drop_key(etcd_mvcc_put_total)
drop_key(etcd_mvcc_range_total)
drop_key(etcd_mvcc_txn_total)
drop_key(etcd_server_apply_duration_seconds_bucket)
drop_key(etcd_server_apply_duration_seconds_count)
drop_key(etcd_server_apply_duration_seconds_sum)
drop_key(etcd_server_client_requests_total)
drop_key(etcd_server_go_version)drop_key(etcd_server_id)
drop_key(etcd_server_is_leader)
drop_key(etcd_server_is_learner)
drop_key(etcd_server_learner_promote_successes)
drop_key(etcd_server_quota_backend_bytes)
drop_key(etcd_server_slow_apply_total)
drop_key(etcd_server_slow_read_indexes_total)
drop_key(etcd_server_version)
drop_key(etcd_snap_db_fsync_duration_seconds_bucket)
drop_key(etcd_snap_db_fsync_duration_seconds_count)
drop_key(etcd_snap_db_fsync_duration_seconds_sum)
drop_key(etcd_snap_db_save_total_duration_seconds_bucket)
drop_key(etcd_snap_db_save_total_duration_seconds_count)
drop_key(etcd_snap_db_save_total_duration_seconds_sum)
drop_key(etcd_snap_fsync_duration_seconds_bucket)
drop_key(etcd_snap_fsync_duration_seconds_count)
drop_key(etcd_snap_fsync_duration_seconds_sum)
drop_key(go_gc_duration_seconds)
drop_key(go_gc_duration_seconds_count)
drop_key(go_gc_duration_seconds_sum)
drop_key(go_goroutines)
drop_key(go_info)
drop_key(go_memstats_frees_total)
drop_key(go_memstats_gc_cpu_fraction)
drop_key(go_memstats_gc_sys_bytes)
drop_key(go_memstats_heap_idle_bytes)
drop_key(go_memstats_heap_inuse_bytes)
drop_key(go_memstats_heap_objects)
drop_key(go_memstats_heap_released_bytes)
drop_key(go_memstats_heap_sys_bytes)
drop_key(go_memstats_last_gc_time_seconds)
drop_key(go_memstats_lookups_total)
drop_key(go_memstats_mallocs_total)
drop_key(go_memstats_mcache_inuse_bytes)
drop_key(go_memstats_mcache_sys_bytes)
drop_key(go_memstats_mspan_sys_bytes)
drop_key(go_memstats_next_gc_bytes)
drop_key(go_memstats_other_sys_bytes)
drop_key(go_memstats_stack_inuse_bytes)
drop_key(go_memstats_stack_sys_bytes)
drop_key(go_memstats_sys_bytes)
drop_key(go_threads)
drop_key(grpc_server_msg_received_total)
drop_key(grpc_server_msg_sent_total)
drop_key(process_resident_memory_bytes)
drop_key(process_start_time_seconds)
drop_key(process_virtual_memory_bytes)
drop_key(process_virtual_memory_max_bytes)
drop_key(promhttp_metric_handler_requests_in_flight)
drop_key(promhttp_metric_handler_requests_total)

监控视图

登录观测云控制台,点击「场景」 -「新建仪表板」,输入 “etcd”, 选择“Etcd 监控视图”,点击“确定”。

关键指标

Etcd 的监控指标主要包括 Server、Disk 和 Network 三大类。

  • Server 指标:描述了 Etcd 服务器的状态,包括是否有 leader、leader 切换次数、已提交和已应用的提案总数、等待提交的提案数以及失败的提案数等。
  • Disk 指标:描述了磁盘操作的状态,例如 WAL fsync 调用的延迟和后端提交操作的延迟。
  • Network 指标:描述了网络状态,包括发送和接收的字节数、发送和接收失败数以及节点间的 RTT 时间等。
指标描述单位
etcd_server_has_leader这个指标表示 Etcd 集群中是否存在 Leader。count
etcd_server_health_successetcd 服务器健康检查成功的次数count
etcd_server_health_failuresetcd 服务器健康检查失败的次数count
process_resident_memory_bytes用于表示 etcd 进程当前占用的常驻内存(resident memory)大小Bytes
etcd_server_proposals_committed_total成功提交到 Raft 日志中的提案(proposals)总数count
etcd_server_proposals_applied_total成功应用或执行(Apply)的提案(proposals)总数count
etcd_server_proposals_pending当前等待处理的提案数量count
etcd_server_proposals_failed_total失败的提案总数count
etcd_mvcc_db_total_size_in_bytes数据库的总大小Bytes
etcd_disk_wal_fsync_duration_seconds_sum当前日志执行 fsync 操作的总耗时Seconds
etcd_disk_backend_commit_duration_seconds_sum后台数据库提交操作的总耗时Seconds
etcd_network_client_grpc_received_bytes_totaletcd 服务器从客户端通过 gRPC 协议接收到的总字节数Bytes
etcd_network_client_grpc_sent_bytes_totaletcd 服务器通过 gRPC 协议发送给客户端的总字节数Bytes
etcd_server_leader_changes_seen_totalleader 的切换次数count
process_open_fds操作系统进程当前打开的文件描述符数量count
process_max_fds操作系统允许一个进程打开的最大文件描述符数量count
提案(Proposal)

Etcd 基于 Raft 实现一致性算法。在 Raft 中,任何试图更改系统状态的动作都以提案(Proposal)的形式被提出。

etcd_server_proposals_pending 表示正在等待处理的 Proposal 数量。

etcd_server_proposals_committed_total 和 etcd_server_proposals_applied_total :这两个指标分别表示成功提交到 Raft 日志中的提案数量和成功应用或执行(Apply)的提案数量。它们可以帮助监控集群处理请求的能力。如果提交和应用的提案数之间存在较大差异,可能表明集群正在处理大量请求,或者存在性能瓶颈。

etcd_server_proposals_failed_total :这个指标记录了处理失败的提案数量。提案失败可能由于多种原因,包括网络问题、集群不稳定或资源限制。监控这个指标有助于及时发现和解决影响 Etcd 集群稳定性的问题。

同步时间

etcd_disk_wal_fsync_duration_seconds_bucket 和 etcd_disk_backend_commit_duration_seconds_bucket :这两个指标反映了 Etcd 存储数据的效率,高延迟可能表明磁盘性能问题或集群过载。

WAL 日志同步时间 etcd_disk_wal_fsync_duration_seconds_bucket ,表示 WAL 日志同步到磁盘时,WAL 调用 fsync 的延迟,正常应该低于10ms,当 99 百分位的 fsync 延迟超过某个阈值(比如 100 毫秒)时触发告警。

库同步时间 etcd_disk_backend_commit_duration_seconds_bucket ,当 etcd 将其最新的增量快照提交到磁盘时,会调用 backend_commit , 正常应该低于120ms。

Leader 是否存在

etcd_server_has_leader :这个指标表示 Etcd 集群中是否存在 Leader。Leader 对于 Etcd 集群至关重要,因为它负责处理所有的写请求。0 表示不是,1表示是,如果这个值为 0,意味着集群中没有 Leader,这将导致写操作无法进行,整个集群不可用。因此,监控这个指标可以帮助及时发现集群是否处于正常工作状态。

Leader 切换频次

etcd_server_leader_changes_seen_total 指标,记录了 leader 的切换次数。当 Etcd 通过 Raft 协议选举出 leader 后,leader 应该是固定不变的。频繁的 Leader 切换可能是由于网络问题或集群不稳定造成的,这会影响集群的性能和稳定性。监控这个指标有助于发现潜在的网络问题或集群健康问题。生产环境如果在一个小时内发生超过三次的 leader 切换,需要触发告警。

监控器(告警)

通过合理配置监控器,可以及时处理 etcd 故障,观测云也提供了相应的模板供客户参考使用。

Leader 监控器

值为 0 触发紧急告警。

Leader 频繁切换监控

如需更多监控器可以按照实际生产需求进行配置。

总结

总之,对 Etcd 进行可观测,是确保分布式系统稳定运行的关键步骤,观测云是一款实用的可观测产品,建议把生产环境中 Etcd 接入观测云,使用观测云的监控器对重要指标进行监控告警。

相关文章:

Etcd 可观测最佳实践

简介 Etcd 是一个高可用的分布式键值存储系统&#xff0c;它提供了一个可靠的、强一致性的存储服务&#xff0c;用于配置管理和服务发现。它最初由 CoreOS 开发&#xff0c;现在由 Cloud Native Computing Foundation (CNCF) 维护。Etcd 使用 Raft 算法来实现数据的一致性&…...

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考&#xff0c;切勿违法使用下载他人资源进行售卖&#xff0c;本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…...

centos下面的jdk17的安装配置

文章目录 1.基本指令回顾2.jdk17的安装到这个centos上面2.1首先切换到这个root下面去2.2查看系统jdk版本2.3首先到官网找到进行下载2.4安装包的上传2.5jdk17的安装包的解压过程2.6配置环境变量2.7是否设置成功&#xff0c;查看版本 1.基本指令回顾 ls:list也就是列出来这个目录…...

【操作系统】——调度

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 处理机调度的概念、层次 进程调度的时机、切换与过程、方式 调度器和闲逛进程 处理机调度的概念、层…...

基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell

基于Aspose依赖添加自定义文本水印——Word、Pdf、Cell 所需依赖Word水印Pdf水印——&#xff08; 注意 pdf 存在找不到字体的问题&#xff09;Excel水印 所需依赖 <dependency><groupId>com.aspose</groupId><artifactId>aspose-pdf</artifactId&g…...

【C++】—掌握STL string类:字符串操作的得力助手

#1024程序员节&#xff5c;征文# 文章目录 繁星点点映夜空&#xff0c;晨曦微露照前程1.string的基本概念2.标准库中的string类2.1 string类2.2 auto和范围for2.3 string类常用的接口2.4 string类对象的容量操作2.5 string类对象的访问及遍历操作2.6 string类对象的修改操作2…...

【Java笔记】第十四章:异常

一、概念【理解即可】 1. 异常&#xff1a;程序运行过程中&#xff0c;出现的非正常情况。 2. 异常的处理&#xff1a;当异常出现时&#xff0c;执行一段预先准备好的代码。 3. 异常的处理的必要性&#xff1a;减少用户的损失、同时减小给用户带来麻烦&#xff0c;也可以对用…...

Python游戏开发超详细(基础理论知识篇)

一、引导&#xff1a; Python游戏开发是一个非常有趣且富有挑战性的领域。通过Python&#xff0c;你可以利用其强大的库和框架来创建各种类型的游戏&#xff0c;从简单的2D游戏到复杂的3D游戏。以下是第一课的基础理论知识&#xff0c;帮助你入门Python游戏开发。 二、理论知识…...

Python开发日记 -- 实现bin文件的签名

目录 1.数据的不同表现形式签名值不一样&#xff1f; 2.Binascii模块简介 3.问题定位 4.问题总结 1.数据的不同表现形式签名值不一样&#xff1f; Happy Muscle试运行了一段时间&#xff0c;组内同事再一次提出了新的需求&#xff1a;需要对bin文件签名。 PS&#xff1a;服…...

微软运用欺骗性策略大规模打击网络钓鱼活动

微软正在利用欺骗性策略来打击网络钓鱼行为者&#xff0c;方法是通过访问 Azure 生成外形逼真的蜜罐租户&#xff0c;引诱网络犯罪分子进入以收集有关他们的情报。 利用收集到的数据&#xff0c;微软可以绘制恶意基础设施地图&#xff0c;深入了解复杂的网络钓鱼操作&#xff…...

小程序无法获取头像昵称以及手机号码的深度剖析与解决方案

在当今数字化时代,小程序以其便捷、高效的特点,成为了人们生活和工作中不可或缺的一部分。然而,有时候开发者会遇到小程序无法获取头像昵称以及手机号码的问题,这给用户体验和业务流程带来了极大的困扰。本文将深入探讨这个问题的原因,并提供相应的解决方案。 一、引言 小…...

从0到1,搭建vue3项目

一 Vite创建Vue3项目 1.1.创建Vue3项目 1.1.1.运行创建项目命令 # 使用 npm npm create vitelatest 1.1.2、填写项目名称 1.1.3、选择前端框架 1.1.4、选择语法类型 1.1.5、按提示运行代码 1.1.6浏览器问 localhost:5173 预览 1.2项目结构 1.2.1vite.config.ts 1.2.2 pac…...

Mybatis mapper文件 resultType和resultMap的区别

在 MyBatis 中&#xff0c;resultType 和 resultMap 都用于定义从数据库查询结果到 Java 对象的映射规则&#xff0c;但它们之间存在着一些关键的区别。以下是对这两者的详细说明和区别&#xff1a; 1. resultType 定义 resultType 是 MyBatis 查询语句中的一个属性&#xf…...

文件下载漏洞

文件安全 文件下载 常见敏感信息路径 Windows C:\boot.ini //查看系统版本 C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件 C:\Windows\repair\sam //存储系统初次安装的密码 C:\Program Files\mysql\my.ini //Mysql配置 C:\Program Files\mysql\data\mysql\user.…...

【Flutter】状态管理:Provider状态管理

在 Flutter 开发中&#xff0c;状态管理是一个至关重要的部分。随着应用的规模和复杂性增加&#xff0c;简单的局部状态管理&#xff08;如 setState() 和 InheritedWidget&#xff09;可能变得难以维护和扩展。Provider 是一种推荐的、广泛使用的 Flutter 状态管理工具&#x…...

来个Oracle一键检查

启停、切换、升级、网络改造等场景下&#xff0c;需要对数据库有些基本检查操作&#xff0c;确认当前是否运行正常&#xff0c;主打一个简单和一键搞定。 #!/bin/bash## 实例个数 告警日志 实例状态 会话 活动会话 锁 集群状态 服务状态 磁盘空间 侦听日志 ## linux vmstat 2 …...

C语言中的分支与循环(中 1)

关系操作符 C语言用于比较的表达式&#xff0c;称为"关系表达式"&#xff0c;里面使用的运算符称为关系运算符&#xff0c;关系运算符主要有以下6类。 > 大于运算符< 小于运算符>大于等于运算符< 小于等于运算符 相等运算符! 不相等运算符 下面是例子:…...

Git_GitLab

Git_GitLab 安装 服务器准备 安装包准备 编写安装脚本 初始化 GitLab 服务 启动 GitLab 服务 浏览器访问 GitLab GitLab 创建远程库 IDEA 集成 GitLab 安装 GitLab 插件 设置 GitLab 插件 安装 服务器准备 准备一个系统为 CentOS7 以上版本的服务器&#xff0c;使…...

如何自定义一个自己的 Spring Boot Starter 组件(从入门到实践)

文章目录 一、什么是 Spring Boot Starter&#xff1f;二、为什么要自定义 Starter&#xff1f;三、自定义 Starter 的基本步骤1. 创建 Maven 项目2. 配置 pom.xml3. 创建自动配置类4. 创建业务逻辑类5. 创建 spring.factories 四、使用自定义 Starter五、总结推荐阅读文章 在使…...

CSS伪元素以及伪类和CSS特性

伪元素&#xff1a;可以理解为假标签。 有2个伪元素 &#xff08;1&#xff09;::before &#xff08;2&#xff09;::after ::before <!DOCTYPE html> <html> <head><title></title><style type"text/css">body::before{con…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

Unit 1 深度强化学习简介

Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库&#xff0c;例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体&#xff0c;比如 SnowballFight、Huggy the Do…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...

TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?

在工业自动化持续演进的今天&#xff0c;通信网络的角色正变得愈发关键。 2025年6月6日&#xff0c;为期三天的华南国际工业博览会在深圳国际会展中心&#xff08;宝安&#xff09;圆满落幕。作为国内工业通信领域的技术型企业&#xff0c;光路科技&#xff08;Fiberroad&…...

高分辨率图像合成归一化流扩展

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 1 摘要 我们提出了STARFlow&#xff0c;一种基于归一化流的可扩展生成模型&#xff0c;它在高分辨率图像合成方面取得了强大的性能。STARFlow的主要构建块是Transformer自回归流&#xff08;TARFlow&am…...

leetcode_69.x的平方根

题目如下 &#xff1a; 看到题 &#xff0c;我们最原始的想法就是暴力解决: for(long long i 0;i<INT_MAX;i){if(i*ix){return i;}else if((i*i>x)&&((i-1)*(i-1)<x)){return i-1;}}我们直接开始遍历&#xff0c;我们是整数的平方根&#xff0c;所以我们分两…...