0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

为什么使用trace-event解决系统还不能深度睡眠问题?

Linux阅码场 来源:Linuxer 作者:Linuxer 2021-01-15 14:07 次阅读

最近遇到一个问题,系统不能睡眠到c7s, 只能睡眠到c3. (c-state不能到c7s, cpu的c-state, c0是运行态,其它状态都是idle态,睡眠的越深,c-state的值越大)

a01734c0-56f1-11eb-8b86-12bb97331649.png

这时候第一感觉是不是系统很忙导致, 使用pert top看一下耗cpu的进程和热点函数:

1perf top -E 100 --stdio 》 perf-top.txt2 19.85% perf [。] __symbols__insert 3 7.68% perf [。] rb_next 4 4.60% libc-2.26.so [。] __strcmp_sse2_unaligned 5 4.20% libelf-0.168.so [。] gelf_getsym 6 3.92% perf [。] dso__load_sym 7 3.86% libc-2.26.so [。] _int_malloc 8 3.60% libc-2.26.so [。] __libc_calloc 9 3.30% libc-2.26.so [。] vfprintf 10 2.95% perf [。] rb_insert_color 11 2.61% [kernel] [k] prepare_exit_to_usermode 12 2.51% perf [。] machine__map_x86_64_entry_trampolines 13 2.31% perf [。] symbol__new 14 2.22% [kernel] [k] do_syscall_64 15 2.11% libc-2.26.so [。] __strlen_avx2

