【问题标题】:How to determine which CPUs are online on Linux如何确定 Linux 上哪些 CPU 在线
【发布时间】:2021-05-17 07:36:53
【问题描述】:

在 Linux 上,C 函数 sysconf(_SC_NPROCESSORS_CONF)get_nprocs_conf() 返回系统中配置的逻辑处理器的数量,而 sysconf(_SC_NPROCESSORS_ONLN)get_nprocs() 返回当前可用的逻辑处理器的数量。

它们的值可能不同,因为具有热插拔 CPU 的系统可能会添加/移除 CPU。

我想确切知道哪些逻辑处理器可用,因此我可以避免调用 sched_setaffinity() 并将亲缘关系设置为已配置但不可用的逻辑处理器。

是否有用户模式功能可以列出 CPU ID 或提供所有可用 CPU 的掩码?

或者如果没有这样的用户模式功能,假设配置的 CPU 数量和可用的 CPU 数量相同有多安全?

【问题讨论】:

  • 对 /proc/cpuinfo 的快速而肮脏的解析对你有用吗?
  • 最好不要,因为这涉及到解析文本。我正在寻找一个快速的本机功能。在网上搜索我找到了for_each_cpu,但我的 Debian Linux 似乎没有(或者它可能只是用于内核开发)。
  • I'm looking for a fast native function 编写自己的内核模块。 found for_each_cpu for_each_cpu 是一个函数inside内核源码。它在外面不可用。
  • 我只是在研究如何从用户模式访问这些信息。或者可以安全地假设在用户模式下配置和可用的 CPU 是相同的?

标签: c linux


【解决方案1】:

我不知道是否有任何 API 可以获取该信息,但在用户空间中您可以使用 /sys/devices/system/cpu/ 获取各种 CPU 信息

cat /sys/devices/system/cpu/offline # get the list of offline CPUs
cat /sys/devices/system/cpu/online  # get the list of online CPUs
ls -ld /sys/devices/system/cpu/cpu* # get the list of CPUs
cat /sys/devices/system/cpu/cpu*/online # print individual CPU's online/offline status

在 C 中你可以打开这些文件并解析它们的内容

另见CPU hotplug in the Kernel

【讨论】:

  • 我想避免解析文件,但你的最后一个建议很容易接缝,因为每个文件只包含 0 或 1。但是 cpu0 似乎不包括在内。当我在我的系统上运行 cat /sys/devices/system/cpu/cpu*/online|wc -l 时,我得到 19 个,而我有 20 个逻辑处理器。
  • @BrechtSanders 这很奇怪。我检查了许多系统,总是有 CPU0。我自己也不喜欢读 sysfs,但是我公司的很多项目都用它来读数据
  • 是的,CPU0 总是有的,但在大多数情况下它不能下线,所以没有/sys/devices/system/cpu/cpu0/online 状态
【解决方案2】:

/sys/devices/system/cpu中,有各种伪文件用于在线/离线查询和获取cpus。 /sys/devices/system/cpu/online 为您提供以逗号分隔的范围列表:

$ cat /sys/devices/system/cpu/online
0-6,8-9,11,13-15

您可以通过以下方式扩展范围:

$ perl -pe 's/(\d+)-(\d+)/join(",",$1..$2)/eg' /sys/devices/system/cpu/online
0,1,2,3,4,5,6,8,9,11,13,14,15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2021-11-03
    • 2021-12-02
    • 1970-01-01
    相关资源
    最近更新 更多