Apache Mesos 1.6.0 深度解析:持久卷扩缩容、操作反馈、jemalloc 内存剖析与 Docker 韧性增强
集群管理任务调度后端【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos1/mesos点击查看免费下载Apache Mesos 1.6.0 于 2018 年 5 月 11 日发布是 Mesos 1.x 系列中工程含金量很高的一版它引入了持久卷persistent volume的实验性扩缩容操作GROW_VOLUME/SHRINK_VOLUME为 scheduler 提供了 offer 操作级别的可靠反馈机制接入 jemalloc 内存分配器以改善分配性能并支持运行时内存剖析同时针对 Docker daemon 无响应场景强化了 containerizer 与 executor 的容错能力。本文基于 Mesos 仓库中的发布说明、proto 定义与源码实现逐项拆解这四大改进的设计、使用方式与底层原理帮助运维者和框架开发者准确评估升级影响并正确使用这些新特性。1. 持久卷扩缩容GrowVolume 与 ShrinkVolume 操作Mesos 1.6 最重要的功能改进是为持久卷提供了实验性的 resize 支持新增GrowVolume与ShrinkVolume两种 offer operation允许框架在运行中调整已创建持久卷的大小。这一能力同时可通过 Scheduler HTTP API 的 ACCEPT 调用 与 Operator HTTP API 发起。1.1 Proto 定义操作语义一目了然在 include/mesos/mesos.proto 中Operation.Type枚举新增了两种类型proto 中明确标注EXPERIMENTALenum Type { UNKNOWN 0; LAUNCH 1; LAUNCH_GROUP 6; RESERVE 2; UNRESERVE 3; CREATE 4; DESTROY 5; GROW_VOLUME 11; // EXPERIMENTAL. SHRINK_VOLUME 12; // EXPERIMENTAL. CREATE_DISK 13; // EXPERIMENTAL. DESTROY_DISK 14; // EXPERIMENTAL. }两种操作的消息体定义见 include/mesos/mesos.proto// Grow a volume by an additional disk resource. // NOTE: This is currently experimental and only for persistent volumes // created on ROOT/PATH disk. message GrowVolume { required Resource volume 1; // 被扩容的持久卷含 disk.persistence 与 volume 信息 required Resource addition 2; // 需要追加的 disk 资源量 } // Shrink a volume by the size specified in the subtract field. // NOTE: This is currently experimental and only for persistent volumes // created on ROOT/PATH disk. message ShrinkVolume { required Resource volume 1; // 需要缩小的容量见 Value.Scalar 关于精度的注释 required Value.Scalar subtract 2; }在Operation消息中两者分别以optional GrowVolume grow_volume 13与optional ShrinkVolume shrink_volume 14挂载见 include/mesos/mesos.proto。注意两个关键设计点GrowVolume通过追加一个additiondisk 资源实现扩容语义与RESERVE一致——资源以Resource表达ShrinkVolume用Value.Scalar subtract字段表示要减去的容量Scalar只支持有限的十进制小数精度proto 注释特意提示参见Value.Scalar的精度说明。1.2 Operator API 调用示例Operator HTTP API 文档 给出了两种操作的完整 JSON 示例。GROW_VOLUMEPOST /api/v1 HTTP/1.1 Host: masterhost:5050 Content-Type: application/json { type: GROW_VOLUME, grow_volume: { agent_id: { value: 919141a8-b434-4946-86b9-e1b65c8171f6-S0 }, volume: { disk: { persistence: { id: id1, principal: my-principal }, volume: { container_path: path1, mode: RW } }, name: disk, role: role1, scalar: { value: 64.0 }, type: SCALAR }, addition: { name: disk, role: role1, scalar: { value: 64.0 }, type: SCALAR } } }SHRINK_VOLUME 结构类似用subtract指定要减去的量{ type: SHRINK_VOLUME, shrink_volume: { agent_id: { value: 919141a8-b434-4946-86b9-e1b65c8171f6-S0 }, volume: { disk: { persistence: { id: id1, principal: my-principal }, volume: { container_path: path1, mode: RW } }, name: disk, role: role1, scalar: { value: 128.0 }, type: SCALAR }, subtract: { value: 64.0 } } }两种请求的响应均为HTTP/1.1 202 Accepted——请求被 master 受理后异步转发到持久卷所在的 agent 执行这也解释了为什么这类操作天然需要配合操作状态反馈见下一节来确认最终结果。1.3 源码实现链路从源码结构看master 侧的处理集中在 src/master/http.cppGROW_VOLUME调用处理逻辑校验call.has_grow_volume()与slave_id存在性随后将请求中的volume与addition资源拷贝进Operation对象并调用validateOperation做能力capabilities校验、通过authorize检查 ACL操作对象为ActionObject::growVolume(...)/shrinkVolume(...)最终走sendOperation将操作下发到 agent。相关校验规则在 src/master/validation.cpp 中实现。适用范围限制根据发布说明与 proto 注释该功能目前仅支持创建在 agent 默认磁盘资源ROOT/PATH disk上的持久卷即 CSI 卷尚不支持 resize。这是实验阶段的重要约束生产使用前应确认卷的底层来源。持久卷的完整生命周期可参见 docs/persistent-volume.md。2. Offer Operation Feedback操作状态更新机制Mesos 1.6 引入了实验性的offer 操作状态更新operation status updates机制。此前只有Launch与LaunchGroup能通过 task status update 获得反馈其他操作Reserve、Unreserve、Create、Destroy等一旦失败scheduler 往往无从得知只能靠对账reconciliation兜底。2.1 工作机制opt-in 可靠投递机制的核心流程是选择性订阅scheduler 在Operation消息中设置id字段OperationID表示希望接收该操作的反馈。proto 注释include/mesos/mesos.proto明确说明其用途// The id field allows frameworks to indicate that they wish to receive // // feedback about an operation via the UPDATE_OPERATION_STATUS event in the // v1 scheduler API. optional OperationID id 12; // EXPERIMENTAL.状态推送master 通过 scheduler API 的UPDATE_OPERATION_STATUS事件推送OperationStatus消息。include/mesos/scheduler/scheduler.proto 中定义了对应的Event.UpdateOperationStatusmessage UpdateOperationStatus { required OperationStatus status 1; }可靠投递与确认与 task status update 的语义一致——若操作状态更新携带了唯一uuidscheduler必须通过ACKNOWLEDGE_OPERATION_STATUS调用确认接收未确认的更新会被持续重试。Scheduler HTTP API 文档docs/scheduler-http-api.md说明了确认语义uuid字段是 Base64 编码的原始字节scheduler 不得确认没有uuid的更新那些更新不会被重试。OperationStatus消息本身include/mesos/mesos.proto携带了丰富的上下文message OperationStatus { optional OperationID operation_id 1; // 对应当前操作的 ID required OperationState state 2; // 操作状态如 OPERATION_FINISHED optional string message 3; // 人类可读的附加信息 repeated Resource converted_resources 4; // 操作完成后的资源形态OPERATION_FINISHED 时 optional UUID uuid 5; // 可靠投递标识 optional SlaveID slave_id 6; // 本地资源提供方场景 optional ResourceProviderID resource_provider_id 7; // 资源提供方场景 }2.2 典型价值Reserve / Create 失败的感知与重试这一机制直接提升了Reserve、Create等操作的可靠性当操作失败且 scheduler 已订阅反馈时master 会发送操作状态更新scheduler 可据此决定是否重试。例如某框架执行RESERVE失败后若未订阅反馈则资源状态与框架认知逐渐漂移订阅后框架可在收到失败状态时立即重发操作或走对账流程。适用范围限制发布说明指出操作反馈目前仅限于作用于 resource provider 所提供资源上的操作——多数情况下即 CSI 卷相关操作。这与OperationStatus中resource_provider_id字段的定位相呼应。内部调用链可参考 include/mesos/resource_provider/resource_provider.proto 中的UpdateOperationStatus/AcknowledgeOperationStatus消息定义。3. jemalloc 内存分配器性能提升与内存剖析Mesos 1.6 提供了对 jemalloc 通用内存分配库的实验性支持。其价值有两面一是高并发分配场景下相比系统默认分配器可能带来的内存分配性能提升二是通过命令行标志与环境变量启用运行时内存剖析帮助运维者理解 Mesos 在生产环境中的内存行为为后续性能优化提供数据基础。3.1 接入 jemalloc 的三种方式jemalloc 内存剖析文档 详述了接入方式与 src/master/flags.cpp 中--memory_profiling标志的帮助文本互相印证推荐方式编译时指定--enable-jemalloc-allocator使mesos-master与mesos-agent二进制静态链接 Mesos 捆绑的、以正确编译参数构建的 jemalloc自定义版本类似 Mesos 的其他捆绑依赖可通过--with-jemallocpath使用自建版本但该版本必须用--enable-stats与--enable-prof构建且 malloc 配置需包含prof:true;prof_active:false构建时或运行时满足均可LD_PRELOAD运行时用LD_PRELOAD预加载系统中的libjemalloc.solibprocess 的MemoryProfiler类会自动检测并启用剖析支持对应源码 3rdparty/libprocess/src/memory_profiler.cpp。值得注意的是即使完全不用内存剖析功能由于 jemalloc 本就为高并发分配场景设计仅为了分配性能也值得以 jemalloc 构建 Mesos。3.2 运行时开关与 HTTP 剖析端点启用剖析的前提是进程使用 jemalloc 作为分配器且以--memory_profilingtrue启动mesos-agent/mesos-master其他基于 libprocess 的二进制可设置环境变量LIBPROCESS_MEMORY_PROFILINGtrue。--memory_profiling标志默认为false其帮助文本明确指出即使设为 true若未通过编译期链接或LD_PRELOAD将 jemalloc 加载进进程地址空间剖析仍不会生效。剖析数据分两类通过一组 HTTP 端点暴露内存统计/statisticshttp://example.org:5050/memory-profiler/statistics返回当前内存占用的精确 JSON 统计已分配字节数、分配大小分布等无参数。由于返回的 JSON 较大建议将结果重定向到文件再分析。堆剖析heap profilingjemalloc 按配置的概率分布对malloc()调用采样并存储栈回溯可导出为堆剖析文件http://example.org:5050/memory-profiler/start?duration5mins # 启动一次剖析 http://example.org:5050/memory-profiler/state # 查看剩余时间 http://example.org:5050/memory-profiler/stop # 提前停止由于剖析信息在进程内是全局的同一时刻只允许一次剖析运行且磁盘上只保留最近一次完成的运行结果。剖析结果提供三种下载格式download/raw纯文本原始回溯内存地址列表可用 jemalloc 项目提供的jeprof工具交互式分析download/text调用宿主机上的jeprof将地址替换为人类可读符号名要求jeprof在PATH上且二进制保留符号信息download/graph返回 SVG 调用图要求jeprof与dot均可用。剖析产物默认写入TMPDIR若设置下的随机目录否则写入/tmp的子目录。3.3 命令行自动化示例文档 给出了一个简单的自动化下载脚本#!/bin/bash SECONDS600 HOSTexample.org:5050 curl ${HOST}/memory-profiler/start?duration${SECONDS} sleep $((${SECONDS} 1)) wget ${HOST}/memory-profiler/download/raw更严谨的脚本应保存/start返回的id并作为参数传给/download以确认下载的是同一次运行的结果。3.4 MALLOC_CONF 原生接口jemalloc 还提供MALLOC_CONF环境变量这一原生控制接口具备 libprocess 端点未暴露的能力例如按分配量或高水位自动 dump。例如# 每记录 1 GiB 分配量自动生成一次 dump2^20 字节 × lg_prof_interval 换算 MALLOC_CONFprof:true,prof_prefix:/path/to/folder,lg_prof_interval20 # 在访问 /start 端点之前即开启剖析用于调试早期启动阶段的分配 MALLOC_CONFprof:true,prof_active:true需要注意的约束若 libprocess 检测到剖析已通过MALLOC_CONF启动它会拒绝再启动自己的剖析运行以避免相互干扰反过来运行时启停剖析与/statistics统计信息无法通过MALLOC_CONF实现。完整选项列表以 jemalloc 手册页为准。4. Docker 改进守护进程无响应时的韧性处理针对运维中 Mesos 配合 Docker container runtime 时的常见痛点——Docker daemon 短暂无响应导致容器操作失败——1.6 对 Docker containerizer 与 executor 做了多项改进在若干关键位置加入重试与超时逻辑使得 daemon 短时挂起时 Mesos 能够自行恢复并回到正常状态。从源码可以印证这一改进的落点。src/docker/docker.cpp 中Docker类的 inspect 等关键操作普遍带有retryIntervalOptionDuration参数当容器尚未创建完成时通过Clock::timer按固定间隔重试docker inspect见 src/docker/docker.cpp而非立即失败_stop等路径也引入了显式的Duration超时处理见 src/docker/docker.cpp。这类按间隔重试 超时兜底的模式正是发布说明所述daemon 短时挂起可恢复的实现基础。相关改进对应的上游议题可参考 Mesos JIRA 的 MESOS-8572Docker 容器运行器文档 描述了该运行器的整体工作方式。5. 升级注意事项gRPC 与 CSI 版本约束从 1.5.0 升级到 1.6.0 在多数情况下很顺利但 升级指南 记录了三个必须了解的硬性约束gRPC 版本要求构建 Mesos 时启用 gRPC 相关功能现在要求gRPC 1.10 及以上使用非捆绑 gRPC 的构建需先升级 gRPC 库。当前仓库捆绑的版本可见 3rdparty/cmake/Versions.cmakeGRPC_VERSION已提升至更高版本并配套 grpc patch 用于 3rdparty/CMakeLists.txt 的外部依赖构建流程CSI v0.2 支持 / v0.1 移除1.6 新增对 Container Storage Interface v0.2 的实验性支持CSI v0.1 的实验性支持被移除而非简单弃用。由于 v0.1 与 v0.2 不兼容升级 agent 前必须移除该 agent 内的所有 storage 本地资源提供方否则属于破坏性变更新增 agent 标志--fetcher_stall_timeout用于在镜像/构件下载速度持续低于 1 字节/秒时中止下载仅适用于网络下载不适用于 HDFS--xfs_kill_containers使 disk/xfs isolator 能够终止超出磁盘限额的容器。磁盘 profile 适配模块也随 CSI v0.2 支持进行了改造其头文件按其他模块的命名习惯重命名接口变更见disk_profile_adaptor.hpp。6. 小结Mesos 1.6.0 的四大改进指向同一个目标——让资源操作在运行时更可控、更可观测持久卷不再创建后凝固GROW_VOLUME/SHRINK_VOLUME让容量可以动态调整当前限于 agent 默认磁盘上的卷Operation.idOperationStatus的可靠反馈机制让Reserve、Create等操作从发了就不知道变为可感知、可重试当前限于资源提供方场景jemalloc 接入让内存分配性能与运行时剖析成为标配选项Docker 路径的重试与超时逻辑降低了 daemon 抖动对集群的冲击。所有新特性在 proto 中均标注EXPERIMENTAL生产启用前建议先在测试集群验证并严格遵循 docs/upgrades.md 中关于 gRPC 版本与 CSI 提供方迁移的升级步骤。赞分享集群管理任务调度后端【免费下载链接】mesosApache Mesos项目地址https://gitcode.com/gh_mirrors/mesos1/mesos点击查看免费下载相关推荐Exercises Dataset 全指南1,324 个健身动作的六语运动数据层从 JSON Schema 到数据库与 API 集成Exercises Dataset 全指南1,324 个健身动作的六语运动数据层从 JSON Schema 到数据库与 API 集成 导读 本文围绕开源仓库集群管理任务调度后端Disque持久化机制深度剖析AOF与内存管理策略Disque持久化机制深度剖析AOF与内存管理策略 在分布式消息队列Message Queue消息队列领域数据可靠性与性能的平衡始终是开发者面临的核心消息队列后端Lucky 从零部署一条 Docker 命令到端口转发可访问Lucky 从零部署一条 Docker 命令到端口转发可访问 昨晚出差客户临时要远程访问办公室的 NAS 取文件。这事平时得赶回家改路由器设置这次必须就地后端网络通信上一篇kill-doc 免费文档下载脚本安装与使用指南3 步跑通首次下载附 30 平台支持清单下一篇trackerslist 快速教程:3 步把每日更新的公共 Tracker 列表接入你的 BT 客户端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

ESP32舵机控制全攻略:硬件PWM、电源隔离与多路协同

ESP32舵机控制全攻略:硬件PWM、电源隔离与多路协同

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 8:45:04 阅读更多 →
neox-tools:解析网易NPK资源包的开源命令行工具链

neox-tools:解析网易NPK资源包的开源命令行工具链

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 8:45:04 阅读更多 →
Agent全插件化架构:解耦、容错与可回放的工程实践

Agent全插件化架构:解耦、容错与可回放的工程实践

1. 为什么“全插件化”不是炫技,而是Agent工程化的必然选择 我第一次看到DeepSeek Harness的架构文档时,心里其实是有点犯嘀咕的——把整个Agent框架拆成几十个独立插件,每个插件只负责一个原子能力,连日志记录都要单独抽成 Sess…

2026/10/13 8:45:04 阅读更多 →

最新新闻

fontTools.misc.testTools 测试工具深度指南:用 TTX 片段与 FakeFont 为字体代码编写单元测试

fontTools.misc.testTools 测试工具深度指南:用 TTX 片段与 FakeFont 为字体代码编写单元测试

开发工具 【免费下载链接】fonttools A library to manipulate font files from Python. 项目地址: https://gitcode.com/gh_mirrors/fo/fonttools 点击查看 免费下载 fontTools.misc.testTools 是 fontTools 项目内置的单元测试辅助模块(API 文档见 Do…

2026/10/13 9:34:21 阅读更多 →
多智能体队列控制:基于状态契约与PID反馈的实时协同算法

多智能体队列控制:基于状态契约与PID反馈的实时协同算法

1. 项目概述:这不是军训,是用算法解构“人形像素点”的队列控制问题“士兵队列训练”这五个字一出来,很多人第一反应是操场、口令、正步、汗水——但如果你真把它当成一个纯体力活来处理,那在实际项目落地时大概率会卡在第三天。我…

2026/10/13 9:34:21 阅读更多 →
开源时间序列标注工具TimeTagger部署与优化指南

开源时间序列标注工具TimeTagger部署与优化指南

1. 项目背景与核心价值时间序列数据标注是数据分析领域的基础工作,但市面上成熟的标注工具往往存在两个痛点:一是需要将敏感数据上传到第三方平台,二是缺乏针对时间序列特性的专业标注功能。TimeTagger作为开源的时间序列标注工具&#xff0c…

2026/10/13 9:34:21 阅读更多 →
aiogram 中的 MessageOriginChat 类型详解:掌握“以聊天名义转发“的消息来源机制

aiogram 中的 MessageOriginChat 类型详解:掌握“以聊天名义转发“的消息来源机制

后端即时通讯API设计 【免费下载链接】aiogram aiogram is a modern and fully asynchronous framework for Telegram Bot API written in Python using asyncio 项目地址: https://gitcode.com/gh_mirrors/ai/aiogram 点击查看 免费下载 导读 本文围绕 aiogram 的…

2026/10/13 9:34:21 阅读更多 →
ModLens工业视觉工具:轻量级模板匹配与JSON驱动识别实战

ModLens工业视觉工具:轻量级模板匹配与JSON驱动识别实战

1. 项目概述:ModLens 是什么,为什么值得花时间搞懂它ModLens 这个名字乍一听像某个开源视觉库的代号,但实际它不是 OpenCV 的分支,也不是 PyTorch Vision 的插件——它是一个面向工业级图像识别场景的轻量级前端驱动型视觉分析工具…

2026/10/13 9:34:21 阅读更多 →
go-zero-looklook 订单服务实战解析:从下单 API 到 Asynq 延迟关单的完整链路

go-zero-looklook 订单服务实战解析:从下单 API 到 Asynq 延迟关单的完整链路

后端微服务 【免费下载链接】go-zero-looklook 🔥基于go-zero(go zero) 微服务全技术栈开发最佳实践项目。Develop best practice projects based on the full technology stack of go zero (go zero) microservices. 项目地址: https://gitcode.com/gh_…

2026/10/13 9:33:16 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →