|
|
HIGH_CORES=(6 7) # 高优先级核心编号
HIGH_MASK=0
# 计算 HIGH_MASK
for CORE in "${HIGH_CORES[@]}"; do
HIGH_MASK=$((HIGH_MASK | (1 << CORE)))
done
# 转换为十六进制格式
HIGH_MASK_CPU=$(printf "%x" "$HIGH_MASK")
ALL_CORES=(0 1 2 3 4 5 6 7) # 全部核心编号
ALL_MASK=0
# 计算 ALL_MASK
for CORE in "${ALL_CORES[@]}"; do
ALL_MASK=$((ALL_MASK | (1 << CORE)))
done
# 转换为十六进制格式
ALL_MASK_CPU=$(printf "%x" "$ALL_MASK")
# 主循环,持续监控进程
while true; do
# 获取当前前台应用的 PID
CURRENT_PID=$(ps -eo res,pid,cmdline --sort=+res | tail -n 1 | awk '{print $2}')
CMDLINE=$(ps -eo res,pid,cmdline --sort=+res | tail -n 1 | awk '{print $3}')
if [ -n "$CURRENT_PID" ]; then
# 跳过 system_server 的进程
if [[ "$CMDLINE" == *"system_server"* ]]; then
echo "跳过 system_server 进程:PID=$CURRENT_PID"
sleep 0.5
continue
fi
# 检查是否已经记录过该 PID 的线程 ID
if [ -z "${PID_TID_MAP[$CURRENT_PID]}" ]; then
# 如果未记录,查找并记录 CPU 占用最高的线程的 tid
cpu_usage=$(ps -T -p $CURRENT_PID -o pid,tid,%cpu | awk 'NR > 1')
FIRST_TID=$(echo "$cpu_usage" | sort -k3nr | awk 'NR==1 {print $2}')
PID_TID_MAP[$CURRENT_PID]=$FIRST_TID
echo "记录新的 PID:$CURRENT_PID,线程 ID:$FIRST_TID"
else
FIRST_TID=${PID_TID_MAP[$CURRENT_PID]}
echo "使用已记录的 PID:$CURRENT_PID,线程 ID:$FIRST_TID"
fi
# 为记录的线程分配 CPU 核心
taskset -p $HIGH_MASK_CPU $FIRST_TID
# 设置该线程的实时调度优先级
chrt -r -p $FIRST_TID 1
echo "$FIRST_TID taskset $HIGH_MASK_CPU $FIRST_TID chrt"
sleep 1
# 为其余线程分配 CPU 核心 0-7
for TID in $(ps -T -p $CURRENT_PID -o tid=); do
if [ "$TID" != "$FIRST_TID" ]; then
taskset -p $ALL_MASK_CPU $TID
echo "$TID taskset $ALL_MASK_CPU"
fi
done
fi
sleep 0.5
done
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|