Project

General

Profile

RK性能调整

  1. cpu信息
    1) 搭载八核(Cortex-A76 x 4 + Cortex-A55 x 4)64位 CPU,主频高达2.4 GHz。
    2) cat /proc/cpuinfo
      CPU part: 0xd05 代表 Cortex-A55 小核心
      CPU part: 0xd0b 代表 Cortex-A76 大核心
      小核(A55)的CPU variant是0x2
      大核(A76)的CPU variant是0x4
    3) lscpu
    4) 查看cpu频率:cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_cur_freq
    5)查看cpu最大频率:cat /sys/devices/system/cpu/cpu*/cpufreq/cpuinfo_max_freq
    6)查看cpu拓扑结构:cat /sys/devices/system/cpu/cpu*/topology/physical_package_id
      每个物理 CPU 封装都有一个唯一的 ID
      相同的 physical_package_id 表示这些逻辑 CPU 核心属于同一个物理 CPU 封装
    7)查看cpu频率当前策略
      cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
      performance:始终保持最高频率
      powersave:始终保持最低频率
      ondemand:根据负载动态调节
      interactive:交互式动态调节
      conservative类似ondemand,但频率调节更保守
      userspace允许用户空间程序直接控制CPU频率,可以通过编程方式精确控制
      schedutil与Linux调度器深度集成的调频策略,根据调度器信息来调节频率,是较新的调频策略,效率较高
    8)查看cpu频率支持的策略
      cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
    9)设置新策略(需要root权限)
      echo "performance" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
      echo performance | tee /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
      echo performance | tee $(find /sys/ -name *governor)
    
  2. DDR信息
    1) 查看ddr频率
      cat /sys/class/devfreq/dmc/cur_freq(单位hz)
    2)查看ddr可行频率
      cat /sys/class/devfreq/dmc/available_frequencies
    3)设置ddr频率
      echo userspace > /sys/class/devfreq/dmc/governor
      echo 2112000000 > /sys/class/devfreq/dmc/userspace/set_freq
    
  3. CPU亲和性
    1)查看
      taskset -c -p pid
    2) 设置
      设置进程的 CPU 亲和性(限制只能在 CPU0 上运行)
      taskset -c -p 0 pid
      设置进程在多个 CPU 上运行
      taskset -c -p 0,1,2 pid
    

    // c++设置cpu亲和性
    #include <sched.h>
    cpu_set_t cpuset;
    CPU_ZERO(&cpuset);
    CPU_SET(4, &cpuset);
    int ret = sched_setaffinity(0, sizeof(cpuset), &cpuset);
    if (ret == -1) 
    {
        LOG(ERROR) << "Failed to set CPU affinity: " << strerror(errno);
    }
    
    cpu_set_t get_cpuset;
    CPU_ZERO(&get_cpuset);
    if (sched_getaffinity(0, sizeof(get_cpuset), &get_cpuset) == -1) {
        LOG(ERROR) << "Failed to get CPU affinity: " << strerror(errno);
    } else {
        for (int i = 0; i < CPU_SETSIZE; i++) {
            if (CPU_ISSET(i, &get_cpuset)) {
                LOG(INFO) << "Thread running on CPU " << i;
            }
        }
    }
    

    # python设置cpu亲和性
    import os
    import psutil
    
    cpuset = {6, 7}
    try:
        p = psutil.Process(os.getpid())
        p.cpu_affinity(cpuset)
    except Exception as e:
        print(f"Failed to set CPU affinity: {e}")
    
  4. 查看进程状态
    watch -n 1 "ps -mo pid,tid,psr,pcpu,comm -p pid"(psr为cpu号)
    htop -p pid
    watch -n 1 "ps -mo pid,tid,psr,pcpu,comm -C mas" 
    htop -p $(pgrep name)
    其它:
    ls -l /proc/<pid>/task/
    cat /proc/pid/stat | cut -d' ' -f39
    pidstat -p pid -t 1
    pstack <pid>
    进程状态:
    R (Running)进程正在运行中或在运行队列中等待运行
    S (Sleep)可中断的睡眠状态,进程正在等待某个事件完成(如等待 I/O 操作)
    D (Disk Sleep)不可中断的睡眠状态,通常是在进行 I/O 操作,此时进程不响应任何信号
    Z (Zombie)僵尸进程,进程已经终止,但父进程还没有回收它的资源
    T (Stopped)进程被停止,可能是被调试器暂停或收到 SIGSTOP 信号
    I (Idle)空闲状态的内核线程
    X (Dead)死亡状态,进程即将被销毁
    

    // 获取线程id和库线程id
    #include <sys/syscall.h>
    #include <unistd.h>
    // 获取系统级线程ID (在整个系统中唯一)
    pid_t tid = syscall(SYS_gettid);
    // 获取 pthread 库的线程ID (仅在进程内唯一)
    pthread_t ptid = pthread_self();
    LOG(INFO) << "============================Thread ID: " << tid << " pthread_id: " << ptid;
    
  5. 性能
    #!/system/bin/sh
    
    echo 1 > /sys/devices/system/cpu/cpu0/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu1/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu2/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu3/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu4/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu5/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu6/cpuidle/state1/disable
    echo 1 > /sys/devices/system/cpu/cpu7/cpuidle/state1/disable
    
    echo "NPU available frequencies:" 
    cat /sys/class/devfreq/fdab0000.npu/available_frequencies
    echo "Fix NPU max frequency:" 
    echo userspace > /sys/class/devfreq/fdab0000.npu/governor
    echo 1000000000 > /sys/class/devfreq/fdab0000.npu/userspace/set_freq
    cat /sys/class/devfreq/fdab0000.npu/cur_freq
    
    echo "CPU available frequencies:" 
    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_available_frequencies
    cat /sys/devices/system/cpu/cpufreq/policy4/scaling_available_frequencies
    cat /sys/devices/system/cpu/cpufreq/policy6/scaling_available_frequencies
    echo "Fix CPU max frequency:" 
    echo userspace > /sys/devices/system/cpu/cpufreq/policy0/scaling_governor
    echo 1800000 > /sys/devices/system/cpu/cpufreq/policy0/scaling_setspeed
    cat /sys/devices/system/cpu/cpufreq/policy0/scaling_cur_freq
    echo userspace > /sys/devices/system/cpu/cpufreq/policy4/scaling_governor
    echo 2352000 > /sys/devices/system/cpu/cpufreq/policy4/scaling_setspeed
    cat /sys/devices/system/cpu/cpufreq/policy4/scaling_cur_freq
    echo userspace > /sys/devices/system/cpu/cpufreq/policy6/scaling_governor
    echo 2352000 > /sys/devices/system/cpu/cpufreq/policy6/scaling_setspeed
    cat /sys/devices/system/cpu/cpufreq/policy6/scaling_cur_freq
    
    echo "GPU available frequencies:" 
    cat /sys/class/devfreq/fb000000.gpu/available_frequencies
    echo "Fix GPU max frequency:" 
    echo userspace > /sys/class/devfreq/fb000000.gpu/governor
    echo 1000000000 > /sys/class/devfreq/fb000000.gpu/userspace/set_freq
    cat /sys/class/devfreq/fb000000.gpu/cur_freq
    
    echo "DDR available frequencies:" 
    cat /sys/class/devfreq/dmc/available_frequencies
    echo "Fix DDR max frequency:" 
    echo userspace > /sys/class/devfreq/dmc/governor
    echo 2112000000 > /sys/class/devfreq/dmc/userspace/set_freq
    cat /sys/class/devfreq/dmc/cur_freq