c - 如何测量 linux 内核中的调度延迟?

标签 c linux linux-kernel scheduling ftrace

我想比较两个 Linux 内核版本之间的调度延迟。到目前为止,这是我尝试过的:

  1. 在两个内核上配置 Ftrace
  2. 在跟踪中开启计划事件。
  3. 启用唤醒跟踪器。

然而,wakeup 只显示最高优先级进程的结果,而不是我的 c 程序。我尝试使用 nice 并从跟踪中捕获它。它仍然显示其他同样高的进程的日志。我是否在这里遗漏了其他一些步骤来捕获我的过程日志?有没有更好的方法通过修改我的程序的源代码而不是在启动时使用 nice 来将我的进程的优先级设置为最高?

我尝试的下一步是禁用唤醒跟踪器并仅启用计划事件。我得到的日志看起来像这样

0 1dNh3 3us+: sched wakeup : task hald : 1952 [120] success=1

−0 1d..3 7us! : sched switch : task swapper : 0 [140] (R) ==>
hald : 1952 [120]

+! 显示延迟(引用 ftrace 内核文档以了解数量)。这是否意味着 sched wakeup 的延迟为 '+' 和 sched witch '!'分别是微秒?

还有其他比较 linux 调度延迟的方法吗?

最佳答案

  • 设置优先级:setpriority() 系统调用与 nice 命令大致相同;在这两种情况下,只允许 root 增加 prio。
  • 至于测量,我编写了以下简单程序(公共(public)领域,使用风险自负),它有两个进程相互发送短管道消息 $1*1024 次。它不会给出“调度延迟”的准确值",但我认为这对于比较很有用。 (它打印 1024*$1 和 15*$1 仅用于完整性检查,使用“时间”运行以测量持续时间和 CPU 使用率。)

代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main2() {
    int a; 
    while(1) {
            if (read(0, &a, 4)!=4) exit(1);
            if (a==-1) exit(0);
            write(1,"01"+(!(a&63) && (a&1023)),1);
    }}

int main(int ac, char** av) {
    int i,j,k = (ac>1 ? atoi(av[1]) : 10) << 10;
    int pipe0[2], pipe1[2];
    pipe(pipe0); pipe(pipe1);
    int pid = fork(); switch(pid) {
            case -1: perror("fork"); return 1;
            case 0: 
                     close(0); dup2(pipe1[0], 0); 
                     close(1); dup2(pipe0[1], 1);
                     return main2();
            default: break;
    }
    int sum = 0; char c;
    for (i=0; i<k; i++) {
            write(pipe1[1], &i, 4);
            read(pipe0[0], &c, 1); sum += c&1;
    }
    i=-1; write(pipe1[1], &i, 4);
    printf("%d %d\n", k, sum);
}

关于c - 如何测量 linux 内核中的调度延迟?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38538741/

相关文章:

c 中带指针的 char 数组和 %s

c - 没有gdt的idt使用grub

Linux:重新加载内核模块

linux - xfrm_replay_state_esn 字段是什么意思?

linux - netfilter 钩子(Hook)没有检索完整的数据包

c++ - 表示同一矩阵中无向图的个数

c++ - 参数列表中的类型定义

python - 无法从 Docker 连接到数据库

linux - 在unix中使用循环重命名文件

linux - 为什么脚本结束后导出的变量为空?