1마이크로초 미만의 대기 시간이 긴 콘텐츠를 측정하기 위한 DPROBES(DTRACE_PROBE)

1마이크로초 미만의 대기 시간이 긴 콘텐츠를 측정하기 위한 DPROBES(DTRACE_PROBE)

현재 대기 시간이 긴 애플리케이션의 성능을 분석하고 있지만 측정 결과에 전혀 확신이 없습니다. 지금까지 나는 DPROBES계측기를 사용해왔고BCC/기능측정용. 이 숫자를 확인할 수 있는 사람이 있나요? 또한, 더 좋은 방법을 아시는 분 계시면 알려주세요.

측정값 usleep(1): 평균 = 53962나노초

#include <unistd.h>
#include <sys/sdt.h>

int main() {
   int i;
   for(i=0; i<1000000; i++){ 
   DTRACE_PROBE("hello-usdt", probe-main-start);
   usleep(1);
   DTRACE_PROBE("hello-usdt", probe-main-end);
   }
}

측정 오버헤드: 평균 = 788나노초

#include <sys/sdt.h>

int main() {
   int i;
   for(i=0; i<1000000; i++){ 
   DTRACE_PROBE("hello-usdt", probe-main-start);
   DTRACE_PROBE("hello-usdt", probe-main-end);
   }
}

오버헤드로 모든 측정에서 788나노초를 뺄 수 있습니까?

또 다른 예 nanosleep(200): 평균 = 52563나노초

#include <sys/sdt.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>
int main() {
  
    struct timespec tim, tim2;
    tim.tv_sec = 0;
    tim.tv_nsec = 200L;
    int i;
    for (i=0; i<100000; i++){
    DTRACE_PROBE("hello-usdt", probe-main-start);
    if(nanosleep(&tim , &tim2) < 0 ){
            printf("Nano sleep system call failed \n");
            return -1;
    }   
    DTRACE_PROBE("hello-usdt", probe-main-end);
    }
    printf("Nano sleep successfull \n");

    return 0;
}

코드를 약간 수정했습니다 funclatency.

# attach probes

usdt = USDT(path = "path to application")
usdt.enable_probe(probe = "probe-main-start", fn_name = "trace_func_entry")
usdt.enable_probe(probe = "probe-main-end", fn_name = "trace_func_return")
b = BPF(text = bpf_text, usdt_contexts = [usdt])

이 방법을 사용하면 0.8 마이크로초 미만의 어떤 것도 측정할 수 없습니까? 또한, 제가 50마이크로초만큼 "늦잠"을 잤다는 것을 믿을 수 없습니다 nanosleep(200).

답변1

usleep(1) 측정: 평균 = 53962나노초

코드 순서는 다음과 같습니다.

   DTRACE_PROBE("hello-usdt", probe-main-start);
   usleep(1);
   DTRACE_PROBE("hello-usdt", probe-main-end);

문제의 프로세스는 절전 요청 후 예약될 가능성이 높습니다.
따라서 다음 DTRACE_PROBE는 관련 프로세스가 다시 예약될 때만 실행됩니다. 따라서 측정은 소요된 클록 시간을 안정적으로 측정하지 않고 usleep(1)1μs 절전 시간 + 시스템 활동에 따른 가변 시간을 측정합니다. 후자는 어떤 경우에도 1μs보다 훨씬 낫습니다.
위험을 무릅쓰자... 50배 더... 평균 약 50μs ;-)
비실시간 환경에서는 이 측정 항목의 표준 편차가 꽤 높은 것 같습니다.


측정된 오버헤드: 평균 = 788나노초.
오버헤드로 모든 측정에서 788나노초를 뺄 수 있습니까?

귀하의 접근 방식이 DTRACE_PROBE로 인한 오버헤드를 측정한다는 점을 인정합니다.
그럼에도 불구하고, 모든 측정 작업에서와 마찬가지로 표준 편차를 먼저 고려하십시오. 표준편차가 높을수록 평균의 의미가 떨어지기 때문입니다.
표준편차에 만족한다면, 그렇습니다. 측정값에서 평균을 뺍니다.
하지만... 음... < 1 µs에 대해 이야기하고 있는 걸까요?


또 다른 예 nanosleep(200) :avg = 52563 나노초

무엇? 다시 말하지만...약 50μs의 드리프트? 얼마나 이상합니까?
내 대답의 첫 번째 부분 nanosleep도 적용됩니다. 충분하지 않다면 참조하세요.nanosleep수동:

또한 절전 모드가 완료된 후에도 호출 스레드를 실행하기 위해 CPU가 다시 사용 가능해질 때까지는 여전히 지연이 있을 수 있습니다.


이 방법을 사용하면 0.8 마이크로초 미만의 어떤 것도 측정할 수 없습니까? 또한 nanosleep(200)이 50usec만큼 "늦잠"을 했다는 것을 믿을 수 없습니다.

위에 쓰여진 모든 내용을 읽은 후에 마지막 질문에 대한 답을 찾았기를 바랍니다. 이 질문은 또한 이전 질문에 대한 답도 제공합니다.

아니요! 이 방법을 사용하여 800ns 미만의 어떤 것도 측정할 수 없는 것은 아닙니다.
그러나 시스템 활동 및 하드웨어 성능으로 인해 다음 작업만 수행할 수 있습니다.차단 통화에 소요된 시계 시간을 측정합니다.(어떤 호출이든지 스케줄러가 즉시 프로세스를 예약하도록 트리거합니다.) 정확도는 약 50μs보다 좋습니다.

관련 정보