gpt4 book ai didi

bash打印线程亲和性解析

转载 作者:行者123 更新时间:2023-11-29 09:28:05 25 4
gpt4 key购买 nike

我有以下功能:

affinity ()
{
local tid TASKSET CORE;
for tid in $(ps -efL | awk '/foo.*d/ {print $4}');
do
TASKSET=($( taskset -pc $tid | awk -F"[' ]" '{print $2,$NF}' ));
CORE[${TASKSET[1]}]="${CORE["${TASKSET[1]}"]} ${TASKSET[0]}";
done;
for i in "${!CORE[@]}";
do
printf "Core %-2s:%2s\n" "$i" "${CORE[$i]}";
done
}

它通常打印这样的东西:

$ affinity
Core 5 : 2545
Core 9 : 14621 14640
Core 10: 1056
Core 11: 1081

我注意到它运行良好,直到我遇到一个服务器,每个线程的 taskset 返回了 1 个以上的 CPU,这破坏了这个脚本/函数:

$ taskset -pc 14471
pid 14471's current affinity list: 0-3
$ taskset -pc 14621
pid 14621's current affinity list: 4,5
$ affinity
-bash: CORE: bad array subscript
-bash: CORE[${TASKSET[1]}]: bad array subscript

您建议我如何改进此脚本以处理这种情况?

更多详情:

$ taskset
taskset (util-linux-ng 2.17.2)
usage: taskset [options] [mask | cpu-list] [pid | cmd [args...]]
set or get the affinity of a process

-p, --pid operate on existing given pid
-c, --cpu-list display and specify cpus in list format
-h, --help display this help
-V, --version output version information

The default behavior is to run a new command:
taskset 03 sshd -b 1024
You can retrieve the mask of an existing task:
taskset -p 700
Or set it:
taskset -p 03 700
List format uses a comma-separated list instead of a mask:
taskset -pc 0,3,7-11 700
Ranges in list format can take a stride argument:
e.g. 0-31:2 is equivalent to mask 0x55555555

至于linux的类型,是custom dist:

$ uname -a
Linux MySrv 2.6.32-358.23.2.61.foo.x86_64 #1 SMP PREEMPT Wed Jun 18 06:59:23 CDT 2014 x86_64 x86_64 x86_64 GNU/Linux

谢谢

解决方法:在汇总了以下所有重要线索和答案之后,这就是我得出的结论:这也处理了初始问题遗漏的 0,1,4-6 输出。

affinity ()
{
local ii tid CORE CORES_STR CORES_ARR;
for tid in $(ps -Leo tid,command | awk '/[f]oo.*d/ {print $1}');
do
CORES_STR=($(taskset -pc $tid | awk '{gsub(/,/," ",$NF);print $NF}'));
CORES_ARR=();
for ii in ${CORES_STR[@]};
do
[[ $ii =~ - ]] && CORES_ARR+=($(eval echo {${ii/-/..}})) || CORES_ARR+=($ii);
done;
for ii in ${CORES_ARR[@]};
do
CORE[${ii}]="${CORE[${ii}]} $tid";
done;
done;
for ii in "${!CORE[@]}";
do
printf "Core %-2d:%2s\n" "$ii" "${CORE[$ii]}";
done
}

最佳答案

在您的函数中包含一个范围解析器,以识别一个范围内的所有核心。这是一个获取范围数组中所有核心的示例。然后遍历它以将进程添加到所有核心。

#!/bin/bash

range=0,3,7-11
cores=()
while read part; do
if [[ $part =~ - ]]; then
cores+=($(seq ${part/-/ }))
else
cores+=($part)
fi
done < <( echo $range | tr ',' '\n' )

for core in ${cores[*]}; do
echo $core
done

从@bishop 那里得到启发,这可以通过 eval 和 bash 扩展进行一些简化,例如:

range=0,3,7-11
cores=()
IFS=',' read -ra parts <<<$range
for part in "${parts[@]}"; do
[[ $part =~ - ]] && cores+=($(eval echo {${part/-/..}})) || cores+=($part)
done

关于bash打印线程亲和性解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25507535/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com