发现系统中只有perf工具本身比较耗cpu :(

然后就想到是不是系统中某个进程搞的鬼,不让cpu睡眠到c7s. 这时候使用trace event监控一下系统中sched_switch事件。 使用trace-cmd工具监控所有cpu上的sched_switch(进程切换)事件30秒:

#trace-cmd record -e sched:sched_switch -M -1 sleep 302CPU0 data recorded at offset=0x63e000 3 102400 bytes in size 4CPU1 data recorded at offset=0x657000 5 8192 bytes in size 6CPU2 data recorded at offset=0x659000 7 20480 bytes in size 8CPU3 data recorded at offset=0x65e000 9 20480 bytes in size

使用trace-cmd report 查看一下监控结果,但是查看这样的原始数据不够直观,没有某个进程被切换到的统计信息

1#trace-cmd report2cpus=4 3 trace-cmd-19794 [001] 225127.464466: sched_switch: trace-cmd:19794 [120] S ==》 swapper/1:0 [120] 4 trace-cmd-19795 [003] 225127.464601: sched_switch: trace-cmd:19795 [120] S ==》 swapper/3:0 [120] 5 sleep-19796 [002] 225127.464792: sched_switch: sleep:19796 [120] S ==》 swapper/2:0 [120] 6 《idle》-0 [003] 225127.471948: sched_switch: swapper/3:0 [120] R ==》 rcu_sched:11 [120] 7 rcu_sched-11 [003] 225127.471950: sched_switch: rcu_sched:11 [120] W ==》 swapper/3:0 [120] 8 《idle》-0 [003] 225127.479959: sched_switch: swapper/3:0 [120] R ==》 rcu_sched:11 [120] 9 rcu_sched-11 [003] 225127.479960: sched_switch: rcu_sched:11 [120] W ==》 swapper/3:0 [120] 10 《idle》-0 [003] 225127.487959: sched_switch: swapper/3:0 [120] R ==》 rcu_sched:11 [120] 11 rcu_sched-11 [003] 225127.487961: sched_switch: rcu_sched:11 [120] W ==》 swapper/3:0 [120] 12 《idle》-0 [002] 225127.491959: sched_switch: swapper/2:0 [120] R ==》 kworker/2:2:19735 [120] 13 kworker/2:2-19735 [002] 225127.491972: sched_switch: kworker/2:2:19735 [120] W ==》 swapper/2:0 [120]。..

trace-cmd report 的结果使用正则表达式过滤一下,然后排序统计:

1trace-cmd report | grep -o ‘==》 [^ ]+:?’ | sort | uniq -c 2 3 ==》 irqbalance:1034 3 3 ==》 khugepaged:43 4 20 ==》 ksoftirqd/0:10 5 1 ==》 ksoftirqd/1:18 6 18 ==》 ksoftirqd/3:30 7 1 ==》 kthreadd:19798 8 1 ==》 kthreadd:2 9 4 ==》 kworker/0:0:19785 10 1 ==》 kworker/0:1:19736 11 5 ==》 kworker/0:1:19798 12 5 ==》 kworker/0:1H:364 13 53 ==》 kworker/0:2:19614 14 19 ==》 kworker/1:1:7665 15 30 ==》 tuned:19498 19 。..

发现可疑线程tuned,30秒内被切换到运行了30次,其它线程都是常规线程。

此时查看一下系统中是否开启了tuned服务:

a05369ea-56f1-11eb-8b86-12bb97331649.png

果真是系统开启了tuned服务,然后拉起了名字为tuned的线程。

查看一下tuned服务的配置文件:

localhost:/home/jeff # tuned-adm active Current active profile: sap-hana localhost:/home/jeff # cat /usr/lib/tuned/sap-hana/tuned.conf [main] summary=Optimize for SAP NetWeaver, SAP HANA and HANA based products [cpu] force_latency = 70

发现关于cpu这一项,设置强制延迟时间为70秒 force_latency = 70 ,这个是为了优化HANA数据库。

到底force_latency怎样起作用,经过一顿搜索,发现这个值是被设置进了/dev/cpu_dma_latency

使用lsof /dev/cpu_dma_latency, 发现tuned线程确实是在操作这个文件

#lsof /dev/cpu_dma_latency COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME tuned 18734 root 9w CHR 10,60 0t0 11400 /dev/cpu_dma_latency

而且Linux内核文档也说明了/dev/cpu_dma_latency文件,如果要对它进行写操作,要open之后写数据之后不close,如果释放掉了文件描述符它就又会恢复到默认值,这也印证了上面lsof /dev/cpu_dma_latency是有输出结果的。

https://github.com/torvalds/linux/blob/v5.8/Documentation/trace/coresight/coresight-cpu-debug.rst As specified in the PM QoS documentation the requested parameter will stay in effect until the file descriptor is released. For example: # exec 3《》 /dev/cpu_dma_latency; echo 0 》&3 。.. Do some work.。. 。.. # exec 3《》-

查看一下/dev/cpu_dma_latency文件的内容,确实是70,也就是(force_latency = 70)

localhost:/home/jeff # cat /dev/cpu_dma_latency | hexdump -Cv 00000000 46 00 00 00 |F.。.| localhost:/home/jeff # echo $((0x46)) 70

此时查看一下系统中cpu各个睡眠态的描述和延迟时间值:

# cd /sys/devices/system/cpu/cpu0/cpuidle/ # for state in * ; do echo -e “STATE: $state DESC: $(cat $state/desc) NAME: $(cat $state/name) LATENCY: $(cat $state/latency) RESIDENCY: $(cat $state/residency)” done

发现C3态的延迟时间是33微秒,C4的延时时间是133微秒,所以(force_latency = 70) ,

系统就只能睡眠到C3了 。(延迟时间就是从此睡眠态唤醒到运行态的时间)

STATE: state0 DESC: CPUIDLE CORE POLL IDLE NAME: POLL LATENCY: 0 RESIDENCY: 0 STATE: state1 DESC: MWAIT 0x00 NAME: C1 LATENCY: 2 RESIDENCY: 2 STATE: state2 DESC: MWAIT 0x01 NAME: C1E LATENCY: 10 RESIDENCY: 20 STATE: state3 DESC: MWAIT 0x10 NAME: C3 LATENCY: 33 RESIDENCY: 100 STATE: state4 DESC: MWAIT 0x20 NAME: C6 LATENCY: 133 RESIDENCY: 400 STATE: state5 DESC: MWAIT 0x32 NAME: C7s LATENCY: 166 RESIDENCY: 500

此时关闭tuned 服务, 再查看一下 /dev/cpu_dma_latency的值,变成了默认的2000秒

localhost:/home/jeff # tuned-adm off localhost:/home/jeff # cat /dev/cpu_dma_latency | hexdump -Cv 00000000 00 94 35 77 |。.5w| localhost:/home/jeff # echo $((0x77359400)) 2000000000

然后验证一下,此时系统可以睡眠到C7s了,此问题得到解决 :)

a094b06c-56f1-11eb-8b86-12bb97331649.png

解决此问题,主要用到了Linux内核本身提供的trace-event.

所以任何一个功能都不能小看,内核就是这样,一般看上去很无聊的功能,被一些工程师用很认真的态度打磨出来之后,潜力还是非常大的:)

原文标题:使用trace-event解决系统不能深度睡眠的问题

文章出处:【微信公众号:Linuxer】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10434

    浏览量

    206521
  • Linux
    +关注

    关注

    87

    文章

    10986

    浏览量

    206720

原文标题:使用trace-event解决系统不能深度睡眠的问题

