python - 从 docker 容器中隐藏节点核心数
问题描述
我目前正在构建一个系统,该系统在 kubernetes 集群中的单个部署中运行服务,并且需要限制容器内的可见核心。
节点规格:
8 核
16 GB 内存
当我部署时,登录到容器并使用 python 的multiprocessing
模块检查核心数,我得到以下输出:
In [1]: import multiprocessing
In [2]: multiprocessing.cpu_count()
Out[2]: 8
看到我的节点有 8 个核心,这个输出是正确的。
我希望容器在运行相同multiprocessing.cpu_count()
命令时返回核心计数 1 作为核心计数。
示例用例如下:
开发人员创建一个运行 python 和 gunicorn 的 api 服务,gunicorn 的默认行为是为可用的内核数量创建工作程序。
当 pod 只允许 100m CPU 和 300m Mem 时,以上将是一个问题,因为 8 个工作人员会在某个时候填满内存并且 pod 会崩溃,我也想隐藏这一点,以防潜在的混乱和意外以编程方式检测资源时的行为。
我曾尝试使用该--cpuset-cpus=0
标志,因为它作为一种潜在的解决方案脱颖而出,但据我了解和经验,这只会将容器限制为指定的核心,而不会隐藏其他 7 个核心。
有没有办法做到这一点,任何帮助将不胜感激。
解决方案
你可以有一个环境变量NUM_CPUS
,如果它存在,你应该使用它而不是multiprocessing.cpu_count()
. 就像是:
import os
num_cpus = os.getenv("NUM_CPUS")
if num_cpus is not None:
cpu_count = max(round(num_cpus), 1)
else:
cpu_count = multiprocessing.cpu_count()
推荐阅读
- jhipster - UAA 服务器一直连接到 localhost 以进行注册表
- c# - 为什么我们可以选择折叠的 WPF ListView 项
- javascript - 移动设备上的 jQuery 悬停方法在重复时不起作用
- sql - Postgre SQL 中的数值数据类型
- java - 如何支持相同的屏幕尺寸但不同的 dpi?
- dll - 我需要适用于 Windows 10 的当前 qrcodelib.dll
- java - 如何从 AWS Cognito 用户池检查用户密码?
- opencv - 从 3D 三角点恢复姿势
- docker - 关于自动化安装脚本的 Drupal 问题
- javascript - 移动网络 - 如何在键盘打开时获取屏幕高度