一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

為什么使用trace-event解決系統(tǒng)還不能深度睡眠問題?

Linux閱碼場(chǎng) ? 來源:Linuxer ? 作者:Linuxer ? 2021-01-15 14:07 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

最近遇到一個(gè)問題,系統(tǒng)不能睡眠到c7s, 只能睡眠到c3. (c-state不能到c7s, cpu的c-state, c0是運(yùn)行態(tài),其它狀態(tài)都是idle態(tài),睡眠的越深,c-state的值越大)

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

這時(shí)候第一感覺是不是系統(tǒng)很忙導(dǎo)致, 使用pert top看一下耗cpu的進(jìn)程和熱點(diǎn)函數(shù):

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

發(fā)現(xiàn)系統(tǒng)中只有perf工具本身比較耗cpu :(

然后就想到是不是系統(tǒng)中某個(gè)進(jìn)程搞的鬼,不讓cpu睡眠到c7s. 這時(shí)候使用trace event監(jiān)控一下系統(tǒng)中sched_switch事件。 使用trace-cmd工具監(jiān)控所有cpu上的sched_switch(進(jìn)程切換)事件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 查看一下監(jiān)控結(jié)果,但是查看這樣的原始數(shù)據(jù)不夠直觀,沒有某個(gè)進(jìn)程被切換到的統(tǒng)計(jì)信息:

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 的結(jié)果使用正則表達(dá)式過濾一下,然后排序統(tǒng)計(jì):

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 。..

發(fā)現(xiàn)可疑線程tuned,30秒內(nèi)被切換到運(yùn)行了30次,其它線程都是常規(guī)線程。

此時(shí)查看一下系統(tǒng)中是否開啟了tuned服務(wù):

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

果真是系統(tǒng)開啟了tuned服務(wù),然后拉起了名字為tuned的線程。

查看一下tuned服務(wù)的配置文件:

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

發(fā)現(xiàn)關(guān)于cpu這一項(xiàng),設(shè)置強(qiáng)制延遲時(shí)間為70秒 force_latency = 70 ,這個(gè)是為了優(yōu)化HANA數(shù)據(jù)庫(kù)。

到底force_latency怎樣起作用,經(jīng)過一頓搜索,發(fā)現(xiàn)這個(gè)值是被設(shè)置進(jìn)了/dev/cpu_dma_latency

使用lsof /dev/cpu_dma_latency, 發(fā)現(xiàn)tuned線程確實(shí)是在操作這個(gè)文件

#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內(nèi)核文檔也說明了/dev/cpu_dma_latency文件,如果要對(duì)它進(jìn)行寫操作,要open之后寫數(shù)據(jù)之后不close,如果釋放掉了文件描述符它就又會(huì)恢復(fù)到默認(rèn)值,這也印證了上面lsof /dev/cpu_dma_latency是有輸出結(jié)果的。

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文件的內(nèi)容,確實(shí)是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

此時(shí)查看一下系統(tǒng)中cpu各個(gè)睡眠態(tài)的描述和延遲時(shí)間值:

# 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

發(fā)現(xiàn)C3態(tài)的延遲時(shí)間是33微秒,C4的延時(shí)時(shí)間是133微秒,所以(force_latency = 70) ,

系統(tǒng)就只能睡眠到C3了 。(延遲時(shí)間就是從此睡眠態(tài)喚醒到運(yùn)行態(tài)的時(shí)間)

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

此時(shí)關(guān)閉tuned 服務(wù), 再查看一下 /dev/cpu_dma_latency的值,變成了默認(rèn)的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

然后驗(yàn)證一下,此時(shí)系統(tǒng)可以睡眠到C7s了,此問題得到解決 :)

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

解決此問題,主要用到了Linux內(nèi)核本身提供的trace-event.

所以任何一個(gè)功能都不能小看,內(nèi)核就是這樣,一般看上去很無聊的功能,被一些工程師用很認(rèn)真的態(tài)度打磨出來之后,潛力還是非常大的:)

原文標(biāo)題:使用trace-event解決系統(tǒng)不能深度睡眠的問題

文章出處:【微信公眾號(hào):Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11070

    瀏覽量

    216819
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11508

    瀏覽量

    213545

原文標(biāo)題:使用trace-event解決系統(tǒng)不能深度睡眠的問題

