自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(162)
  • 资源 (4)
  • 收藏
  • 关注

原创 [snapshot]6-CRIU逻辑

NVIDIA Snapshot 采用两阶段快照:先用 cuda-checkpoint-helper 锁定并保存 GPU 状态,使 CUDA 映射可被 CRIU 拍摄;再由 Go 编写的 agent 通过 go-criu/swrk 模式调用 CRIU dump CPU/内存/文件描述符。Agent 不加载 CRIU 插件,而是通过自定义 snapshot_inet_remap.so 和隔离的 libDir 避免上游 cuda_plugin 干扰。Restore 时,CRIU 先恢复进程树,再由 helper

2026-10-28 14:55:41 154

原创 [snapshot]5-cuda-checkpoint依赖

本文详解 [snapshot] 项目中 GPU checkpoint 的三层 CUDA 依赖:第1层为 NVIDIA 驱动提供的 cuCheckpoint* API,真正实现显存冻结与恢复;第2层是 Snapshot 自研的 cuda-checkpoint-helper,将驱动接口封装为可控 CLI,供 Go agent 调用;第3层为官方 cuda-checkpoint 工具与 CRIU 插件,用于多卡启动时的 job 协调及 CRIU 框架集成。三者叠加,唯第1层真正冻 GPU,其余为封装、启动与协同。

2026-10-27 14:34:38 127

原创 [snapshot]4-cuda-checkpoint分析

CUDA-Checkpoint 是 NVIDIA 提供的用于冻结与恢复进程 CUDA 状态的工具,核心能力由 libcuda.so 驱动实现。它允许在不中断应用的前提下,将显存、上下文等 GPU 状态保存至主机内存,配合 CRIU 实现完整进程快照。其关键函数如 cuCheckpointProcessLock、Checkpoint、Restore 等通过外部工具调用,依赖驱动版本支持(≥550)。该技术适用于推理服务等需快速恢复的场景,但需注意:快照时须临时解冻 restore 线程,且仅限于支持的驱动版本

2026-10-26 10:05:24 217

原创 [snapshot]3-CUDA与CRIU内存及命名空间

capture时,CUDA状态(显存、context、stream等)被拷入进程主机内存,GPU腾空;CRIU dump则将进程虚拟内存、文件描述符等写入磁盘。restore时,CRIU在目标容器namespace中重建进程树,但GPU状态仍为空;随后CUDA restore将内存中的状态回传至GPU,完成恢复。因restore需进入目标容器的pid/mnt/net等namespace以正确重建进程与资源关系,故出现“另一套”namespace。容器内看到的PID与最内层PID不同,源于嵌套namespac

2026-10-16 14:00:10 303

原创 [snapshot]2-snapshot部署

本文介绍在已有GPU Kubernetes集群上部署Snapshot控制面与节点Agent的流程,涵盖组件职责、前置条件、镜像配置及安装步骤。通过Helm安装operator与特权agent,依赖CRIU和cuda-checkpoint实现GPU工作负载的capture/restore。需满足x86_64架构、NVIDIA驱动≥580、containerd/crio运行时、RWX PVC等要求。部署后通过CRD管理快照,restore via Pod注解触发,支持跨节点恢复。适用于测试环境,不可用于生产。

2026-10-15 10:04:50 202

原创 [snapshot]1-snapshot内部逻辑

NVIDIA Dynamo Snapshot 采用双层 CRD 设计:PodSnapshot(namespaced)作为用户意图句柄,PodSnapshotContent(cluster-scoped)记录物理快照元信息与节点绑定。前者解耦权限与生命周期,后者实现跨节点共享存储的统一管理。快照通过 SnapshotJob 启动一次性 Job,dump 成功后容器被终止(退出码非0),但不影响 PodSnapshot 标记为 Ready;仅当所有非目标容器正常退出后,Job 才标记完成并清理。数据落盘于集群共

2026-10-14 14:47:00 156

原创 [snapshot]0-NVIDIA Dynamosnapshot介绍

NVIDIA Dynamo Snapshot 通过 CRIU 与 cuda-checkpoint 实现 GPU 推理 worker 的状态快照,解决初始化成本高的问题。它将已运行的 worker 冻结为磁盘 artifact(含 CPU/GPU 状态、差量文件),支持跨节点快速恢复,省去模型加载与 warmup。基于 Kubernetes CRD 构建,分控制面(Operator)与节点代理(Agent),实现 capture/restore 解耦。当前为开发阶段,支持单容器、需共享存储与匹配硬件,暂不适用

