Linux kernel 内核中的getloadavg()

Linux kernel 内核中的getloadavg(),linux-kernel,cpu-usage,Linux Kernel,Cpu Usage,是否有一个与getloadavg()类似的api可以在内核中使用,例如用于我自己的驱动程序 我有一个驱动程序,这是颠簸,我想节流它,我正在寻找一个内核api,以了解cpu的使用情况 谢谢。您可能正在kernel/sched.c中查找get\u averun()函数。有关如何使用它的示例,请参见fs/proc/loadavg.c: static int loadavg_proc_show(struct seq_file *m, void *v) { unsigned long av

是否有一个与getloadavg()类似的api可以在内核中使用,例如用于我自己的驱动程序

我有一个驱动程序,这是颠簸,我想节流它,我正在寻找一个内核api,以了解cpu的使用情况


谢谢。

您可能正在
kernel/sched.c
中查找
get\u averun()
函数。有关如何使用它的示例,请参见
fs/proc/loadavg.c

static int loadavg_proc_show(struct seq_file *m, void *v)
{
        unsigned long avnrun[3];

        get_avenrun(avnrun, FIXED_1/200, 0); 

        seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
                LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
                LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
                LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
                nr_running(), nr_threads,
                task_active_pid_ns(current)->last_pid);
        return 0;
}

虽然我对如何使用负载平均值来修改驱动程序有点怀疑——对于系统管理员来说,最好将负载平均值作为一种启发式方法来处理,以了解他们的系统随时间的变化,而不一定是在任何给定时刻它可能有多“健康”——驱动程序中具体有什么导致问题?可能有更好的机制使其与系统的其余部分配合良好。

如果您想了解我的问题的更多背景,请点击这里。这个内核模块处理网络通知,现在它需要以突发方式从100个通知扩展到1000个通知,这会导致占用CPU。处理部分的复杂性为n^2,处理某些通知(不一定是最后一个)需要更多的时间。因此,我希望模块在处理这些变化时根据CPU使用情况自行调整速度。如果loadavg()不是这个场景的合适位置,那么我还应该看什么呢?啊,这听起来确实是个棘手的问题。你锁的时间太长了吗?您能否重新制定代码的核心循环,以定期丢弃和重新获取锁,从而允许代码被抢占或以其他方式“共享”CPU?或者你能把工作转移到工作队列中吗?(请参阅
Documentation/workqueue.txt
)我没有持有任何锁,开发人员驱动程序会根据这些通知重新绘制最佳网络拓扑,并将信息传递给其他驱动程序和守护程序。但我已经验证了分阶段处理这些通知有助于解决问题。谢谢你的及时回复!!