文章出處:【微信號(hào):LinuxDev,微信公眾號(hào):Linux閱碼場(chǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    請(qǐng)問 CYW20829 深度睡眠模式是否可以通過遠(yuǎn)程 BLE 喚醒,還是必須從主機(jī)喚醒?

    請(qǐng)問 CYW20829 深度睡眠模式是否可以通過遠(yuǎn)程 BLE 喚醒,還是必須從主機(jī)喚醒? 謝謝!
    發(fā)表于 07-01 07:55

    RT-Trace調(diào)試工具正式發(fā)布!

    嵌入式開發(fā)者打造的高性能調(diào)試工具。RT-Trace支持SWD/JTAG高速連接,搭載板載顯示屏離線交互系統(tǒng)與WebUI實(shí)時(shí)監(jiān)控平臺(tái),助力代碼調(diào)試、性能分析、故障排查全流程
    的頭像 發(fā)表于 06-18 12:02 ?429次閱讀
    RT-<b class='flag-5'>Trace</b>調(diào)試工具正式發(fā)布!

    HarmonyOS Next V2 @Event

    的,而且子自己內(nèi)部不能直接修改 按照一個(gè)組件最基本的功能, 既能接收外部傳入的數(shù)據(jù) , 也要向外部傳遞數(shù)據(jù) 。那么 @Even t 修飾符就是來解決這個(gè)問題的了。 介紹 @Event 是 子組件向父
    的頭像 發(fā)表于 03-31 09:42 ?337次閱讀

    基于STM32+微波雷達(dá)設(shè)計(jì)的非接觸式睡眠監(jiān)控系統(tǒng)

    本項(xiàng)目開發(fā)一種非接觸式的睡眠監(jiān)控系統(tǒng),該系統(tǒng)利用先進(jìn)的60GHz毫米波雷達(dá)技術(shù)和STM32微控制器,實(shí)現(xiàn)了對(duì)人體在睡眠過程中的存在感知、運(yùn)動(dòng)感知以及生理指標(biāo)如呼吸頻率、心率的實(shí)時(shí)監(jiān)測(cè)。
    的頭像 發(fā)表于 10-12 14:13 ?2064次閱讀
    基于STM32+微波雷達(dá)設(shè)計(jì)的非接觸式<b class='flag-5'>睡眠</b>監(jiān)控<b class='flag-5'>系統(tǒng)</b>

    為具有邏輯的物聯(lián)網(wǎng)通信模塊啟用深度睡眠模式

    電子發(fā)燒友網(wǎng)站提供《為具有邏輯的物聯(lián)網(wǎng)通信模塊啟用深度睡眠模式.pdf》資料免費(fèi)下載
    發(fā)表于 09-13 09:46 ?0次下載
    為具有邏輯的物聯(lián)網(wǎng)通信模塊啟用<b class='flag-5'>深度</b><b class='flag-5'>睡眠</b>模式

    請(qǐng)問如何修復(fù)BLE Psoc4 IDD深度睡眠故障?

    如何修復(fù) BLE Psoc 4 IDD 深度睡眠故障
    發(fā)表于 07-22 07:20

    ESP8266-12退出深度睡眠模式時(shí)掛起怎么解決?

    數(shù)據(jù)。 問題是,當(dāng)從深度睡眠中醒來時(shí),ESP8266會(huì)掛起。當(dāng)它處于深度睡眠狀態(tài)時(shí),紅色 LED 會(huì)變暗。當(dāng)它掛起時(shí),它會(huì)變成亮紅色,藍(lán)光可能會(huì)或可能不會(huì)被點(diǎn)亮。它工作了幾個(gè)小時(shí),然
    發(fā)表于 07-22 06:26

    Adafruit Huzzah無法從深度睡眠中醒來怎么辦?

    我有一個(gè)問題,Huzzah 沒有從深度睡眠中醒來。 GPIO16 跳線到 Reset 引腳,GPIO0 和 GPIO2 都有 10k 上拉電阻到 V3.3。 如果我使用重置按鈕重置它,我會(huì)
    發(fā)表于 07-19 15:04

    是否可以使用GPIO將ESp8266從深度睡眠中喚醒,而不是下拉RESET線?

    是否可以使用 GPIO 將 ESp8266 從深度睡眠中喚醒,而不是下拉 RESET 線?
    發(fā)表于 07-19 11:06

    ESP8266 CH_PD引腳的作用是否與“深度睡眠”命令相同?

    SDK 功能system_deep_sleep ESP8266進(jìn)入深度睡眠模式。在RST引腳上的復(fù)位脈沖后,芯片將喚醒。 但是什么是CH_PD引腳功能呢?Simetimes那個(gè)標(biāo)記為CH_EN
    發(fā)表于 07-19 09:57

    ESP8266上運(yùn)行AT命令固件,通過發(fā)送命令A(yù)T GSLP使其進(jìn)入深度睡眠狀態(tài),ESP8266如何從深度睡眠中醒來?

    我正在ESP8266上運(yùn)行 AT 命令固件。我可以通過發(fā)送命令 AT GSLP 使其進(jìn)入深度睡眠狀態(tài)。但是我如何從深度睡眠中醒來ESP8266呢?是否可以發(fā)送另一個(gè) AT 命令來喚醒它
    發(fā)表于 07-16 07:32

    當(dāng)ESP8285處于深度睡眠狀態(tài)時(shí),XPD_DCDC狀態(tài)是什么?

    我想知道當(dāng)ESP8285處于深度睡眠狀態(tài)時(shí),XPD_DCDC狀態(tài)是什么。 它是否處于高邏輯水平? 還是在高阻抗下? 換句話說:它是深度睡眠期間的開漏GPIO嗎?
    發(fā)表于 07-15 08:32

    ESP32 深度睡眠

    使用的是ESP32S2 idf 5.2.2 官方代碼歷程deep_sleep 進(jìn)入深度睡眠 睡眠后功耗為1.9mA,一直降不下去。
    發(fā)表于 07-11 09:50

    為什么深度睡眠期間RTC定時(shí)器會(huì)丟失呢?

    RTC定時(shí)器在深度睡眠期間丟失是否是一種設(shè)計(jì)功能?我觀察到以下內(nèi)容(使用 SDK 1.3): The chip is awakened from deep sleep after a timer
    發(fā)表于 07-11 07:17

    ESP32S2最小模塊,采用官方例子進(jìn)入深度睡眠,功耗為什么降不到和官方手冊(cè)一致

    使用的是ESP32S2 idf 5.2.2 官方代碼歷程deep_sleep 進(jìn)入深度睡眠 睡眠后功耗為1.9mA,一直降不下去。
    發(fā)表于 07-10 18:02