2026-10-10 15:20:03 367

原创 [NVSentinel] syslog-health-monitor模块分析

与。引用指向main分支。

2026-08-21 18:26:04 403

原创 [NVSentinel] metadata-collector模块调研

NVSentinel metadata-collector模块摘要 metadata-collector是NVSentinel系统中的硬件信息采集模块,以DaemonSet形式部署在每个GPU节点。其主要功能包括: 硬件信息采集: 通过NVML接口获取GPU设备信息 解析nvidia-smi命令获取NVLink和NIC拓扑数据 收集节点级硬件清单信息 数据发布: 将采集结果写入本地JSON文件(/var/lib/nvsentinel/gpu_metadata.json) 周期性标注Pod占用的GPU设备信息

2026-08-17 11:05:17 166

原创 [NVSentinel] gpu-health-monitor模块之dcgm_watcher

这个文件把DCGM 采数/健康检查做成可重连的轮询 watcher,再通过回调把「哪些 GPU、哪些 watch 出了什么问题」交给上层(Platform Connector)去做事件上报与处置。

2026-08-14 16:37:04 191

原创 [NVSentinel] gpu-health-monitor模块调研

摘要 NVSentinel的gpu-health-monitor模块是一个用于监控GPU健康状态的Python应用,主要功能包括: 通过DCGM(Datacenter GPU Manager)定期检查GPU/NVSwitch的健康状态 将DCGM检测到的问题转换为标准化的HealthEvent事件 通过gRPC over UDS将事件发送给platform-connector进行处理 提供Prometheus监控指标和结构化日志 模块采用分层架构设计,包含DCGM连接层、事件转换层和通信层,支持错误代码到处

2026-08-13 10:12:44 186

原创 WindTerm 快捷键修改

WindTerm快捷键修改指南 WindTerm是一款开源的终端工具,支持SSH、多会话和分屏等功能。虽然目前没有图形化快捷键设置界面,但可以通过修改配置文件来自定义快捷键: 修改文件: 快捷键绑定:安装目录下的global/wind.keymaps 动作定义参考:global/wind.actions 修改格式: { "keys": "", "modes": "适用模式", "action": "动作名" } 常见修改: 切换标签页:绑定Window.ActivateNextView/PreviousVi

2026-08-13 09:31:14 189

原创 NVSentinel 数据流梳理

NVSentinel 数据流架构摘要 NVSentinel 采用事件驱动架构处理GPU集群健康管理,主要包括三部分: 节点数据采集层:通过DaemonSet部署的监控组件(如gpu-health-monitor)实时采集GPU、网卡等硬件健康数据,生成标准化HealthEvent事件,通过gRPC上报。 中心事件处理层:Platform Connectors接收事件并持久化到MongoDB,控制面组件(如fault-quarantine、node-drainer)订阅变更流,执行节点隔离、Pod驱逐等操作。

2026-07-07 10:57:10 200

原创 NVSentinel主要功能及对应组件

摘要:NVSentinel是一个全面的GPU集群监控与自愈系统,其架构包含五大核心功能模块:1)硬件/集群全维度监控采集,通过多种DaemonSet组件(如gpu-health-monitor、syslog-health-monitor等)实时探测GPU、网卡、系统日志等异常;2)存储与事件总线,采用MongoDB和PostgreSQL持久化故障事件;3)全自动故障自愈闭环,通过规则引擎和驱逐组件实现从节点隔离到硬件修复的自动化流程;4)事件分析与告警输出,提供聚合统计和第三方告警集成;5)外部集成扩展能力

2026-07-02 17:15:44 380

原创 NVSentinel 介绍

NVSentinel是一款面向Kubernetes GPU集群的智能故障检测与自愈系统,旨在解决大规模AI训练场景下的GPU节点运维难题。该系统通过多维度监控机制(包括GPU硬件状态、系统日志、云平台事件和Kubernetes资源状态),将异构故障信号统一抽象为标准健康事件,并基于规则引擎进行智能分析决策。核心功能包括自动节点隔离、工作负载迁移分级处理(支持单GPU局部驱逐和整节点隔离)、以及与外部修复系统的集成联动,实现了从故障检测到修复的完整闭环。其模块化架构设计支持灵活扩展,特别适用于需要高可用性和资

2026-07-02 09:49:15 239

