os.sched_getaffinity(0) 与 os.cpu_count()

2023-11-24

所以,我知道标题中两种方法的区别,但不知道实际含义。

据我了解:如果您使用的 NUM_WORKERS 数量多于实际可用的核心数量,您将面临性能大幅下降,因为您的操作系统不断地来回切换,试图保持并行。不知道这有多真实,但我在某处从比我聪明的人那里读到了它。

在文档中os.cpu_count()它说:

返回系统中 CPU 的数量。如果未确定则返回 None。这个数字不等于CPU的数量 当前进程可以使用。可以获得可用CPU数量 与 len(os.sched_getaffinity(0))

因此,我试图弄清楚“系统”指的是一个进程可使用的 CPU 数量是否多于“系统”中的 CPU 数量。

我只想安全有效地实施multiprocessing.pool功能。所以这是我的问题总结:

以下内容有何实际意义:

NUM_WORKERS = os.cpu_count() - 1
# vs.
NUM_WORKERS = len(os.sched_getaffinity(0)) - 1

The -1是因为我发现如果我尝试在处理数据时工作,我的系统的延迟会少很多。


这两个功能有很大不同NUM_WORKERS = os.sched_getaffinity(0) - 1会立即失败TypeError因为您尝试从集合中减去一个整数。尽管os.cpu_count()告诉您系统有多少个核心,os.sched_getaffinity(pid)告诉您某个线程/进程位于哪些核心上allowed to run.


os.cpu_count()

os.cpu_count()显示操作系统已知的可用核心数量(virtual核心)。您很可能拥有这个数量的一半physical核心。使用比物理核心更多的进程,甚至比虚拟核心更多的进程是否有意义,很大程度上取决于您正在做什么。计算循环越紧密(指令多样性很少,缓存未命中次数很少,...),您就越有可能无法从更多使用的核心(通过使用更多工作进程)中受益,甚至会遇到性能下降。

显然,这还取决于您的系统正在运行什么,因为您的系统试图为系统中的每个线程(作为进程的实际执行单元)提供可用内核上公平的运行时间份额。因此,就您有多少工人而言,不可能一概而论。should使用。但是,例如,如果您有一个紧密的循环并且您的系统处于空闲状态,那么优化的一个很好的起点是

os.cpu_count() // 2 # same as mp.cpu_count() // 2 

...并从那里开始增加。

@Frank Yellin 已经提到过,multiprocessing.Pool uses os.cpu_count()为默认的工人数量。

os.sched_getaffinity(pid)

os.sched_getaffinity(pid)

