io uring学习
看这个就行 https://arthurchiao.art/blog/intro-to-io-uring-zh/ 阻塞式I/O与非阻塞式I/O 1. 阻塞式 I/O 的问题 在最原始的模型中,应用程序调用 read() 或 write() 时,如果数据没有准备好(例如,网络包未到达,或磁盘数据未从硬盘读入内存),进程就会被挂起(阻塞),直到操作完成。这在高并发场景下是灾难性的,因为一个线程只能处理一个请求。 2. 非阻塞 I/O + I/O 多路复用 (select/poll/epoll) 的“伪异步” 为了解决阻塞问题,引入了非阻塞 I/O 和 I/O 多路复用机制。 工作方式:应用程序将文件描述符(fd)设置为非阻塞模式,然后使用 epoll 等系统调用来“监听”一组 fd。当 epoll_wait() 返回时,它会告诉你哪些 fd 已经“就绪”(ready),即可以进行无阻塞的读写操作。 优点:一个线程可以同时管理成千上万个网络连接,极大地提升了并发能力。这也是 Node.js、Nginx、Redis 等高性能服务的基石。 3. 致命缺点:仅限于“就绪通知”,且不支持 ...
K8s drain和cordon的区别
K8s drain和cordon的区别 Kubernetes中Drain和Cordon的区别 Cordon(封锁节点) 作用 标记节点为不可调度 新的Pod不会被调度到该节点 现有Pod不受影响,继续正常运行 使用场景 12345# 封锁节点kubectl cordon node-name# 解除封锁kubectl uncordon node-name 实际效果 1234节点状态变化:- 调度状态:可调度 → 不可调度- 现有Pod:继续运行- 新Pod:不会调度到此节点 Drain(排空节点) 作用 首先执行Cordon操作(封锁节点) 优雅地驱逐节点上的所有Pod 等待Pod在其他节点上重新启动 节点变为空节点 使用场景 1234567891011# 排空节点(默认行为)kubectl drain node-name# 排空节点并忽略DaemonSetkubectl drain node-name --ignore-daemonsets# 强制删除(不等待优雅终止)kubectl drain node-name --force# 设置优雅终止时间kubectl dri...
k8s helm
K8s Helm 一、 Helm 是什么? Helm 是 Kubernetes 的包管理器。 你可以把它类比为: Linux 世界的 yum 或 apt-get:用来安装、升级、配置和管理软件包。 Node.js 世界的 npm:用来管理项目依赖。 Python 世界的 pip:用来安装和管理库。 只不过,Helm 管理的“包”是 Kubernetes 应用。这个“包”在 Helm 中被称为 Chart。 二、 为什么需要 Helm?—— 解决 K8s 原生部署的痛点 想象一下,你在实习时,需要部署一个包含以下组件的复杂 AI 推理服务: 1 个前端 Web 服务 Deployment 1 个后端 API 服务 Deployment 1 个 Redis 缓存 Deployment + Service 1 个 PostgreSQL 数据库 StatefulSet + Service 1 个 Ingress 资源用于对外暴露服务 10 个 ConfigMap 和 Secret 用于配置管理和密钥注入 1 个 HorizontalPodAutoscaler (HPA) 用于自动...
k8s 探针
k8s 探针 三类探针的作用域 1. 存活探针(Liveness Probe) 作用:判断Pod是否存活 影响:失败时重启Pod 范围:仅影响Pod生命周期 2. 就绪探针(Readiness Probe) 作用:判断Pod是否准备好接收流量 影响:控制Pod是否加入Service的Endpoint 范围:影响Service流量分发 3. 启动探针(Startup Probe) 作用:判断应用是否启动完成 影响:在启动期间禁用其他探针 范围:仅影响Pod启动过程 与Service的关系详解 就绪探针与Service的关联 12345678910apiVersion: v1kind: Servicemetadata: name: my-servicespec: selector: app: my-app # 选择标签匹配的Pod ports: - port: 80 targetPort: 8080 123456789101112131415apiVersion: v1kind: Podmetadata: labels: app: my-ap...
sandbox和container对比
sandbox和container对比 Sandbox 和 Container 的区别 基本概念 Sandbox(沙箱) 定义:一种隔离环境,用于安全地运行程序,限制其对系统资源的访问 目的:提供安全隔离,防止恶意代码影响主机系统 范围:通常针对单个应用程序或进程 Container(容器) 定义:一种轻量级虚拟化技术,将应用程序及其依赖打包在一起 目的:提供一致的运行环境,确保应用在不同环境中行为一致 范围:包含完整的应用程序运行时环境 主要区别对比 特性 Sandbox Container 主要目标 安全隔离 环境一致性 隔离级别 高(安全优先) 中等(资源隔离) 资源开销 极低 低到中等 启动速度 极快 快 包含内容 单个应用/进程 完整运行时环境 技术实现差异 Sandbox 实现方式 1234567// 浏览器沙箱示例(概念性)// 运行在受限环境中const sandboxedCode = ` // 无法访问DOM、网络、文件系统 // 只能执行安全的JavaScript代码 return 42;`; 典型技术: 浏...
容器运行时扩展方案技术解析
容器运行时扩展方案技术解析 基于对某容器运行时扩展项目的代码分析,现从架构层面提炼其核心技术实现,聚焦三大核心能力:运行时接入机制、容器根文件系统云端持久化、Docker-in-Docker 安全实现方案。 1. 如何接入 Containerd 运行时生态 项目通过 Containerd Proxy Plugin 机制 实现与容器运行时的无缝集成,架构清晰、扩展性强。 ▶ 配置层接入 在 containerd 配置中注册名为 custom-snapshotter 的代理插件,通过 Unix Domain Socket 与本地 Agent 通信; 同时注册自定义 Runtime,指向特定二进制执行程序,实现容器生命周期的定制化控制。 ▶ 运行时层实现 Agent 侧:实现标准 gRPC 服务,响应来自 Containerd 的 Snapshotter 接口调用(如 Prepare、Mount、Remove); 存储层封装:采用 Wrapper 模式封装原生 OverlayFS Snapshotter,在不破坏原有逻辑的前提下注入自定义行为(如镜像预处理、元数据记录等); 通...
如何通过Pod进入到宿主机?
如何通过Pod进入到宿主机? nsenter -a -t 1 bash 命令的作用是让你在一个新的 shell 会话中,进入 PID 为 1 的进程所在的全部命名空间(Namespace)。 通过这种方式,可以从pod中进入到宿主机(全部的namespace都跟宿主机一样) breakdown 如下: nsenter: 这是一个 Linux 命令行工具,用于将当前进程“进入”到指定进程的一个或多个命名空间中。 -t 1: 这个选项指定了目标进程的 PID (Process ID)。在这里,1 是 Linux 系统中第一个启动的进程(通常是 init 或 systemd)的 PID。所有其他进程都是由它或它的子进程派生出来的。 -a: 这个选项是 “all namespaces” 的缩写。它告诉 nsenter 将当前进程加入到目标进程(PID 1)所属于的所有类型的命名空间中,包括但不限于: Mount (mnt) UTS (主机名和域名) IPC (进程间通信) Network PID (进程 ID) User ID Cgroup bash: 这是要在新加入的命名空间环...
k8s informer通俗易懂详解
Kubernetes Informer 机制详解 核心概念 Informer 是 Kubernetes 中用于监听和缓存资源对象的核心机制,它通过 ListAndWatch 机制实现高效的资源监控。 核心组件及作用 1. Reflector(反射器) 作用:负责从 Kubernetes API Server 获取资源对象 功能: List:获取资源的全量数据 Watch:监听资源的增量变化 将数据放入 Delta FIFO 队列 2. Delta FIFO Queue(增量队列) 作用:存储资源对象的变化(增删改) 特点: 保持操作顺序 存储对象的增量变化(Delta) 线程安全 3. Informer(通知器) 作用:从 Delta FIFO 队列中取出对象并处理 功能: 调用 Indexer 更新本地缓存 触发注册的事件处理器 4. Indexer(索引器) 作用:本地缓存,提供快速查询 功能: 存储资源对象的本地副本 提供基于索引的快速查找 线程安全的读写操作 5. Resource Event Handlers(资源事件处理器) ...
k8s控制面相关学习&controller/informer生成
k8s控制面相关学习&controller/informer生成 informer informer:https://zhuanlan.zhihu.com/p/391465614 https://www.zhihu.com/question/463207052/answer/2377261278 (注意Informer最后也有个controller,跟这个不一样) 对于Informer而言 大步骤1: Reflector 将资源对象的事件添加进 Delta FIFO queue 中 这里先提前介绍一下 Delta FIFO queue。 所谓 Delta 就是变化的意思,什么的变化呢?就是资源对象的变化。 即 资源对象的变化都会被添加到 Delta FIFO queue 中!这样是不是就很好理解了。 大步骤2: Informer 将 Delta FIFO queue 中的对象数据 添加到本地 cache 中。 补充一下这个本地 cache 缓存的就是监听资源对象的最新版。就是缓存的当前集群里面的资源信息。 大步骤3: 使用 workqueue 处理业务逻辑。 ...
Nano-vllm 项目学习
Nano-vllm 项目学习 项目地址:https://github.com/GeeeekExplorer/nano-vllm vllm介绍:https://zhuanlan.zhihu.com/p/693279132 paged attention:https://zhuanlan.zhihu.com/p/691038809 nano vllm: https://zhuanlan.zhihu.com/p/1923689524778766954 请求(request)可理解为操作系统中的一个进程 逻辑内存(logical KV blocks)可理解为操作系统中的虚拟内存,每个block类比于虚拟内存中的一个page。每个block的大小是固定的,在vLLM中默认大小为16,即可装16个token的K/V值 块表(block table)可理解为操作系统中的虚拟内存到物理内存的映射表 物理内存(physical KV blocks)可理解为操作系统中的物理内存,物理块在gpu显存上,每个block类比于虚拟内存中的一个page vLLM节省KV cache显存的核...





