日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Kernel space lock contention配置及其使用

發(fā)布時(shí)間:2024/3/13 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Kernel space lock contention配置及其使用 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
概述

本文涉及到的內(nèi)容如下:

  • kernel lock相關(guān)debug方式,比如lock耗時(shí),拿不到lock,lock依賴等等
  • trace的使用
  • 1.開啟lock contenttion涉及到的config配置
    config LOCKDEP bool depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT select STACKTRACE select FRAME_POINTER if !MIPS && !PPC && !ARM_UNWIND && !S390 && !MICROBLAZE && !ARC && !SCORE && !X86 select KALLSYMS select KALLSYMS_ALL config LOCKDEP_SMALL bool config LOCK_STAT bool "Lock usage statistics" depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT select LOCKDEP select DEBUG_SPINLOCK select DEBUG_MUTEXES select DEBUG_RT_MUTEXES if RT_MUTEXES select DEBUG_LOCK_ALLOC default n help This feature enables tracking lock contention points For more details, see Documentation/locking/lockstat.txt This also enables lock events required by "perf lock", subcommand of perf. If you want to use "perf lock", you also need to turn on CONFIG_EVENT_TRACING. CONFIG_LOCK_STAT defines "contended" and "acquired" lock events. (CONFIG_LOCKDEP defines "acquire" and "release" events.)

    上面的config默認(rèn)是關(guān)閉狀態(tài)。

    2 menuconfig開啟config配置

    kernel hacking —> Lock Debugging (spinlock, mutexs, etc…) —>進(jìn)入之后勾選
    Lock Debugging: detect incorrect freeing of live locks 和Lcok usage statistics,就會(huì)把依賴項(xiàng)自動(dòng)勾選.

    保存退出之后,可以查看kernel下面新產(chǎn)生的config diff文件:

    # Lock Debugging (spinlocks, mutexes, etc...) # -# CONFIG_DEBUG_RT_MUTEXES is not set -# CONFIG_DEBUG_SPINLOCK is not set -# CONFIG_DEBUG_MUTEXES is not set +CONFIG_DEBUG_RT_MUTEXES=y +CONFIG_DEBUG_SPINLOCK=y +CONFIG_DEBUG_MUTEXES=y # CONFIG_DEBUG_WW_MUTEX_SLOWPATH is not set -# CONFIG_DEBUG_LOCK_ALLOC is not set +CONFIG_DEBUG_LOCK_ALLOC=y # CONFIG_PROVE_LOCKING is not set -# CONFIG_LOCK_STAT is not set +CONFIG_LOCKDEP=y +CONFIG_LOCK_STAT=y +# CONFIG_DEBUG_LOCKDEP is not set # CONFIG_DEBUG_ATOMIC_SLEEP is not set # CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set # CONFIG_LOCK_TORTURE_TEST is not set

    這樣開啟lock trace event了.。編譯boot并刷機(jī)即可!

    3 確定是否開啟trace lock content feature

    上面步驟二中開啟之后,在adb shell里面多了如下幾個(gè)接口:

  • 增加了lock trace event, 有四個(gè)lock trace event,具體做什么使用,下面在詳細(xì)講解
  • 增加了lock的統(tǒng)計(jì)信息, 節(jié)點(diǎn)信息實(shí)現(xiàn)源碼kernel/locking/lockdep_proc.c文件中:
    ● lock_stat: 統(tǒng)計(jì)各種類型lock的時(shí)延
    ● lockdep: 表示鎖的的深度,即一個(gè)lock里面調(diào)用了多少個(gè)lock,并將這些lock的調(diào)用全部顯示出來
    ● lockdep_stats: 即鎖深度里面包含了哪些lock以及頻次
    ● locks:鎖的狀態(tài),這個(gè)實(shí)現(xiàn)在fs/locks.c文件里面
  • 4 如何使用lock trace event和proc node信息
    4.1 lock trace event

    從第三部分可以知道,lock trace event包含四個(gè)event,分別講解如下:
    四個(gè)event定義在include/trace/event/lock.h里面, 使用在kernel/locking/lockdep.c文件,

  • lock_acquire: 獲取lock,比如mutex lock ,rcu read lock 或者spinlock等等lock
  • lock_acquired: 表示已經(jīng)獲取lock了
  • lock_release: lock釋放的event
  • lock_contended: lock被誰hold了
  • 那么如何抓取lock相關(guān)的trace event呢?
    可以使用下面的腳本抓取(必須添加lock event ),即正常的抓取trace 命令:

    echo 40000 > buffer_size_kb && echo irq sched_switch sched_wakeup sched_waking cpu_frequency cpu_idle lock > set_event && cat set_event && echo > trace && echo 1 > tracing_on && sleep 10 && echo 0 > tracing_on && cat trace > /data/trace.txt

    腳本執(zhí)行完畢之后, pull出data目錄下的trace.txt文件,vim打開即可看到下面類似的信息:

    ┊ ┊ sleep-2875 [004] d.s2 748.861607: sched_waking: comm=rcu_sched pid=9 prio=120 target_cpu=000 ┊ ┊ sleep-2875 [004] d.s3 748.861608: lock_acquire: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861609: lock_contended: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861662: lock_acquired: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861663: lock_acquire: 000000000ff04d65 read tk_core.seq ┊ ┊ sleep-2875 [004] d.s3 748.861664: lock_release: 000000000ff04d65 tk_core.seq ┊ ┊ sleep-2875 [004] d.s3 748.861666: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s3 748.861667: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s3 748.861668: lock_release: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s2 748.861669: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861670: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861671: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861672: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861673: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861674: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861675: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861676: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861677: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861678: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861679: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s2 748.861683: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s3 748.861684: lock_acquire: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861685: lock_contended: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861719: lock_acquired: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s4 748.861720: lock_acquire: 00000000cc2f375c &rq->lock ┊ ┊ sleep-2875 [004] d.s4 748.861720: lock_acquired: 00000000cc2f375c &rq->lock ┊ ┊ sleep-2875 [004] d.s4 748.861721: lock_acquire: 000000000ff04d65 read tk_core.seq ┊ ┊ sleep-2875 [004] d.s4 748.861722: lock_release: 000000000ff04d65 tk_core.seq ┊ ┊ sleep-2875 [004] d.s4 748.861724: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s4 748.861725: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s4 748.861726: lock_acquire: 00000000cc726398 read rcu_read_lock ┊ ┊ sleep-2875 [004] d.s4 748.861727: lock_release: 00000000cc726398 rcu_read_lock ┊ ┊ sleep-2875 [004] d.s4 748.861728: lock_release: 00000000d4eff177 &rq->lock ┊ ┊ sleep-2875 [004] d.s3 748.861730: lock_release: 00000000cc2f375c &rq->lock

    我們可以看到如下的信息:

  • rcu_read_lock 是lock_acquire 之后直接lock_release. 持鎖時(shí)間非常的短
  • &rq->lock, 是一個(gè)spinlock類型. 通過lock_acquire→ lock_acquired→ lock_release的過程. 在lock_acquire過程中出現(xiàn)了lock_contended trace event, 表示此時(shí)的&rq->lock spinlock這個(gè)lock存在contention或者contended,表示此時(shí)有l(wèi)ock的競爭.
  • 如果出現(xiàn)鎖競爭,就會(huì)統(tǒng)計(jì)當(dāng)前進(jìn)程獲取lock的等待時(shí)間等等統(tǒng)計(jì)信息,詳細(xì)在4.2節(jié)講解.
  • 可以明顯的看到持鎖時(shí)間, 或者獲取鎖的時(shí)間.
  • 4.2 lock proc node信息

    有三個(gè)主要的節(jié)點(diǎn)信息,都在shell proc目錄下:

    cat /proc/lock_stat:

    /proc # cat lock_stat | head -n 40 lock_stat version 0.4 ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- class name con-bounces contentions waittime-min waittime-max waittime-total waittime-avg acq-bounces acquisitions holdtime-min holdtime-max holdtime-total holdtime-avg ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- &(&n->list_lock)->rlock: 441821 441946 1.81 80.23 1891806.60 4.28 2488861 10314115 0.00 137.08 64789787.05 6.28 ----------------------- &(&n->list_lock)->rlock 114751 [<0000000051f28fcf>] ___slab_alloc+0x194/0x5ec &(&n->list_lock)->rlock 105155 [<000000000913f330>] deactivate_slab+0x2ec/0x540 &(&n->list_lock)->rlock 169288 [<00000000fb58074e>] free_debug_processing+0x34/0x26c &(&n->list_lock)->rlock 12316 [<00000000f00be1d8>] kfree+0x30c/0x55c ----------------------- &(&n->list_lock)->rlock 111558 [<0000000051f28fcf>] ___slab_alloc+0x194/0x5ec &(&n->list_lock)->rlock 89847 [<000000000913f330>] deactivate_slab+0x2ec/0x540 &(&n->list_lock)->rlock 192366 [<00000000fb58074e>] free_debug_processing+0x34/0x26c &(&n->list_lock)->rlock 12305 [<00000000f00be1d8>] kfree+0x30c/0x55c ............................................................................................................................................................................................................................. &rq->lock: 351895 351959 1.88 564.00 9605797.10 27.29 1569868 5892437 0.00 1061.00 172708414.01 29.31 --------- &rq->lock 5739 [<00000000807dcaa6>] task_rq_lock+0x74/0xc4 &rq->lock 7268 [<00000000f033900c>] pick_next_task_fair+0x378/0x7e4 &rq->lock 85000 [<0000000043e94103>] try_to_wake_up+0x1bc/0x554 &rq->lock 46881 [<0000000078183a31>] try_to_wake_up+0x3b8/0x554 --------- &rq->lock 24883 [<00000000f57857d0>] update_blocked_averages+0x50/0xc44 &rq->lock 3577 [<00000000807dcaa6>] task_rq_lock+0x74/0xc4 &rq->lock 14525 [<00000000f033900c>] pick_next_task_fair+0x378/0x7e4 &rq->lock 5 [<0000000007411a3e>] walt_set_window_start+0xd4/0x134 ............................................................................................................................................................................................................................. &sg_policy->update_lock: 259980 259986 1.88 212.12 1681170.67 6.47 1729740 3292457 1.88 270.81 28368055.35 8.62 ----------------------- &sg_policy->update_lock 259986 [<00000000077def88>] sugov_update_shared+0x5c/0x1b0 ----------------------- &sg_policy->update_lock 259986 [<00000000077def88>] sugov_update_shared+0x5c/0x1b0 .............................................................................................................................................................................................................................

    上面表示從開機(jī)到現(xiàn)在cat這個(gè)節(jié)點(diǎn)的時(shí)間內(nèi),lock的所有狀態(tài)信息,包括

  • lock的名字
  • contention次數(shù)
  • lock等待的時(shí)間,最大時(shí)間,最小時(shí)間,平均時(shí)間以及等待的總時(shí)間
  • lock持有時(shí)間,最大,最小,平均以及持有的總時(shí)間
  • 獲取這個(gè)lock的次數(shù)
    等等…
  • cat /proc/lockdep:

    目的是將class_lock上面所有相關(guān)聯(lián)的lock stack全部輸出
    可能的樣式如下:

    /proc # cat lockdep | head -n 100 all lock classes: 0000000044beef8b ....: logbuf_lock 00000000c80448bf ....: (console_sem).lock 00000000700ad619 ....: console_lock 00000000ef505732 ....: cgroup_mutex 0000000042291e92 ....: console_owner_lock 000000002e29cf8c ....: console_owner 000000004e6f50fd ....: devtree_lock 000000003c9defa6 ....: resource_lock 00000000947b85f2 ....: pm_mutex 0000000010004418 ....: primary_crng.lock 0000000020d31ff4 ....: input_pool.lock 00000000588a9d5b ....: "warn_unseeded_randomness".lock 00000000e13be140 ....: lock 0000000005822fb5 ....: cpu_hotplug_lock.rw_sem 00000000b0cf55a3 ....: cpuhp_state_mutex

    cat /proc/lockdep_stats:

    信息如下,主要是一些上下文里面的信息:

    /proc # cat lockdep_stats lock-classes: 1851 [max: 8191] direct dependencies: 0 [max: 32768] indirect dependencies: 0 all direct dependencies: 0 in-hardirq chains: 0 in-softirq chains: 0 in-process chains: 0 stack-trace entries: 20581 [max: 524288] combined max dependencies: 1 hardirq-safe locks: 0 hardirq-unsafe locks: 0 softirq-safe locks: 0 softirq-unsafe locks: 0 irq-safe locks: 0 irq-unsafe locks: 0 hardirq-read-safe locks: 0 hardirq-read-unsafe locks: 0 softirq-read-safe locks: 0 softirq-read-unsafe locks: 0 irq-read-safe locks: 0 irq-read-unsafe locks: 0 uncategorized locks: 1851 unused locks: 0 max locking depth: 19 debug_locks: 1

    lock event信息還是對(duì)于lock debug還是非常有幫助的。
    實(shí)戰(zhàn)在另一篇博文:pr_emerg耗時(shí),影響性能原理排查

    總結(jié)

    以上是生活随笔為你收集整理的Kernel space lock contention配置及其使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 69视频在线观看 | 国产综合免费视频 | 亚洲视频在线观看一区二区三区 | 欧美 日韩 国产 一区二区三区 | 国产18一19sex性护士 | 天堂网91 | 久久美女视频 | 亚洲一区h | 欧美日韩字幕 | 欧美日韩一区二区精品 | 婷婷精品一区二区三区 | 久久久久久九九九九 | 精品人妻伦一二三区久久 | 中文字幕一区二区三区人妻不卡 | 天堂av官网 | 欧美一级性生活视频 | 亚洲黄色a| 人人妻人人爽一区二区三区 | 亚洲精品综合在线观看 | 91午夜精品亚洲一区二区三区 | 成人福利院 | 五月婷婷激情五月 | 91久久久久 | 99插插插 | 天天躁日日躁狠狠躁 | 亚洲精品在线视频 | 黑人乱码一区二区三区av | 美女扒开腿让男人操 | 日本私人影院 | 搡国产老太xxx网站 高h喷汁呻吟3p | 久久综合88 | 亚洲九九九 | 阿v天堂在线 | 亚洲一二三区在线观看 | 欧美在线三区 | 三级av在线| 一二三区在线视频 | 日本中文字幕不卡 | av网址在线免费观看 | 欧美日韩成人一区二区在线观看 | 色妞www精品视频 | 精品国产精品网麻豆系列 | 一级色网站 | av最新地址 | 国产在线拍揄自揄拍无码视频 | 亚洲aa在线 | 欧美xxxbbb| 丰满少妇熟乱xxxxx视频 | 中文字幕免费中文 | 日本猛少妇色xxxxx猛叫 | 91人妻一区二区三区蜜臀 | 爱就操| 日本亚洲黄色 | 福利小视频 | 亚洲天堂久久久久 | 国产免费脚交足视频在线观看 | 奇米影视在线播放 | 一区二区三区精品 | 日本精品一区二区三区在线观看 | 丁香八月婷婷 | 中文字幕观看av | 精品一区二区在线免费观看 | 国产不卡在线视频 | 免费成人在线电影 | 91精品色| 精品一区三区 | 亚洲精品一二三区 | 亚洲精品第五页 | 好男人www日本 | 三上悠亚在线一区二区 | 国产欧美中文字幕 | 日本高清视频一区 | 偷拍综合网| 两根大肉大捧一进一出好爽视频 | 天堂中文在线免费观看 | 久久精品国产99精品国产亚洲性色 | 日本一二三不卡视频 | 在线观看不卡一区 | 青草青在线 | 伊人网亚洲| 精品国产鲁一鲁一区二区三区 | 波多野结衣久久久久 | 黄色在线免费看 | 色播激情网 | 欧美专区第一页 | 永久免费看黄 | 超碰97国产 | 亚洲不卡视频在线 | 午夜av福利 | 一道本视频在线 | 中文字幕欲求不满 | 探花系列在线观看 | 电影《两个尼姑》免费播放 | 亚洲精品国产欧美 | 亚洲图片欧美在线 | 一级黄色片a| 暖暖成人免费视频 | 欧美性白人极品1819hd | 久久一道本 |