无需编写代码,如何获取Linux当前Shell的可用亲和核心数?
获取当前Shell亲和性限制下的可用核心数
在Linux环境中,无需编译代码即可通过以下几种方式获取当前Shell受亲和性限制后的可用核心数量:
方法1:利用taskset解析亲和性掩码
taskset可直接查看当前进程的CPU亲和性掩码,通过计算掩码二进制中1的数量得到可用核心数:
taskset -p $$ | awk '{print $NF}' | xargs -I {} echo "obase=2; ibase=16; {}" | bc | grep -c "1"
说明:
taskset -p $$:查看当前Shell进程($$代表当前进程ID)的亲和性配置,输出最后一列是十六进制格式的核心掩码。echo "obase=2; ibase=16; {}" | bc:将十六进制掩码转换为二进制字符串。grep -c "1":统计二进制字符串中1的个数,即当前可使用的核心数量。
方法2:解析/proc/self/status的核心范围列表
/proc/self/status中的Cpus_allowed_list字段直接列出了当前进程可访问的CPU核心范围,通过脚本解析该字段计算总数:
grep Cpus_allowed_list /proc/self/status | awk -F ':|\t' '{split($2, ranges, ","); total=0; for(r in ranges) {split(ranges[r], bounds, "-"); if(bounds[2] == "") {total++} else {total += bounds[2] - bounds[1] + 1}} print total}'
说明:
grep Cpus_allowed_list /proc/self/status:提取核心范围信息,格式示例:0-1,3-5。awk脚本:分割每个核心范围,单个核心(如2)直接计数,连续范围(如0-1)计算区间长度并累加,最终输出总核心数。
方法3:简洁版taskset+printf计算
借助printf直接转换十六进制掩码为二进制,再统计1的数量,比方法1更精简:
printf "%b\n" $(taskset -p $$ | awk '{print $NF}' | sed 's/^0x/\\x/g') | grep -o "1" | wc -l
内容的提问来源于stack exchange,提问作者Henrique Bucher
相关产品推荐
相关产品推荐

