2016-07-23 3 views
1

두개의 리눅스 커널 버전 사이의 스케줄 레이턴시를 비교하고 싶습니다.리눅스 커널에서 스케줄링 대기 시간을 어떻게 측정 할 수 있습니까?

  1. 구성된 Ftrace 추적에 예정 : 이벤트 켜지고 모두 커널
  2. 에 : 여기에 지금까지 시도한 것입니다.
  3. 웨이크 업 추적 프로그램을 사용하도록 설정했습니다.

그러나 wakeup은 내 C 프로그램이 아닌 우선 순위가 높은 프로세스의 결과 만 보여줍니다. 나는 좋은 것을 사용하고 추적에서 그것을 잡으려고 노력했다. 아직도 다른 똑같이 높은 프로세스에 대한 로그를 보여줍니다. 내 과정 기록을 얻기 위해 다른 단계를 놓치고 있습니까? 프로그램을 시작할 때 nice를 사용하는 대신 내 프로그램의 소스 코드를 수정하여 내 프로세스의 우선 순위를 가장 높게 설정하는 더 좋은 방법이 있습니까?

내가 시도한 다음 단계는 웨이크 업 추적 프로그램을 비활성화하고 sched 이벤트를 활성화하는 것입니다. 내가 가진 로그 지연 (수를 알 언급 ftrace 커널 문서)를 보여줍니다이

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] 

+! 같이 보입니다. 그것은 sched wakeup이 '+'의 대기 시간과 sched witch '!'를 가지고 있다는 것을 의미합니까? 마이크로 초마다?

다른 방법으로 리눅스 예약 대기 시간을 비교할 수 있습니까?

답변

1
  • 우선 순위 설정 : setpriority() 시스템 호출은 nice 명령과 거의 동일합니다. 두 경우 모두 프리 오 증가는 루트에만 허용됩니다.
  • 측정에 관해서는, 짧은 파이프 메시지를 서로 $ 1 * 1024 번 보내는 두 개의 프로세스가있는 다음과 같은 간단한 프로그램 (퍼블릭 도메인, 사용 자체 책임)을 작성했습니다. "일정 대기 시간 지정 "하지만 비교를 위해 유용하다고 생각합니다. (그것은 인쇄 1024 * $ 1 시간 & CPU 사용량을 측정 할 수있는 "시간"을 실행할 때만 전성 검사 15 * $ 1).

코드 :

#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); 
} 
관련 문제