Qualcomm Linux(QCS6490/QCS5430) 性能指南(十)

减轻可运行任务对用例的影响

当一个任务准备好运行但 CPU 不可用时,该任务被认为是处于可运行状态。在 CPU 负载很重时,会将可运行状态分配给任务。
要可视化线程的状态,您可以使用 Trace Compass 的控制流视图。
下图显示了由不同颜色代表的线程状态:

  • 深红线表示线程处于可运行状态。
  • 黄线代表睡眠状态。
  • 红线表示 CPU 正忙于处理中断请求 (irq) 或软中断请求 (softirq)。
    在这里插入图片描述

有两种类型的可运行任务:

  • 唤醒延迟可运行任务指的是准备好的任务从可运行状态实际转移到 CPU 上运行所需的时间。通过调整调度器或禁用 CPU的低功耗模式,可以减少这种延迟。
  • 正常可运行任务发生在 CPU 选择运行高优先级进程而不是当前进程时。提高任务的优先级可以帮助减少这些可运行任务。

线程的优先级取决于其类型:

  • 实时线程的优先级范围是 0 到 99,数字越大表示优先级越高。
    要改变实时线程的优先级,请在 sched_setscheduler() 中使用 SCHED_FIFO 策略。
  • 普通线程的优先级范围是 100 到 139,数字越小表示优先级越高。
    要改变普通线程的优先级,请使用 renice Linux 命令以及带有 SCHED_OTHER 策略的 sched_setscheduler()。范围在 -20 到 +19 的值映射到线程优先级范围 100 到 139。

要通过改变线程优先级减少可运行时间,请使用 sched_setscheduler()。
有关 sched_setscheduler() 的信息,请参见 Linux 手册页 sched_setscheduler(2)
以下是通过使用 sched_setscheduler() 改变线程优先级来减少可运行时间的示例代码:

struct sched_param param = {0};
param.sched_priority = 1;
int ret=0;
ret = sched_setscheduler(0, SCHED_FIFO, &param);

#1st param represents Task ID. 0 represents for current task.
#2nd param represent scheduler policy SCHED_FIFO is for RT threads

#sched_proriy= 1.
0--> 99 ( RT class highest priority)
1 --> 99-1 --> 98
2 --> 99-2 --> 97
..
99 --> 99-99 --> 0 (RT least priority)

默认情况下,进程优先级为 120,因为它从 shell 继承而来,可运行时间为 225 毫秒,运行时间为 267 毫秒。通过将进程优先级从 120 提高到 98(实时优先级),可运行时长减少到不到 2 毫秒。

加速 CPU 频率提升时间

过渡到更高所需 CPU 频率的延迟可能会影响性能。您可以通过调整 sched_util_clamp_min 调度器节点来加速 CPU 频率的提升。
sched_util_clamp_min 可以在 0 到 1024 的范围内进行调整。较高的值可以提高性能,但也可能增加功耗。

以下是测试线程在核心 4 上的表现示例:

  • 当 sched_util_clamp_min 为 0 时,CPU 频率从 691 MHz 缓慢提升到 1.5 GHz,然后到 1.7
    GHz。
    您可以通过运行以下命令来设置这个值:

    echo 0 > /proc/sys/kernel/sched_util_clamp_min
    

    下图显示了 CPU 频率的提升情况:
    在这里插入图片描述

  • 当 sched_util_clamp_min 为 512 时,CPU 频率直接从 691 MHz 提升到 1.9
    GHz。您可以通过运行以下命令来设置这个值:

    echo 512 > /proc/sys/kernel/sched_util_clamp_min
    

    下图显示了 CPU 频率提升到 1.9 GHz 的情况:
    在这里插入图片描述

  • 当 sched_util_clamp_min 为 1024 时,CPU 频率从 691 MHz 直接提升到最大频率(FMAX)2.4 GHz。您可以通过运行以下命令来设置这个值:

    echo 1024 > /proc/sys/kernel/sched_util_clamp_min
    

    下图显示了 CPU 频率直接从 691 MHz 提升到 FMAX 2.4 GHz 的情况:
    在这里插入图片描述

确定用例的缓存驻留性

perf 实用工具用于分析缓存未命中和缓存重新填充计数器统计信息。这种分析有助于确定特定缓存中用例的驻留性,例如 L2、L3 和 LLCC DDR 驻留性。
有关如何编译 perf 实用工具的说明,请参见编译性能工具。
以下是获取缓存驻留性的示例命令:

setenforce 0
perf stat -e l1d_cache_lmiss_rd -e l1i_cache_lmiss -e l2d_cache_lmiss_rd -e l3d_cache_lmiss_rd -e ll_cache_miss_rd sleep 5

