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

【Linux系列】nproc

csdn

博客目录

    • 基本概念解析
      • 什么是 nproc?
      • Docker 的资源限制
      • Kubernetes 的资源限制
    • 现象分析
      • 测试环境描述
      • 关键差异点
    • 技术原理深入
      • Linux 调度器视角
      • 超线程的影响
      • cgroups v1 与 v2 的差异
    • 实际影响与解决方案
      • 对应用程序的影响
      • 最佳实践建议
    • 底层机制对比
      • Docker 的实现方式
      • Kubernetes 的实现方式
    • 性能考量
      • 调度延迟
      • 准确性与一致性

基本概念解析

什么是 nproc?

nproc是一个 Linux 命令,用于显示当前进程可用的处理器单元(CPU 核心)数量。这个命令读取的是 Linux 内核通过sysconf(_SC_NPROCESSORS_ONLN)调用提供的信息,反映了系统认为可用的 CPU 核心数。
在这里插入图片描述

Docker 的资源限制

Docker 通过 cgroups(控制组)技术实现资源隔离和限制。当为容器设置 CPU 限制时,Docker 会在以下几个层面工作:

  1. cpu shares:相对权重,默认 1024
  2. cpu quota:绝对时间限制(以微秒计)
  3. cpu period:配额周期(默认 100ms)
  4. cpuset:绑定到特定 CPU 核心

Kubernetes 的资源限制

Kubernetes 构建在 Docker 等容器运行时之上,提供了更高级别的抽象:

  1. Requests:容器保证能获得的资源量
  2. Limits:容器能使用的资源上限
  3. QoS Classes:根据资源配置划分的服务质量等级

现象分析

测试环境描述

假设我们有一个简单的容器镜像,其中包含nproc命令。我们分别在以下两种环境中运行:

  1. 纯 Docker 环境

    docker run --cpus=8 my-image nproc
    

    输出:8

  2. Kubernetes 环境

    resources:limits:cpu: "8"requests:cpu: "8"
    

    容器内执行nproc输出:16

关键差异点

为什么相同的 CPU 限制(8 核)会导致不同的nproc输出?这主要涉及以下几个方面:

  1. CPU 计算方式的不同

    • Docker 直接使用物理核心数
    • Kubernetes 考虑超线程(Hyper-Threading)因素
  2. cgroups 配置的差异

    • Docker 配置的 cgroups 参数更直接
    • Kubernetes 通过更复杂的机制间接影响
  3. 内核参数的处理

    • /sys/devices/system/cpu的不同视图

技术原理深入

Linux 调度器视角

Linux 的 CPU 调度器(CFS)通过以下文件与 cgroups 交互:

  • cpu.cfs_period_us:调度周期(通常 100ms)
  • cpu.cfs_quota_us:容器在每个周期内可使用的 CPU 时间

在 Docker 中设置--cpus=8会直接计算:

cpu.cfs_quota_us = 8 * cpu.cfs_period_us

而 Kubernetes 的处理更复杂,需要考虑节点总资源和 Pod 请求。

超线程的影响

现代 CPU 通常支持超线程技术,使得一个物理核心可以表现为两个逻辑核心。nproc默认返回的是逻辑 CPU 数量:

  • 在 8 核 16 线程的 CPU 上:
    • 物理核心:8
    • 逻辑核心:16

Docker 的--cpus参数限制的是物理核心时间,而 Kubernetes 的配置可能导致系统看到全部逻辑核心。

cgroups v1 与 v2 的差异

较新的系统使用 cgroups v2,其 CPU 控制器行为有所变化:

  • v1cpu,cpuacct控制器
  • v2:统一层次结构

Kubernetes 对 cgroups v2 的支持可能导致不同的资源视图。

实际影响与解决方案

对应用程序的影响

  1. 工作线程数:许多应用根据nproc自动设置线程池大小
  2. 性能预期:错误的 CPU 数量认知可能导致次优配置
  3. 资源竞争:实际可用 CPU 可能与预期不符