文章出处:【微信号:LinuxDev,微信公众号:Linux阅码场】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PSoC CAN不会从深度睡眠中醒来是怎么回事?

    亲爱的论坛:我们用 PSoC6 开发了嵌入式软件。 但是我们遇到了以下问题:在某些主板上,PSoC6 CAN无法从深度睡眠中醒来。 我们通过以下方法开发了深度睡眠和醒来过程: 第
    发表于 01-31 08:03

    如何使用UART将TRAVEOTM T 2G设备从深度睡眠中唤醒

    此代码示例说明如何使用 UART 将 TRAVEOTM T 2G 设备从深度睡眠中唤醒。 在活动模式下,TRAVEOTM T 2G 设备通过 UART 接收数据并回显接收到的数据。 MCU 在接收
    发表于 01-31 06:08

    CapSense5可以在扫描时进入深度睡眠吗?

    我试着让 CapSense5 在扫描时进入深度睡眠,就像 MSCLP 一样。 我用的是CY8CKIT-041S-MAX。 我用 1 个按钮 (BTN0) 配置 CAPSENSE™ 我将扫描模式设置
    发表于 01-24 08:06

    CY8C4247LQI-BL483使用GPIO中断作为唤醒源将芯片从深度睡眠模式中唤醒,为什么不起作用?

    我正在使用 CY8C4247LQI-BL483 处理器。 我正在尝试使用 GPIO 中断作为唤醒源将芯片从深度睡眠模式中唤醒。 当处理器启动时 LED 会切换 10 秒,之后通过
    发表于 01-24 07:05

    睡眠/深度睡眠模式下通过调试器TRACE32读取来自ITCM/DTCM地址的数据,会出现问题吗?

    TRACE32 在睡眠/深度睡眠模式下访问地址 ITCM/DTCM 时,会出现核心断电问题。 (在活动模式下是正常的) 但是,在睡眠/
    发表于 01-18 10:48

    AT32F4如何进入深度睡眠模式

    AT32F4 如何进入深度睡眠模式(Deepsleep Mode)?
    发表于 10-20 08:27

    如何对基于μTraceTrace32的LPC86x进行边界扫描

    电子发烧友网站提供《如何对基于μTraceTrace32的LPC86x进行边界扫描.pdf》资料免费下载
    发表于 08-17 10:22 1次下载
    如何对基于μ<b class='flag-5'>Trace</b>和<b class='flag-5'>Trace</b>32的LPC86x进行边界扫描

    智能手环测睡眠质量的原理

    智能手环此时监测到的体动大多会判断佩戴者是浅睡眠状态;而深度睡眠的时候人的肌肉会松弛,肢体也不会产生较大的运动,甚至不会动,此时睡眠手环记录到的体动较少,就认为是深
    发表于 07-25 11:38 1488次阅读
    智能手环测<b class='flag-5'>睡眠</b>质量的原理

    M261芯片如何进入睡眠深度睡眠模式,以及如何退出来?有没有C语言参考?

    M261芯片如何进入睡眠深度睡眠模式,以及如何退出来?有没有C语言参考?
    发表于 06-20 07:19

    NodeMCU 12E esp 8266深度睡眠的功耗问题求解

    。功耗始终在 77mA 左右,数据表显示功耗应在 20 毫安培左右。请帮忙。 电路板进入深度睡眠 20 分钟并唤醒,没问题,但深度睡眠中的功耗是个问题。这是代码: 代码:全选#incl
    发表于 06-07 06:28

    ESP8266无法从深度睡眠中唤醒是怎么回事?如何解决?

    前段时间我买了 2 个“HiLetgo”ESP8266 (ESP-12E),其中一个用于带有一堆传感器的小型太阳能气象站。 我设置了 10 分钟深度睡眠,效果很好。 另一个ESP8266似乎深度
    发表于 05-25 14:34

    ESP8266 NodeMCU让ESP进入深度睡眠结果并不令人满意怎么解决?

    即使经过几天的谷歌搜索和测试,我仍然无法独自解决一个问题。 我试图让我的 ESP 进入深度睡眠,但结果并不令人满意。所以我有这个传统的测量、发送和睡眠程序。在我执行
    发表于 05-15 08:00

    ESP8266 NodeMCU真正进入深度睡眠状态时消耗多少电量?

    %)、15 分钟(电池电量 <50%)、30 分钟(电池电量 <20%)收集一次数据,并发送到另一个“工作”为远程显示器的 ESP8266,然后发送到“气象站”进入深度睡眠
    发表于 05-12 08:42

    ESP8266有没有办法忽略所有随后施加到RST引脚的低信号,直到系统再次进入深度睡眠模式?

    我已经尝试解决这个问题一段时间了,但运气不佳。我想使用簧片开关(或任何开关)将 ESP8266 从深度睡眠模式唤醒。问题是簧片开关(或任何开关)可能会产生多个“事件”,我只需要重置 ESP-12E 一次。 有没有办法忽略所有随后施加到 RST 引脚的低信号,直到
    发表于 05-12 06:28

    是否可以在深度睡眠期间保持已编程的gpio状态?

    我想知道是否可以在深度睡眠期间保持已编程的 gpio 状态。我测量到一些 gpio 在深度睡眠期间具有高状态,例如当 rst-pin 连接到 gpio16 时。我的目的是通过在 gpi
    发表于 04-28 08:55