CPU 路径中的缓存未命中计数器,从先前的缓存级别(L1 → L2 → L3 → LLCC → DDR)表明用例在后续缓存中的驻留性。

以下示例代码提供了缓存未命中计数器统计信息:

Performance counter stats for '5 duration':

              5797      l1d_cache_lmiss_rd
             26699      l1i_cache_lmiss
             16200      l2d_cache_lmiss_rd
              8634      l3d_cache_lmiss_rd
              9710      ll_cache_miss_rd

       5.004388332 seconds time elapsed

       0.001599000 seconds user
       0.000000000 seconds sys

识别锁竞争

当一个线程(thread_1)尝试获取已经被另一个线程(thread_2)持有的互斥锁(Mutex lock)时,就会发生锁竞争。
在这种情况下,thread_1 进入睡眠模式,并在 thread_2 释放互斥锁时唤醒。
要解决这个问题,请转到 Trace Compass 并选择“Select Previous State Change”:
在这里插入图片描述

下图显示了一个实例,其中线程 2993 被线程 2991 唤醒:
在这里插入图片描述

禁用抢占

内核以抢占式方式运行。这意味着任何内核进程在任何时刻都可能被暂停,以便为更高优先级的进程让路。因此,一个新任务可以在前一个任务被抢占的同一临界区开始运行。

以下程序概述了如何记录禁用抢占的持续时间:

  1. 从内核配置中启用 CONFIG_IRQSOFF_TRACER 和 CONFIG_PREEMPT_TRACER。
  2. 要收集跟踪信息,请运行以下命令:
    echo preemptoff > /sys/kernel/tracing/current_tracer
    echo 1 > /sys/kernel/tracing/tracing_on
    cat /sys/kernel/tracing/trace
    

如图所示,每次禁用抢占时都会记录一个时间戳,标记代码中的起始点和结束点:
在这里插入图片描述

有关函数跟踪器的更多信息,请参见 kernel.org/doc/Documentation/trace/ftrace.txt

调试帧丢失

帧丢失可能由于显示或摄像头等各个子系统的延迟而发生。例如,如果显示刷新率为 60 Hz,每个帧必须在 16.6 毫秒内执行完毕。

下图显示了一个跟踪情况,其中 Weston 和 SDM_EventThread 每 16.6 毫秒运行一次。任何应用程序都必须定期进行渲染,并在 16.6 毫秒的时间框架内完成渲染。如果在这个窗口到期之前渲染没有完成,帧将被丢弃。
在这里插入图片描述

识别内存抖动

内存抖动发生在系统花费大量时间从 RAM 中回收内存,然后又将相同的内容重新加载回 RAM。
这可能发生在磁盘上的文件缓存页和 ZRAM 中的匿名页,导致显著的性能下降。
当可用内存不足以满足当前用例(称为工作集)时,通常会出现内存抖动。这导致系统在寻找可以回收的内存时遇到困难。

您可以从 /proc/vmstat 中的以下信息中识别内存抖动:
表格:内存抖动– vmstat 节点

vmstat 节点描述
workingset_refault_anon/workingset_refault_file这些表示回收后立即被请求的页面数量。这些数字越低越好。
workingset_activate_anon/workingset_activate_file这些表示回收后立即被激活的页面数量。同样,数字越低越好。
Pgpgin/pswpin这些表示从交换空间读取并重新交换回 RAM 内存的页面数量。
Pgpgout/pswpout这些表示作为回收的一部分被写入交换空间的页面数量。如果 pgpg* 和 pswp* 与 workingset_refaults 同时增加,它表示出现了内存震荡情况。
pgsteal_kswapd/pgsteal_direct这些表示系统回收的页面数量。
pgscan_kswapd/pgscan_direct这些表示系统为了找到可回收内存而扫描的页面数量。pgsteal/pgscan 的比率表示系统的回收效率。较高的值表示更好的系统性能,而较低的回收效率则表示系统在寻找可回收内存时遇到困难,这是内存震荡的迹象。

要识别内存抖动,请运行以下命令:

cat /proc/vmstat

vmstat 字段如下:

workingset_refault_anon 984111
workingset_refault_file 1838690
workingset_activate_anon 502428
workingset_activate_file 499034
pgpgin 17488312
pgpgout 3398036
pswpin 984141
pswpout 2101230
pgsteal_kswapd 3946686
pgsteal_direct 59226
pgscan_kswapd 4660928
pgscan_direct 73719

所有这些计数器都会随时间线性增加。
要检测内存抖动的模式,请定期从这些计数器收集数据。然后,在特定时间段内绘制此数据以可视化模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值