현재 대기 시간이 긴 애플리케이션의 성능을 분석하고 있지만 측정 결과에 전혀 확신이 없습니다. 지금까지 나는 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보다 좋습니다.