返回具有 PID pid 的进程的 CPU 集(或当前 过程(如果为零)被限制为。

现在 core/cpu/processor/-affinity 是关于您的线程(在工作进程内)位于哪个具体(虚拟)核心上allowed跑步。您的操作系统为每个核心提供一个 id,从 0 到(核心数 - 1),并且更改关联性可以限制(“固定”)某个线程允许在哪些实际核心上运行。

至少在 Linux 上,我发现这意味着如果当前没有允许的核心可用,则子进程的线程将不会运行,即使其他不允许的核心处于空闲状态。所以“亲和力”在这里有点误导。

摆弄关联性时的目标是最大限度地减少上下文切换和核心迁移造成的缓存失效。您的操作系统通常具有更好的洞察力,并且已经尝试通过其调度策略使缓存保持“热”状态,因此除非您知道自己在做什么,否则您不能指望通过干扰轻松获得收益。

默认情况下,关联性设置为所有核心,并且multiprocessing.Pool,更改它没有太大意义,至少在您的系统处于空闲状态时是这样。

请注意,尽管这里的文档谈到了“进程”,但设置亲和力实际上是每个线程的事情。因此,例如,在“子”线程中为“当前进程(如果为零)”设置亲和力,不会更改主线程或进程内其他线程的亲和力。But,子线程从主线程继承其亲和力,子进程(通过其主线程)从父进程的主线程继承亲和力。这会影响所有可能的启动方法(“spawn”、“fork”、“forkserver”)。下面的示例演示了这一点以及如何使用修改亲和力multiprocessing.Pool.

import multiprocessing as mp
import threading
import os


def _location():
    return f"{mp.current_process().name} {threading.current_thread().name}"


def thread_foo():
    print(f"{_location()}, affinity before change: {os.sched_getaffinity(0)}")
    os.sched_setaffinity(0, {4})
    print(f"{_location()}, affinity after change: {os.sched_getaffinity(0)}")


def foo(_, iterations=200e6):

    print(f"{_location()}, affinity before thread_foo:"
          f" {os.sched_getaffinity(0)}")

    for _ in range(int(iterations)):  # some dummy computation
        pass

    t = threading.Thread(target=thread_foo)
    t.start()
    t.join()

    print(f"{_location()}, affinity before exit is unchanged: "
          f"{os.sched_getaffinity(0)}")

    return _


if __name__ == '__main__':

    mp.set_start_method("spawn")  # alternatives on Unix: "fork", "forkserver"

    # for current process, exclude cores 0,1 from affinity-mask
    print(f"parent affinity before change: {os.sched_getaffinity(0)}")
    excluded_cores = {0, 1}
    os.sched_setaffinity(0, os.sched_getaffinity(0).difference(excluded_cores))
    print(f"parent affinity after change: {os.sched_getaffinity(0)}")

    with mp.Pool(2) as pool:
        pool.map(foo, range(5))

Output:

parent affinity before change: {0, 1, 2, 3, 4, 5, 6, 7}
parent affinity after change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 MainThread, affinity before thread_foo: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 MainThread, affinity before thread_foo: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 Thread-1, affinity before change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 Thread-1, affinity after change: {4}
SpawnPoolWorker-1 MainThread, affinity before exit is unchanged: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 MainThread, affinity before thread_foo: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-1, affinity before change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-1, affinity after change: {4}
SpawnPoolWorker-2 MainThread, affinity before exit is unchanged: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 MainThread, affinity before thread_foo: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-2, affinity before change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-2, affinity after change: {4}
SpawnPoolWorker-2 MainThread, affinity before exit is unchanged: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 MainThread, affinity before thread_foo: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 Thread-2, affinity before change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-1 Thread-2, affinity after change: {4}
SpawnPoolWorker-1 MainThread, affinity before exit is unchanged: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-3, affinity before change: {2, 3, 4, 5, 6, 7}
SpawnPoolWorker-2 Thread-3, affinity after change: {4}
SpawnPoolWorker-2 MainThread, affinity before exit is unchanged: {2, 3, 4, 5, 6, 7}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

os.sched_getaffinity(0) 与 os.cpu_count() 的相关文章

  • 调整添加的绘制组件的大小和奇怪的摆动行为

    这个问题困扰了我好几天 我正在制作一个特殊的绘画程序 我制作了一个 JPanel 并添加了使用 Paint 方法绘制的自定义 jComponent 问题是 每当我调整窗口大小时 所有添加的组件都会 消失 或者只是不绘制 因此我最终会得到一个
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • 仅当显式选择行时才关闭 ui-bootstrap typeahead

    我创建了这个jsBin http jsbin com livuqafe 2 edit来证明我遇到的问题 如果您转到此处 请尝试输入 五 并继续 你的自然反应是输入 五 然后按 Tab 如果你想要 五百 你可以向下箭头一次 但是 在这种情况下
  • 没有输入的 jQuery 日期选择器

    我有一个相当复杂的网络应用程序 我想向其中添加一些日期选择 UI 我遇到的问题是我无法从文档中弄清楚如何真正控制日期选择器的出现方式和时间 不涉及任何表单元素 不 我不会添加秘密表单字段 因此简单的开箱即用方法根本行不通 我希望有人可以提供
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • Mono 应用程序在非阻塞套接字发送时冻结

    我在 debian 9 上的 mono 下运行一个服务器应用程序 大约有 1000 2000 个客户端连接 并且应用程序经常冻结 CPU 使用率达到 100 我执行 kill QUIT pid 来获取线程堆栈转储 但它总是卡在这个位置
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 将第三个表链接到多对多关联中的桥接表

    设计这个数据库的正确方法是什么 这是我设置表格的方式 我在名为 教师 的表和名为 仪器 的表之间存在多对多关系 然后我有一个连接两者的桥接表 我想将另一个表与 BRIDGE 表关联起来 意思是乐器 老师的组合 该表有 3 行 指定老师可以教
  • NSArrayController 无需将大型数据集加载到数组中

    我想使用 NSArrayController 向 NSTableView 提供数据 我面临的问题是我不想将所有数据预先加载到数组中 然后使用数组控制器setContent 方法 我的数据模型是一个管理数百万条记录的大型现有代码库 它包含有效
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何在 Angular 4 中翻译 mat-paginator?

    你知道如何在 Angular 中翻译 每页项目 吗mat paginator标签 这mat paginator是材料设计中的一个元素 您可以使用MatPaginatorIntl为了这 威尔 豪厄尔制作 https github com an
  • 使用velocity.js制作可拖动元素的动画

    我正在使用velocity js 为用户拖动的可拖动 SVG 元素设置动画 然而 velocity js 将先前的 mousemove 坐标排队并通过所有后续的 mousemove 坐标进行动画处理 我想要的是velocity js 不要对
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的
  • 如何在 OSX 上安装 LaTeX .sty 文件?

    我设置了一个 LaTeX 项目 tex documents some file tex support todonotes sty where some file tex uses todonotes usepackage colorinl
  • 使用 WGL 创建现代 OpenGL 上下文?

    我正在尝试使用 Windows 函数创建 OpenGL 上下文 现代版本 基本上代码就是 创建窗口类 注册班级 创建一个窗口 choose PIXELFORMATDESCRIPTOR并设置它 创建旧版 OpenGL 上下文 使上下文成为当前
  • Android 材料芯片组件崩溃应用程序。无法膨胀 xml

    Tried Chip来自两个支持库的组件 com google android support design 28 0 0 rc01和材料 com google android material material 1 0 0 rc01 堆栈
  • PyAudio ErrNo 输入溢出 -9981

    我遇到了与用户相同的错误 Python 使用 Pyaudio 以 16000Hz 录制音频时出错 https stackoverflow com questions 12994981 python error audio recording
  • 探查器模板可以迁移到较新版本的 SQL Profiler 吗?

    是否可以将 Profiler 模板迁移到较新版本的 SQL Server 就我而言 我想将 SQL 2008 模板带到 2012 年 我尝试过 1 直接文件复制和 2 导出 导入 在这两种情况下 旧模板都会运行 但无法修改 修改后会出现以下

随机推荐

  • 我们如何在 R.id 中使用变量

    xml的内容是
  • 在模板类中声明一个结构体,未定义成员函数

    我目前正在尝试使用列表类私有的节点结构在列表模板类中实现排序算法 我正在使用一些私有递归函数 它们返回一个指向节点类型的指针 这会导致 g 给我一个声明错误 这是我所拥有的样本 template
  • 组的 Firebase 存储安全规则

    我知道对此有几个问题 例如https stackoverflow com a 52808572 3481904 但对于我的情况我仍然没有好的解决方案 我的应用程序有Groups 动态创建 删除 并且可以随时添加 删除成员 用户 Each 群
  • Python 目录遍历器

    我目前正在使用目录遍历器Here import os class DirectoryWalker a forward iterator that traverses a directory tree def init self direct
  • 使用 grep 计算多个文件中某个字符串的所有出现次数

    我有一堆日志文件 我需要找出某个字符串在所有文件中出现了多少次 grep c string returns file1 1 file2 0 file3 0 使用管道 我只能获取出现一次或多次的文件 grep c string grep v
  • SIGINT 与其他终止信号(例如 SIGTERM、SIGQUIT 和 SIGKILL)有何关系?

    在 POSIX 系统上 终止信号通常具有以下顺序 根据许多手册页和 POSIX 规范 SIGTERM 礼貌地要求进程终止 它应该优雅地终止 清理所有资源 文件 套接字 子进程等 删除临时文件等 SIGQUIT 更强烈的要求 它将终止不正常的
  • 将 Azure 服务总线与 Android 连接

    我编写了一个简单的 java 程序 jdk 1 7 它列出了所有服务总线主题并将每个主题的名称打印到标准输出 try String namespace myservicebus from azure portal String issuer
  • 用于 cookie 的编码方案

    RFC 6265 第 6 1 节指定每个 cookie 至少允许 4096 字节 现在为了知道有多少人物允许每个 cookie 我需要知道用于 cookie 的字符编码 因为 RFC 指定了每个 cookie 的最大大小bytes并不是人物
  • 在视图中访问会话变量

    由于我无法访问视图中的会话变量 我想知道是否需要向视图添加更多内容才能使其正常工作 在我看来 Session ComputerNumber ToString 控制器 Session ComputerNumber game RandomNum
  • 使用 PDO 获取单行、单列

    我有一个 mysql 查询 其目标是单行中的单列 SELECT some col name FROM table name WHERE user user 当我执行该语句后 stmt gt execute 如何将这个单个单元格直接放入没有循
  • C语言中如何确定文件的大小?

    如何计算文件的大小 以字节为单位 include
  • 类型错误:无法读取未定义的属性“getState”

    我想尝试小型 redux 示例 因此我安装了 redux 但出现此错误 类型错误 无法读取未定义的属性 getState 新的提供者 webpack internal node modules react redux es componen
  • 如何在 Silverlight 应用程序中调试 IIS 托管的 Web 服务

    有人知道如何在 Silverlight 4 0 应用程序中调试由 IIS 托管的 Web 服务吗 我的IIS版本是7 5 操作系统是windows 7 您能具体说明如何操作的步骤吗 太感谢了 运行解决方案时 在调试模式下 或具有最新的符号文
  • 如何将UIView转换为没有背景的UIImage?

    我有包含图钉图像和标签的 UIView 因为我们知道 UIView 是矩形 所以如果我将 UIView 转换为 UIImage UIImage 也是矩形 我想让 UIImage 像图钉图像一样 因为如果用户单击背景 UIImage 的事件将
  • C# 圣诞树

    我是 C 新手 因此我请求帮助我实现此目的 我刚刚有这个代码 class Program static void Main string args AnotherTriangle ob new AnotherTriangle ob Crea
  • 寻找图像中的空白区域

    这个问题在某种程度上与语言无关 但我选择的工具恰好是 numpy 数组 我正在做的是通过 PIL 获取两个图像的差异 img ImageChops difference img1 img2 我想找到包含从一张图片到另一张图片的变化的矩形区域
  • 对于由苹果的 Health App - HealthKit - iOS 创建的健康数据,HKMetadataKeyTimeZone 始终为零

    我正在使用 HealthKit 读取用户的健康数据 尝试从健康数据中获取时区信息 以确定健康活动发生在哪个确切时区 为此 我依赖 HealthKit 元数据中的 HKMetadataKeyTimeZone 键 但即使对于苹果健康应用程序自动
  • 如何通过 at() 函数访问二维向量的索引?

    我将在成员函数中初始化一个 2D 向量 其中输入参数计划被输入到函数参数内的确定索引中 此外 出于安全考虑 我不会使用 运算符来进行成员访问 如何使用 at 函数来访问 2D 向量的索引 如下所示 vector
  • 如何正确显示孟加拉语文本

    我有一个JTextArea我需要在其中显示孟加拉语文本 例如 但我只能看到长方形的盒子 如何正确显示孟加拉语字符 首先采用孟加拉 unicode 支持的字体 例如 Font banglaFont new Font Arial Unicode
  • os.sched_getaffinity(0) 与 os.cpu_count()

    所以 我知道标题中两种方法的区别 但不知道实际含义 据我了解 如果您使用的 NUM WORKERS 数量多于实际可用的核心数量 您将面临性能大幅下降 因为您的操作系统不断地来回切换 试图保持并行 不知道这有多真实 但我在某处从比我聪明的人那