最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網 會員登陸 & 注冊

(一篇解決~)利用可掛載內核模塊進行高負載處理

2022-11-04 17:00 作者:補給站Linux內核  | 我要投稿

概述

本程序在高負載處理模塊的代碼基礎上,根據(jù)5.15版內核的變化,修改出的。本程序是一個內核模塊,用于監(jiān)控系統(tǒng)負載,在平均負載超過4時,打印所有進程的調用棧。

本程序分為三個文件:main.c、load.h、Makefile。其中,main.c是本內核模塊的主程序;load.h中是該內核模塊的擴展代碼,這里放了一個獲取內核中未被導出符號(變量或函數(shù))的一個函數(shù);Makefile用來編譯該內核模塊。完整代碼在文章的最下面。

模塊的主要實現(xiàn)方式為:設置一個定時器,以固定的間隔訪問系統(tǒng)給出的1分鐘內平均負載,如果超過負載閾值,則輸出運行隊列全部進程棧信息,并使程序休眠一段較長的時間。流程圖如下:


定時器

本模塊采用了hrtimer——高精度定時器,由linux/hrtimer.h引入,可精確到ns級。

平均負載

這里有所改動,原文中是通過kallsyms_lookup_name函數(shù)獲取的,但我在瀏覽頭文件時發(fā)現(xiàn)了linux/sched/loadavg.h頭文件,里面已經定義好了一些有關平均負載——loadavg的宏,并導出了avenrun——平均負載數(shù)組——1、5、15分鐘內的平均負載,所以我這里直接引用了該頭文件、直接使用了相關符號

輸出進程棧

這里改動很大,在5.15版中,沒有了save_stack_trace_tsk,通過查看linux/stacktrace.h文件,發(fā)現(xiàn)這個函數(shù)被用于未配置CONFIG_ARCH_STACKWALK的系統(tǒng),而配置了CONFIG_ARCH_STACKWALK的系統(tǒng)中,有新的函數(shù):unsigned int stack_trace_save_tsk(struct task_struct *task, unsigned long *store, unsigned int size, unsigned int skipnr),定義于kernel/stacktrace.c中,與舊函數(shù)相比變化很大,好在在源代碼中有詳細的接口說明,根據(jù)這我成功的修改了棧的輸出部分。

與此同時我發(fā)現(xiàn)了功能類似的另一個函數(shù)show_stack,定義于arch/x86/kernel/dumpstack.c

然而,這兩個函數(shù)的符號都沒有導出,也就無法通過引入相關頭文件來使用,原文章來獲取內核中未導出符號的kallsyms_lookup_name函數(shù)也未被導出,這就要求我尋找一種新的方法來獲取未導出符號,我找到了kprobe技術。

kprobes技術^[3]^是內核開發(fā)者們專門為了便于跟蹤內核函數(shù)執(zhí)行狀態(tài)所設計的一種輕量級內核調試技術。利用kprobes技術,內核開發(fā)人員可以在內核的絕大多數(shù)指定函數(shù)中動態(tài)的插入探測點來收集所需的調試狀態(tài)信息而基本不影響內核原有的執(zhí)行流程。我們可以通過注冊一個指定了函數(shù)名的kprobe來獲取函數(shù)的地址。


【文章福利】小編推薦自己的Linux內核技術交流群:【891587639】整理了一些個人覺得比較好的學習書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


main.c

load.h

Makefile

運行結果

將三個文件放入一個單獨的文件夾中,運行make命令,編譯出可插入內核的程序。編譯好后,運行sudo insmod load_monitor.ko命令將其插入內核。

接下來是測試,運行stress -c 8命令(stress需要另外安裝),使平均負載快速到達4以上,這里可以在新的虛擬終端通過top命令實時觀測負載。當負載到達4之后,在運行著stress命令的窗口中按下ctrl+c終止程序,運行sudo dmesg命令就可以查看到內核棧的輸出信息。




(一篇解決~)利用可掛載內核模塊進行高負載處理的評論 (共 條)

分享到微博請遵守國家法律
大渡口区| 通江县| 江川县| 皋兰县| 家居| 成都市| 比如县| 得荣县| 昌邑市| 台中县| 柏乡县| 石城县| 鹿邑县| 乡宁县| 重庆市| 三穗县| 城口县| 巩留县| 布尔津县| 和静县| 雷州市| 大宁县| 柘城县| 叶城县| 得荣县| 龙陵县| 白朗县| 秭归县| 玛纳斯县| 东莞市| 岳普湖县| 普定县| 罗山县| 余江县| 高邮市| 张北县| 大安市| 太湖县| 墨脱县| 肇州县| 邻水|