CLI指标监控监控大盘【免费下载链接】nvitopAn interactive NVIDIA-GPU process viewer and beyond, the one-stop solution for GPU process management.项目地址https://gitcode.com/gh_mirrors/nv/nvitop点击查看免费下载导读本文围绕 nvitop 的进程监控 API 模块docs/source/api/process.rst 对应的nvitop.process模块展开系统讲解三个核心对象宿主进程HostProcess、GPU 进程GpuProcess以及命令行序列化工具command_join。读完本文你将掌握如何用几行代码枚举 GPU 上的计算进程、批量抓取进程快照、优雅处理进程已消失等异常场景并理解 nvitop 交互式 TUI 与nvitop命令行工具底层依赖的进程模型。文中所有结论均可在仓库源码 nvitop/api/process.py共 1060 行及配套示例中逐行验证。模块定位nvitop.process是什么nvitop.process是 nvitop API 中专门负责进程的实时类模块其模块 docstring 明确写道The live classes for processes running on the host and the GPU devices.宿主与 GPU 设备上运行进程的实时类。该模块对外只公开三个符号见 nvitop/api/process.py#L52__all__ [GpuProcess, HostProcess, command_join]同时nvitop/api/init.py#L43 将三者连同host子模块一起提升到包顶层因此用户可以直接使用from nvitop import HostProcess, GpuProcess, command_join, host整体依赖关系如下符号类型职责底层来源HostProcess类psutil.Process子类描述一个操作系统进程与 GPU 无关psutil.Process见 nvitop/api/host.pyGpuProcess类描述跑在某块 GPU 上的进程组合 PID 设备HostProcessDeviceNVMLcommand_join函数把命令行参数列表序列化为可读、可复制的 shell 转义字符串平台相关add_quotes三者中HostProcess是GpuProcess的地基GpuProcess内部持有_host属性指向HostProcess并以HostProcess.register注册为 psutil 进程类的扩展实现command_join则是两者command()方法的公共后端。command_join把cmdline变成安全的命令行字符串command_join(cmdline: list[str]) - str接收进程的命令行参数列表如[python3, -c, import IPython]返回一条 shell 转义后的完整命令行字符串核心实现在 nvitop/api/process.py#L94-L101def command_join(cmdline: list[str]) - str: Return a shell-escaped string from a list of command line arguments. if len(cmdline) 1 and not ( # May be modified by setproctitle os.path.isfile(cmdline[0]) and os.path.isabs(cmdline[0]) ): return cmdline[0] return .join(map(add_quotes, cmdline))两条处理路径单元素快速路径当cmdline只有一个元素且不是绝对路径形式的可执行文件时直接原样返回。源码注释指出这是为setproctitle修改过进程标题的场景留的例外——setproctitle后/proc/pid/cmdline中可能出现看似文件路径的字符串此时仍需按多元素规则做转义。通用路径对每个参数调用平台对应的add_quotes做 shell 转义再用空格连接。平台相关的转义规则add_quotes有三套实现按运行平台自动选择nvitop/api/process.py#L55-L91POSIXLinux/macOS优先用双引号包裹若参数含$、\、换行则升级为单引号或对\、、$、换行做反斜杠转义Windows优先双引号含%、^、换行时转义为^^、^、^%等 cmd 风格转义其他平台统一双引号包裹并转义换行。空字符串被转义为保证复制回 shell 后语义不变。典型效果来自HostProcessdocstring 示例 p.cmdline() [python3, -c, import IPython; IPython.terminal.ipapp.launch_new_instance()] p.command() # the result is in shell-escaped format python3 -c import IPython; IPython.terminal.ipapp.launch_new_instance()HostProcess宿主进程的实时封装HostProcess(pid: int | None None)继承自psutil.Process经nvitop.api.host转发是一个抽象基类ABC用于表示运行在操作系统上的进程。它并不关心 GPU——GPU 关联由GpuProcess负责。实例缓存与单例语义与直接使用psutil.Process不同HostProcess自带进程级实例缓存nvitop/api/process.py#L187-L188INSTANCE_LOCK: threading.RLock threading.RLock() INSTANCES: WeakValueDictionary[int, HostProcess] WeakValueDictionary()缓存键为 PID值为弱引用WeakValueDictionary进程对象销毁后自动回收不会造成内存泄漏__new__中若 PID 省略默认取os.getpid()即当前进程命中缓存且is_running()时直接返回既有实例保证同一 PID 在整个进程生命周期内对应同一个对象nvitop/api/process.py#L196-L221_gonesetter 在进程消亡时把实例从缓存中弹出__reduce__按(pid,)返回可 pickle 状态因此copy.deepcopy(p1) is p1也为真见 docstring 示例。 p1 HostProcess(12345) p2 HostProcess(12345) p1 is p2 # the same instance True import copy copy.deepcopy(p1) is p1 # the same instance True核心方法与属性方法 / 属性返回类型说明源码位置cmdline()list[str]命令行参数列表用\0连接再切分以还原被空格拆碎的参数L284-L297command()strcommand_join(self.cmdline())的 shell 转义字符串L299-L308running_time()/running_time_human()/running_time_in_seconds()timedelta/str/float以create_time()为基准计算已运行时长另有elapsed_time*别名L310-L346rss_memory()int常驻内存 RSS单位字节来自memory_info().rssL348-L357parent()HostProcess \| None父进程返回HostProcess实例而非 psutil 对象L359-L371children(recursiveFalse)list[HostProcess]子进程列表recursiveTrue时返回全部后代L373-L384username()str属主用户名Windows 下去掉域名前缀UNIX 用真实 uid 计算L246-L282oneshot()上下文管理器批量取信息时缓存中间结果显著提速L386-L419as_snapshot(attrsNone, ad_valueNone)Snapshot一次性快照见下文快照机制L421-L437oneshot()与快照oneshot()是性能关键路径进入上下文后cmdline与running_time通过memoize_when_activated装饰器nvitop/api/utils.py#L745 起启用方法级缓存退出时自动失效。psutil 本身在oneshot()内也会把name/ppid/...等系统调用结果合并为一次例程执行。官方示例 from nvitop import HostProcess p HostProcess() with p.oneshot(): ... p.name() # collect multiple info ... p.cpu_times() # return cached value ... p.cpu_percent() # return cached value ... p.create_time() # return cached valueas_snapshot()即进入oneshot()→ 取as_dict()→ 追加command、running_time、running_time_human三个非 psutil 字段的封装返回Snapshot对象。GpuProcess绑定 GPU 的进程视图GpuProcess(pid, device, *, gpu_memoryNone, gpu_instance_idNone, compute_instance_idNone, typeNone)表示在指定 GPU 设备上运行的指定 PID 进程。类 docstring 特别强调同一个宿主进程可能使用多块 GPU因此同 PID 不同设备对应不同的GpuProcess实例。构造与缓存缓存键是(pid, device)二元组nvitop/api/process.py#L450-L451INSTANCES: WeakValueDictionary[tuple[int, Device], GpuProcess] WeakValueDictionary()构造时自动完成三件事创建底层HostProcess(pid)并记录_host、_device记录身份元组_ident (*host._ident, device.index)__eq__与__hash__均基于它因此GpuProcess可直接放入set/dict键初始化 GPU 侧字段gpu_memory默认NA、上下文类型type默认NA、MIG 的gpu_instance_id/compute_instance_id非 MIG 设备为NA以及四个利用率字段sm/memory/encoder/decoder默认NA。属性委托__getattr__GpuProcess并不重复实现全部宿主进程方法而是通过__getattr__把未知属性委托给self.hostnvitop/api/process.py#L557-L578函数型属性被auto_garbage_clean(fallback_RAISE)包装后按需取用并缓存。这意味着GpuProcess实例上几乎可以像HostProcess一样调用name()、cpu_percent()、memory_percent()、create_time()、status()等这些方法在类体内也显式存在并带有各自的 fallback见 L709-L918。GPU 专属字段方法返回说明gpu_memory()/gpu_memory_human()/gpu_memory_percent()int \| NaType/str \| NaType/float \| NaType进程占用显存字节、人类可读形式、占设备总显存百分比NA表示不可用如 WDDM 或 MIG 场景gpu_sm_utilization()int \| NaTypeSM流式多处理器利用率百分比gpu_memory_utilization()int \| NaType显存带宽利用率百分比gpu_encoder_utilization()/gpu_decoder_utilization()int \| NaType视频编码 / 解码引擎利用率百分比type属性str \| NaTypeGPU 上下文类型C计算、G图形、CG两者兼有、N/Agpu_instance_id()/compute_instance_id()int \| NaTypeMIG 实例编号非 MIG 为NAupdate_gpu_status()int \| NaType基于一次新的 NVML 查询刷新上述 GPU 状态set_gpu_memory的实现值得注意nvitop/api/process.py#L635-L648显存百分比不是 NVML 直接给出的而是round(100.0 * memory_used / memory_total, 1)由 nvitop 自行计算memory_total来自device.memory_total()。僵尸与权限的兜底cmdline()宿主命令行取回为空且进程未消亡时返回[Zombie Process]L916-L918权限不足AccessDenied时在failsafe上下文中回退为[No Permissions]见auto_garbage_clean的元组 fallback 逻辑 L136-L139。快照机制Snapshot、as_snapshot与take_snapshotsSnapshotdict 风格的只读视图Snapshot定义在 nvitop/api/utils.py#L655是 nvitop 所有一次性观测的载体支持snapshot.name与snapshot[name]两种访问语法可dict(snapshot)或{**snapshot}转为字典未定义的属性会自动从real原始对象延迟获取并缓存自带timestamp采集时刻与real原始对象两个保留字段不可覆写缺失属性按需回源因此快照对象既轻量又完整。GpuProcess.as_snapshot()与批量take_snapshotsas_snapshot(*, host_process_snapshot_cacheNone)返回一次完整快照nvitop/api/process.py#L956-L1007内容分两层宿主层来自host_snapshot()is_running、status、username、name、cmdline、command、cpu_percent、memory_percent、host_memory、host_memory_human、running_time系列设备层device、type、gpu_instance_id、compute_instance_id、gpu_memory、gpu_memory_human、gpu_memory_percent、gpu_sm_utilization、gpu_memory_utilization、gpu_encoder_utilization、gpu_decoder_utilization。host_process_snapshot_cache参数是关键优化同一宿主 PID 在多块 GPU 上出现时宿主快照只取一次。批量版本是类方法GpuProcess.take_snapshots(gpu_processes, *, failsafeFalse)L1009-L1028内部共用一个宿主快照缓存遍历全部进程failsafeTrue时整体进入failsafe()上下文任何失败的方法都返回 fallback 而非抛异常。这也是顶层 APInvitop.take_snapshots()见 nvitop/api/collector.py#L60与监控示例 examples/monitor-colored/monitor_colored.pyGpuProcess.take_snapshots(processes.values(), failsafeTrue)所用的路径。failsafe与NA进程消失时如何不崩溃GPU 进程的生命周期极不稳定——训练任务随时可能退出。nvitop 用两件套解决查询已消亡进程的问题1.auto_garbage_clean装饰器L108-L144方法抛PsutilErrorpsutil.Error的统一别名见 nvitop/api/host.py#L45时先自动把该实例从GpuProcess.INSTANCES与HostProcess.INSTANCES缓存中清除进程已消亡缓存失效再决定是抛异常还是返回 fallback。2.GpuProcess.failsafe()上下文管理器L1030-L1060通过线程局部变量_USE_FALLBACK_WHEN_RAISE打开回退模式期间所有失败方法返回各自动的 fallback如cpu_percent→NA、is_running→False、status→terminated、cmdline→[No Such Process]。docstring 中的完整示例 p GpuProcess(pid10000, deviceDevice(0)) # process does not exist p.cpu_percent() Traceback (most recent call last): ... NoSuchProcess: process no longer exists (pid10000) with GpuProcess.failsafe(): ... print(fallback: {!r}.format(p.cpu_percent())) ... print(fallback (float cast): {!r}.format(float(p.cpu_percent()))) # nvitop.NA can be cast to float or int ... print(fallback (int cast): {!r}.format(int(p.cpu_percent()))) # nvitop.NA can be cast to float or int fallback: N/A fallback (float cast): nan fallback (int cast): 0NA是NaTypestr子类的单例实例字符串运算时表现为N/A算术运算时表现为math.nannvitop/api/utils.py#L110 起因此回退值可以直接进入格式化、绘图或数值管线而不中断程序。配套的人类可读格式化工具bytes2humanutils.py#L537与timedelta2humanutils.py#L612同样对NA免疫。数据来源与Device.processes()的联动GpuProcess实例通常不是手工构造的而是由设备枚举产生。Device.processes()nvitop/api/device.py#L2311-L2362的实现揭示了完整的采集链路依次调用 NVML 的nvmlDeviceGetComputeRunningProcesses与nvmlDeviceGetGraphicsRunningProcesses区分计算上下文C与图形上下文G为每个 PID 构造GpuProcessusedGpuMemory在Windows WDDM 驱动模型或 MIG 使能时不可用记为NA调用nvmlDeviceGetProcessUtilization时间戳取 1 秒前保证采样缓冲非空填充每个进程的sm/memory/encoder/decoder利用率未出现在采样中的进程补零MIG 设备上把gpuInstanceId/computeInstanceId写入实例UINT_MAX归一化为NA。因此典型用法是设备 → 进程 → 快照三步from nvitop import Device, GpuProcess device Device(0) processes device.processes() # {pid: GpuProcess} snapshots GpuProcess.take_snapshots(processes.values(), failsafeTrue) for snap in snapshots: print(snap.pid, snap.username, snap.gpu_memory_human, snap.command)批量快照的完整演示可参考 examples/take-snapshots/take_snapshots_demo.py覆盖Device.all()、Device.cuda.all()、gpu_processesFalse等多种形态彩色监控面板参考 examples/monitor-colored/monitor_colored.py。实用建议与小结优先使用批量 API对大量 GPU 进程做观测时用GpuProcess.take_snapshots而非逐个as_snapshot()前者共享宿主快照缓存在oneshot()上下文内批量读取宿主信息可进一步减少系统调用。监控循环务必开启failsafe进程退出、僵尸、权限不足是常态回退值配合NA的可转换性float(NA)→nanint(NA)→0让采集循环保持健壮。缓存由框架自动维护GpuProcess/HostProcess的弱引用实例缓存会在进程消亡时由auto_garbage_clean自动清理无需手工干预。跨平台注意command_join的转义结果只在同平台 shell 语义下成立gpu_memory在 WDDM / MIG 场景下为NA展示层需兼容。综上nvitop.process以宿主进程HostProcess GPU 进程GpuProcess 命令行序列化command_join三个 API 构成了 nvitop 进程观测的完整闭环NVML 负责谁在 GPU 上跑psutil 负责进程本身什么样Snapshot与failsafe负责稳定地拿到一次性观测值。无论你是要写一个轻量 GPU 监控脚本还是想理解 nvitop TUI 的进程面板数据从何而来nvitop/api/process.py 与 docs/source/api/process.rst 都是最直接的入口。赞分享CLI指标监控监控大盘【免费下载链接】nvitopAn interactive NVIDIA-GPU process viewer and beyond, the one-stop solution for GPU process management.项目地址https://gitcode.com/gh_mirrors/nv/nvitop点击查看免费下载相关推荐ffscreencast贡献指南如何参与开源项目开发ffscreencast贡献指南如何参与开源项目开发 ffscreencast是一个基于ffmpeg的命令行屏幕录制工具支持多显示器、摄像头叠加和音频录制功免费终极音乐播放器XiaoMusic让小爱音箱变身高清音乐库免费终极音乐播放器XiaoMusic让小爱音箱变身高清音乐库 还在为小爱音箱只能播放有限在线音乐而烦恼吗今天我要向你介绍一款革命性的开源工具——XiaoMu后端智能硬件音视频使用 kube-prometheus 监控 Windows 节点Windows HostProcess 与 Docker 双方案实战指南使用 kube prometheus 监控 Windows 节点Windows HostProcess 与 Docker 双方案实战指南 导读 本文讲解如何在云原生可观测性指标监控监控大盘告警上一篇QQScreenShot屏幕截图全解区域框选、截长图、贴图一站式搞定告别多软件切换下一篇Bruce固件Web界面如何远程管理ESP32渗透测试设备的完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考