trace-cmd记录线程被中断打断的时间
在linux下,当线程执行一个任务的时候,时间会发生抖动,引起抖动的原因可能有以下几种:
(1)线程主动让出了cpu,比如线程中出现了sleep,使用了互斥体,等待io等
(2)线程被动让出cpu,线程被更高优先级的线程抢占
(3)执行任务过程中有内存操作,内存操作肯呢个引起缺页中断,用户同样的内存操作,有缺页中断和无缺页中断,所消耗的时间是不一样的
(4)线程被中断打断
(5)以上情况都没有,但是同样优先级的线程比较多,也就是系统负载比较高,这个线程的运行需要排队等待
本文中记录通过ftrace来记录线程被中断打断的情况,通过工具trace-cmd来进行实验,trace-cmd是对ftrace功能的封装,比直接使用ftrace更方便:
测试代码:主线程绑定到核1上,然后是while(1)循环。
#define _GNU_SOURCE
#include <stdio.h>
#include <sched.h>
#include <pthread.h>
#include <unistd.h>int main() {// 创建 CPU 亲和性掩码cpu_set_t cpuset;CPU_ZERO(&cpuset); // 初始化清空掩码CPU_SET(1, &cpuset); // 设置核心 1(注意:核心编号从 0 开始)// 获取当前线程 ID(主线程)pthread_t current_thread = pthread_self();// 设置线程亲和性int result = pthread_setaffinity_np(current_thread, sizeof(cpu_set_t), &cpuset);if (result != 0) {perror("pthread_setaffinity_np failed");return 1;}while (1) {}return 0;
}
使用trace-cmd记录中断entry和exit事件,-P指定了线程号。
sudo trace-cmd record -e irq:irq_handler_entry -e irq:irq_handler_exit -P 15706
使用trace-cmd report可以查看监听结果,结果如下,通过结果进一步分析,我们就可以确定线程被中断打断的时间。