原创 HAMI-core 技术解析

HAMi-core 是一款基于软件层面的 vCUDA 解决方案,核心目标是实现 GPU 资源的精细化隔离与限制,适配容器化(K8s + Pod)场景下的 GPU 资源调度需求。其核心实现逻辑的是:重写 NVIDIA 原生 CUDA 驱动(libvgpu.so),通过 Pod 挂载的方式替换原生驱动,再通过修改后的驱动拦截 CUDA 与 NVML 核心 API 接口,从而实现对 GPU 资源(内存、核心算力)的精准管控,解决容器场景下 GPU 资源共享冲突、分配不均的痛点。

2026-05-16 21:31:30 462

原创 Go语言垃圾回收机制详解

Go语言垃圾回收机制采用并发三色标记法,通过写屏障和并发标记-清扫算法实现高效内存管理。GC触发条件包括内存分配阈值、定时检查和手动触发,工作流程分为标记准备、并发标记、标记终止和并发清扫四个阶段。优化策略包括调整GOGC参数、使用GOMEMLIMIT内存限制和减少内存分配。Go GC从1.0到1.26持续演进,最新Green Tea GC通过SIMD加速和并行化优化性能。开发者可通过GODEBUG和pprof工具监控GC行为,分析性能瓶颈。

2025-12-03 10:17:51 567

原创 Go语言协程机制详解

Go语言协程(Goroutine)是其并发编程的核心,具有轻量级、高并发和高效调度的特点。协程由Go运行时管理,相比传统线程创建成本极低,可轻松创建数百万个协程。采用GPM调度模型(Goroutine-Processor-Machine)实现高效调度,通过channel实现安全的协程间通信,避免共享内存问题。协程特别适合Web服务器、网络爬虫等IO密集型场景,能高效处理大量并发请求。其轻量级栈(初始2-4KB)和动态扩展机制,配合抢占式调度,显著提升了并发性能和资源利用率。

2025-11-26 10:35:24 407

原创 Velero原理及限制

场景是否适合公有云 + 支持 snapshot✔ 强烈推荐本地存储 + Restic✔ 中小规模可以跨云备份恢复✖ 不推荐恢复整个集群✔ 可行,但需要处理 webhook & CRD多租户大规模集群✔ 需要优化备份策略。

2025-11-19 10:08:51 809

原创 Kubernetes Operator开发

