我有这个脚本,但我不知道如何获得打印输出中的最后一个元素:

cat /proc/cpuinfo | awk '/^processor/{print $3}'

最后一个元素应该是cpu数量减1。


当前回答

Fravadona的回答很好,也很正确,但它需要lscpu的存在。由于在需要物理核数的系统上不存在它,所以我试图提出一个只依赖于proc/cpuinfo的系统

cat /proc/cpuinfo | grep -B2 'core id' | sed 's/siblings。* / / | tr - d的[空间:]| sed的年代/——/ \ n / g | - u | wc - l

它工作得很完美,但不幸的是,它没有Fravadona的那么坚固,因为它会崩溃

/proc/cpuinfo中字段的名称或顺序发生变化 Grep将它插入的行分隔符(当前为——)替换为其他字符串。

但是,除此之外,它完美无缺:)

以下是对正在发生的一切的快速解释

grep -B2 'core id'

只获取我们感兴趣的行(即“core id”和前面的两行)

sed 's/siblings.*/'/

去掉“兄弟姐妹…”这一行

tr -d '[:space:]'

替换空格字符

sed 's/--/\n/'g

用换行符替换由grep插入的'——'字符

sort -u

按“物理id,核心id”分组

wc -l

数一下行数

作为一个完全的菜鸟,我对自己很满意。我从来没有想过我能够将所需的行连接在一起,以“physical id”和“core id”进行分组。这有点俗气,但很管用。

如果有任何专家知道如何简化这种混乱,请告诉我。

其他回答

如果你可以使用Python,那么numexpr模块有一个函数:

In [5]: import numexpr as ne

In [6]: ne.detect_number_of_cores()
Out[6]: 8

也:

In [7]: ne.ncores
Out[7]: 8

从命令提示符中查询该信息使用:

# runs whatever valid Python code given as a string with `-c` option
$ python -c "import numexpr as ne; print(ne.ncores)"
8

或者简单地说,可以从multiprocessing.cpu_count()函数中获得此信息

$ python -c "import multiprocessing; print(multiprocessing.cpu_count())"

或者干脆使用os.cpu_count()

$ python -c "import os; print(os.cpu_count())"

你也可以使用Python!获取物理核数:

$ python -c "import psutil; print(psutil.cpu_count(logical=False))"
4

获取超线程核的数量:

$ python -c "import psutil; print(psutil.cpu_count(logical=True))"
8

上述答案适用于大多数情况,但如果您处于docker容器环境中,并且容器受到CpusetCpus的限制,那么您实际上无法通过上述方法获得真正的cpu内核。

在这种情况下,你需要这样做来获得真正的cpu内核:

grep -c 'cpu[0-9]' /proc/stat

在之前的众多答案中又多了一个。当cgroup可用时,可以使用它们。cpuset子系统提供活动cpu的列表。它可以被列在/sys/fs/cgroup的顶层cgroup中。例如:

$ cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus
0-3

然后,需要对后者进行解析,以获得活动cpu的数量。该文件的内容是一个以逗号分隔的CPU集列表。

下面是一个示例,使用tr将列表分解为单个表达式,并使用sed将间隔转换为传递给expr的算术操作:

#!/bin/sh

# For test purposes, the CPU sets are passed as parameters
#cpuset=`cat /sys/fs/cgroup/cpuset/cpuset.effective_cpus`
cpuset=$1

ncpu=0
for e in `echo $cpuset | tr ',' ' '`
do
  case $e in

    # CPU interval ==> Make an arithmetic operation
    *-*) op=`echo $e | sed -E 's/([0-9]+)-([0-9]+)/\2 - \1 + 1/'`;;

    # Single CPU number
    *) op=1;;

  esac

  ncpu=`expr $ncpu + $op`

done

echo $ncpu

下面是一些使用不同CPU集执行的例子:

$ for cpuset in "0" "0,3" "0-3" "0-3,67" "0-3,67,70-75" "0,1-3,67,70-75"
> do
>   ncpu.sh $cpuset
> done
1
2
4
5
11
11

简介: 获取物理cpu:

grep 'core id' /proc/cpuinfo | sort -u

获取物理和逻辑cpu:

grep -c ^processor /proc/cpuinfo

/proc <<这是你需要的任何关于进程和

/proc/cpuinfo <<是任何CPU信息的黄金资源。