无码av一区二区三区无码,在线观看老湿视频福利,日韩经典三级片,成 人色 网 站 欧美大片在线观看

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

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

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命令就可以查看到內核棧的輸出信息。




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

分享到微博請遵守國家法律
晴隆县| 兴山县| 鲁山县| 杨浦区| 锡林郭勒盟| 黑山县| 太湖县| 利辛县| 宜都市| 汝阳县| 彭泽县| 临泉县| 通州市| 绿春县| 花莲县| 民权县| 永登县| 循化| 辉县市| 隆尧县| 忻城县| 永嘉县| 阿拉善右旗| 油尖旺区| 隆回县| 绍兴市| 云霄县| 云梦县| 浦城县| 龙泉市| 平安县| 大庆市| 弥勒县| 府谷县| 新化县| 涟源市| 湄潭县| 高青县| 高州市| 牡丹江市| 宜黄县|