CRD是Operator的核心,它定义了用户期望的状态和Operator管理的实际状态。import (// +kubebuilder:印刷列:名称="副本数",类型="整数",JSONPath=".spec Replicas"// +kubebuilder:印刷列:名称="状态",类型="字符串",JSONPath=".status Phase"// +kubebuilder:印刷列:名称="更新时间",类型="字符串",JSONPath=".metadata.creationTimestamp"

2025-11-18 10:27:09 556

原创 自定义实现Kubernetes CSI

Kubernetes CSI自定义实现摘要 Kubernetes CSI(容器存储接口)通过标准化接口解决了存储插件与核心代码耦合问题,实现了存储系统与容器编排平台的解耦。CSI架构包含CSI Driver(Controller/Node服务)、Sidecar控制器和Kubernetes核心组件,采用gRPC协议交互完成存储卷的全生命周期管理。自定义CSI驱动开发需实现Identity、Controller和Node三个gRPC接口,涉及环境准备、接口实现、打包部署等步骤,最终通过Kubernetes资源对

2025-11-13 18:00:40 997

原创 wsl安装ubuntu 18.04

安装完成后会提示输入Unix用户名和密码,之后就可以使用了。退出后如想再次使用,直接输入。但由于网络问题,一直会报错,因此改用安装包离线安装。GitHub官网下载。由于当前wsl版本安装ubuntu会报错,因此升级wsl到最新版。对于没有网络的环境,可以下载。首先使用在线升级wsl。

2024-12-23 16:01:31 2260

原创 pvcreate错误 Can‘t open exclusively. Mounted filesystem

因为/dev/vdb曾经是lvm pv,这次异常之后,曾经的lv信息可能还存在于device mapper表中,那么需要先删除device mapper表中对应的项。曾经使用过/dev/vdb设备创建过lvm pv,但是因为一些异常操作,导致pv丢失,pvs无法查看到对应的pv。如下所示,有些残存项可能有先后顺序,如果不能删除,就先删除其他的,最后再来删除之前删除失败的即可。如上所示,在异常之前,曾经通过/dev/vdb的pv创建了名为lvmvg的vg,并在此vg上创建了一些lv卷。

2024-09-09 15:30:55 1281 1

原创 Kubernetes CSI livenessprobe探活

这里需要注意的是探测端口虽然由边车容器提供,但livenessProbe的具体配置却需要在CSI驱动容器中。其原理很简单,就是暴露一个HTTP服务,探测该服务时,该服务会向CSI驱动发送GRPC Probe请求,Probe成功则返回探测成功。下载适合版本的csi.proto刀镜像中(这里以/root/csi.proto)为例。命令,livenessprobe的配置中,使用grpccurl来访问CSI的Probe接口;这里也需要制作镜像,首先是CSI镜像中,增加grpcurl命令。2、CSI镜像中,增加。

2024-06-26 17:04:06 566

原创 Golang交叉编译

Golang交叉编译主要依赖几个参数:GOOS、GOARCH和CGO_ENABLED。

2023-08-08 14:51:13 751

原创 下载外网容器镜像

个人常用第四种方法,第四种方法失败时会使用第三种方法。没梯子的情况下,还是用第二种吧,就是经常会失败。方法优点缺点挂载梯子,设置docker daemon代理简单受限于梯子的速度和稳定性,很可能会下载到一半超时。薅阿里云羊毛不用翻墙。编辑代码后,可自动触发拉取镜像。阿里云做了限制,一段时间内的构建次数有限;拉取后的镜像需要修改tag,digest值也会变更。挂载梯子,使用google cloud shell操作和shell界面完全一致。

2023-07-28 14:47:53 1317

原创 Kubesphere之ks-installer介绍

Kubesphere提供两个部署工具,KubeKey和ks-installer。其中,ks-installer部署Kubesphere,KubeKey安装Kubernetes和ks-installer。代码框架controller:shell-operator的两个脚本deploy:部署ks-installer的yaml文件docs:文档env:变量playbooks:各个playbookalerting.yaml:部署报警模块auditing:部署审计模块common:部署通用模块,

2022-05-07 09:55:39 3342 1

原创 执行shell脚本报错Syntax error: “(“ unexpected

背景更新容器镜像后,通过容器执行shell脚本报错。命令如下,其中portal-container 为容器名。# docker exec -i portal-container /bin/bash -c 'sh /data/kubespray/tools/deploy/deploy_k8s.sh'Syntax error: "(" unexpected原因更换的新容器镜像,使用了和原来不同的基础镜像,原来的sh命令最终是指向bash的。而现在的sh指向了dash,而bash和dash的语法是不

2022-03-25 17:30:29 3476

原创 Go语言泛型工具go2go

背景Go语言从1.18开始,初步支持泛型。要探索Go是如何实现泛型的,就需要使用工具go2go,这里介绍下如何编译该工具。正文go2go是以工具的形式来使用的,可通过go tool go2go <subcommand>来执行命令。Go的工具链由Go语言编写,所以需要提前安装GO,并配置好GOPATH等。下载代码代码在Go语言源码的dev.go2go分支,该分支于2020年发布,现在已经不再维护。代码量偏大,如果网络不佳,可以考虑通过gitee来中转。git clone https

2022-03-15 14:19:45 2013

原创 Go语言通道

背景Golang与其他语言最大的区别是什么呢?在我看来,一个是goroutine,另一个就是通道channel了。其他语言,一般通过共享内存的方式实现不同线程间的通信,也就是说,把数据放在共享内存以供多个线程来使用。这种方法思路简单,但却使得并发控制变得复杂和低效。Golang不建议使用这种方式(虽然也提供了这种传统方式),而是推荐使用通道,也就是channel。详解声明一个通道类型如下:var intChan chan int通道是一种引用类型,和切片、字典相同。初始化引用类型,都需要用到m

2022-03-03 17:00:41 867

原创 Go语言协程

概述Golang中,协程可以简单理解为轻量级的线程。协程开销比线程低,M个协程运行在N个线程上,也就是通常所说的M:N模型。协程完全由Golang运行时管理,而不是由操作系统管理。线程是抢占式的多任务,而协程是非抢占式的任务。通过以上这些方法,从而实现了协程的轻量化。使用Golang创建协程非常简单,只需要go FuncName()即可。package mainimport ( "fmt")func print(name string) { for i := 0; i < 5;

2022-03-02 09:57:17 798

原创 HPA的target显示unknown

背景HPA显示异常,TARGETS部分显示unknown。[root@a1 ~]# kubectl get hpa -n istio-system NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGEistio-ingressgateway Deployment/istio-ingressgateway

2022-03-02 09:39:36 2833 1

原创 Go语言中init函数作用

init函数作用执行Golang的sync.Once操作;有些不能使用初始化表达式的变量,可以在init函数中初始化;先于普通函数执行一些操作。init函数特点init函数是先于main函数执行;package mainimport "fmt"func init() { fmt.Println("init...")}func main() { fmt.Println("main...")}输出:init...main...init函数没有入参;

2022-03-02 09:38:02 609

原创 g——Windows下安装多版本golang

有三种方法,推荐使用第三种。方法一:官方方法 , golang/dl。该方法要求能科学上网,我试过一些国内的代理网站,都不可行。方法二:gvm已经好几年不更新了,有很多错误,但优点是可以同时运行多个版本的Golang。方法三:g国内可以使用该方法,安装速度较快,但同一个时刻只能运行一个版本的Golang。这里主要讲述该方法。我这里以在windows下安装为例,将golang安装在目录E:\g下,GOPATH为E:\gopath。从1.2.1开始,支持自定.

2022-03-02 09:24:41 4127 2

原创 Kubernetes配置多个local-path-provisioner

背景常规的本地卷,一般使用hostpath和local volume,但hostpath问题较多( 参考),而local volume布置成动态卷,使用起来较为复杂。因此,rancher开发了 local-path,可以实现动态卷功能。但如果想实现IO隔离,就需要一套Kubernetes环境下部署多个local-path-provisioner。配置local-path-provisioner可设置环境变量PROVISIONER_NAME,只要该环境变量的值,与新创建local-pat.

2022-03-02 09:23:15 2022

原创 Docker容器网络代理设置

之前已经讲过如何设置Docker守护进程如何设置网络代理,那么如何设置运行的Docker容器的网络代理呢?设置环境变量设置容器环境变量,这也是最直接的一种方式。启动容器时,通过设置–env的flag,将环境变量传入容器。变量名Dockerfile示例Docker run示例HTTP_PROXYENV HTTP_PROXY “http://127.0.0.1:3001”–env HTTP_PROXY=“http://127.0.0.1:3001”HTTPS_PROXYE

2020-05-18 11:21:40 42867 2

原创 Kubernetes Krew简介

概念Krew是kubectl插件的包管理工具。借助Krew,可以轻松地使用kubectl plugin:发现插件、安装和管理插件。使用类似apt、dnf或者brew。对于kubectl用户:krew能帮助用户搜索、安装和管理kubectl插件;对于插件开发者:krew可以帮助你在多种平台上打包和发布插件。使用krew的使用:kubectl krew search ...

2019-01-11 11:01:49 4313

原创 calico在docker上的部署及验证

1. 背景以下的部署以五台服务器环境为例:服务器1: hostname为etcdnode1, IP为192.168.56.100服务器2: hostname为etcdnode2, IP为192.168.56.101服务器3: hostname为etcdnode3, IP为192.168.56.102服务器2: hostname为hostnode1, IP为192.168.56....

2018-05-07 06:51:41 3131

原创 docker-maven-plugin插件设置Docker的buildArgs

docker-maven-plugin是spotify出品的一款针对spring boot项目的docker插件,可将spring boot项目打包到docker镜像中。如果在编译docker镜像时需要设置build arg,只需要在maven的配置文件pom.xml中,configuration下增加buildArgs。标签的key和值对应build arg的key和值,如下所示,dock...

2018-03-22 21:50:49 3870

原创 calicoctl命令简介

背景在calico中,有多种网络资源。以v1.6.1为例,网络资源包含:node,bgpPeer,hostEndpoint,workloadEndpoint,ipPool,policy,profile等。 下面我将讲解如何使用calicoctl命令行工具来控制这些网络资源。 用法create创建一个网络资源。比如说我们要创建一个“profile” 的网络资源,那么...

2018-03-01 05:41:36 11744

Introduction To Algorithms,算法导论英文版

Introduction To Algorithms,算法导论英文版

2015-07-20

etcd-v2.2.1-linux-amd64.tar.gz

etcd-v2.2.1-linux-amd64.tar.gz

2017-03-26

重构改善既有代码的设计

重构改善既有代码的设计,代码重构优化。

2015-07-22

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除