最佳实践建议

  1. 明确设置线程数:不依赖nproc自动检测

  2. 统一环境配置:开发与生产环境保持一致

  3. 使用正确的指标

    # 获取实际可用的CPU数量
    grep -cE '^processor' /proc/cpuinfo
    # 或使用cgroup感知的方法
    cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us /sys/fs/cgroup/cpu/cpu.cfs_period_us | awk '{printf "%d\n", $1/$2}'
    
  4. Kubernetes 特定配置

    resources:limits:cpu: "8"requests:cpu: "8"
    # 添加pod注解以确保正确视图
    annotations:cpu.cgroup.alpha.kubernetes.io/: "8"
    

底层机制对比

Docker 的实现方式

Docker 通过以下步骤设置 CPU 限制:

  1. 创建容器时解析--cpus参数
  2. /sys/fs/cgroup/cpu/docker/<container-id>/设置:
    • cpu.cfs_quota_us = 800000 (8 * 100ms)
    • cpu.cfs_period_us = 100000
  3. 挂载容器文件系统时提供特定的/proc/cpuinfo视图

Kubernetes 的实现方式

Kubernetes 的 kubelet 通过更复杂的流程:

  1. 根据 Pod 定义计算资源需求
  2. 通过 CRI(容器运行时接口)与容器运行时交互
  3. 可能设置多个层次的 cgroups:
    • Pod 级别
    • 容器级别
  4. 可能启用 CPU 管理器(static 策略)或拓扑管理器

性能考量

调度延迟

Kubernetes 额外的抽象层可能引入:

  1. 额外的 cgroups 层次结构遍历开销
  2. 更复杂的调度决策过程
  3. QoS 类别的强制执行成本

准确性与一致性

关键问题在于:

  1. 应用程序看到的 CPU 数量与实际可用资源是否匹配
  2. 不同监控工具报告的数字是否一致
  3. 垂直扩展时的行为可预测性

觉得有用的话点个赞 👍🏻 呗。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

img

http://www.dtcms.com/a/300649.html

相关文章:

  • CPA-7-资产减值
  • 墨者:通过手动解决SQL手工注入漏洞测试(MySQL数据库)
  • 握手未来,PostgreSQL认证专家
  • GTP4.0官网版:智能对话与知识引擎,重塑客户服务效率
  • Sql server开挂的OPENJSON
  • USB设备调试
  • 【LeetCode刷题指南】--设计循环队列
  • Java 大视界 -- Java 大数据机器学习模型在电商客户细分与精准营销活动策划中的应用(367)
  • 3D碰撞检测系统 基于SAT算法+Burst优化(Unity)
  • Java面试宝典:MySQL执行原理二
  • MongoDB索引及其原理
  • 接口自动化-logging日志
  • Qt 窗口 工具栏QToolBar、状态栏StatusBar
  • 24点数学游戏(穷举法求解表达式)
  • 基于Matlab自适应阈值分割算法的图像处理研究
  • esp32s3创建rust工程 window成功mac
  • [硬件电路-97]:模拟器件 - 如何通过外部的闭环负反馈,让运算放大器从“暴脾气”、“愣头青”、情绪容易失控者变成“沉着”、“冷静”的精密调控者的?
  • MySQL表的增删改查(基础)
  • 基于鲸鱼算法的三相逆变器分数阶滑模控制参数优化
  • solidity从入门到精通 第六章:安全第一
  • 设备独立性软件-高速缓存与缓冲区
  • 广东省省考备考(第五十八天7.27)——资料分析、数量、判断推理(强化训练)
  • 通过不同坐标系下的两个向量,求解旋转矩阵
  • springboot基于Java的人力资源管理系统设计与实现
  • LabelImg:简洁高效的图像标注工具和下载
  • ROS2入门到精通教程(三)快速体验
  • Unity 实时 CPU 使用率监控
  • 机械学习----knn实战案例----手写数字图像识别
  • 携带参数的表单文件上传 axios, SpringBoot
  • Karonte: Detecting Insecure Multi-binary Interactions in Embedded Firmware论文分享