内核驱动 uid_sys_stats.c 简介


一、简介

在 Linux 内核中,CONFIG_UID_SYS_STATS 用于启用按用户ID(UID)统计系统资源使用情况的功能。当启用该宏时,会编译住 uid_sys_stats.c 文件,内核会跟踪每个 UID 的资源使用情况,例如 CPU 时间、I/O 操作、网络流量等,并提供接口供用户空间程序访问这些统计信息。

以下是其详细功能和作用:

1. 主要功能

(1) 按 UID 统计资源使用:

跟踪每个 UID 的 CPU 使用时间(用户态和内核态)、I/O 操作(读写次数、数据量)、网络流量等。

(2) 提供统计接口:

通过 /proc/uid_cputime 等接口,向用户空间提供统计信息。

(3) 支持多用户环境:

在多用户系统中,帮助管理员或应用程序监控每个用户的资源使用情况。


2. 统计内容

(1) CPU 时间:

每个 UID 的 CPU 使用时间(用户态和内核态)。

(2) I/O 操作:

每个 UID 的磁盘读写次数、读写数据量。


3. 接口
(1) /proc/uid_cputime
提供每个 UID 的 CPU 使用时间信息。

(2) /sys/kernel/uid_sys_stats
提供更详细的 UID 系统统计信息,包括 I/O 和网络流量等。


4. 应用场景
(1) 系统监控:管理员可以通过 UID 统计信息监控每个用户的资源使用情况。
(2) 应用程序优化:开发者可以通过分析 UID 统计信息,优化应用程序的资源使用。
(3) 多用户管理:在多用户系统中,帮助管理员公平分配资源,防止某些用户过度占用资源。


5. 配置和使用
(1) 启用宏:在内核配置文件中启用 CONFIG_UID_SYS_STATS 宏。
(2) 查看统计信息:
通过 /proc/uid_cputime 或 /sys/kernel/uid_sys_stats 查看统计信息。


6. 代码实现
uid_sys_stats.c:包含 UID 统计的核心逻辑,包括数据收集、存储和接口实现。
数据结构:使用哈希表或其他数据结构存储每个 UID 的统计信息。
钩子函数:在内核的关键路径(如任务调度、I/O 操作、网络传输)中插入钩子函数,更新 UID 统计信息。


7. 示例
假设系统中有两个用户(UID 1000 和 UID 1001),启用 CONFIG_UID_SYS_STATS 后,内核可能会记录以下信息:

UID 1000:
CPU 时间:用户态 120 秒,内核态 30 秒。
I/O 操作:读取 100 次,写入 50 次,数据量 10 MB。
网络流量:发送 5 MB,接收 3 MB。
UID 1001:
CPU 时间:用户态 80 秒,内核态 20 秒。
I/O 操作:读取 80 次,写入 40 次,数据量 8 MB。
网络流量:发送 3 MB,接收 2 MB。


8. 优点
细粒度监控:提供每个 UID 的详细资源使用情况,便于分析和优化。
多用户支持:适用于多用户环境,帮助管理员公平分配资源。
低开销:统计信息收集的开销较低,对系统性能影响较小。


9. 总结
CONFIG_UID_SYS_STATS 是 Linux 内核中用于启用按 UID 统计系统资源使用情况的配置宏。它跟踪每个 UID 的 CPU 时间、I/O 操作、网络流量等信息,并通过 /proc 接口向用户空间提供统计信息。该功能在多用户系统中非常有用,帮助管理员监控和优化资源分配。


二、实现代码

1. msm-4.14 和 msm-5.4 和 mtk-kernel-6.1 都是使能的。实现文件 uid_sys_stats.c

2. 通过 profile_event_register(PROFILE_TASK_EXIT, &process_notifier_block) 注册了一个回调,当进程exit退出时执行 do_exit() --> profile_task_exit() --> process_notifier() 有时候ANR后,所有App一起死,会出现很多D状态卡在这里。


三、文件节点

1. /proc/uid_cputime 目录

/proc/uid_cputime # ls -l
--w--w--w- 1 root root 0 2025-03-06 19:40 remove_uid_range
-r--r--r-- 1 root root 0 2025-03-06 19:40 show_uid_stat

/proc/uid_cputime # cat show_uid_stat
0: 84776653 2876892281
10103: 704743 612791 //utime, stime
...


2. /proc/uid_io 目录

/proc/uid_io # ls -l stats
-r--r--r-- 1 root root 0 2025-03-06 20:17 stats

/proc/uid_io # cat stats
0 1233497141 16507144 647143424 40349696 0 0 0 0 513 0
10103 0 0 0 0 131853 2144 1785856 0 0 0
...

第一行是总的,之后每一行是每个单独UID的, 打印内容分别为:
FG.rchar、FG.wchar、FG.read_bytes、FG.write_bytes、BG.rchar、BG.wchar、BG.read_bytes、BG.write_bytes、FG.fsync、BG.fsync.


3. /proc/uid_procstat 目录

/proc/uid_procstat # ls -l
--w--w--w- 1 root root 0 2025-03-06 20:18 set

 

posted on 2025-04-09 11:35  Hello-World3  阅读(49)  评论(0)    收藏  举报

导航