2017-01-27 6 views
0

내가 CentOS는 7에서 개별 메시지 처리 시간을 측정하는 성능 프레임 워크 도구를 만드는거야 나는 isolcpus 커널 옵션을 사용하여이 작업에 대해 하나 개의 CPU를 예약하고 나는 그것이 taskset를 사용하여 실행합니다.코드 성능 스트릭 측정

이제는 문제가 발생합니다. 여러 메시지 중에서 최대 처리 시간을 측정하려고했습니다. 처리 시간은 < = 1000ns이지만 많은 반복을 실행하면 매우 높은 결과를 얻습니다 (> 10000ns).

여기 나는 재미있는 일은 없지만 문제를 보여주는 간단한 코드를 만들었습니다. 나는이 차이는 어디에서 온에서 이해하려고 노력 중이 야

max: 84 min: 23 -> for 1000 iterations 
max: 68540 min: 11 -> for 100000000 iterations 

: 반복의 수에 따라 내가 같은 결과를 얻을 수 있습니까? 나는 이것을 우선 순위가 가장 높은 실시간 스케줄링으로 실행하려고 시도했다. 그걸 막을 수있는 방법이 있습니까? 커널 스레드는 여전히 isolcpus 고립 된 CPU에서 예정받을 수 있습니다 -

#include <iostream> 
#include <limits> 
#include <time.h> 

const unsigned long long SEC = 1000L*1000L*1000L; 

inline int64_t time_difference(const timespec &start, 
          const timespec &stop) { 
    return ((stop.tv_sec * SEC - start.tv_sec * SEC) + 
      (stop.tv_nsec - start.tv_nsec)); 
} 
int main() 
{ 
    timespec start, stop; 
    int64_t max = 0, min = std::numeric_limits<int64_t>::max(); 

    for(int i = 0; i < 100000000; ++i){ 
     clock_gettime(CLOCK_REALTIME, &start); 
     clock_gettime(CLOCK_REALTIME, &stop); 
     int64_t time = time_difference(start, stop); 
     max = std::max(max, time); 
     min = std::min(min, time); 
    } 
    std::cout << "max: " << max << " min: " << min << std::endl; 
} 
+0

왜 적절한 'CLOCK_MONOTONIC'대신에 'CLOCK_REALTIME'을 사용하고 있습니까? – EOF

+0

둘 다 시도해 보았지만 CLOCK_PROCESS_CPUTIME_ID와 큰 차이는 없었습니다. –

+0

'man clock_getttime'을 다시 한 번 살펴보면 가능한 경우'CLOCK_MONOTONIC_RAW'를 제안합니다. – EOF

답변

2

당신은 정말 다음, 심지어 isolcpus과 제로 지터를 줄일 수 없습니다 :

1) 귀하의 CPU에 전달 인터럽트 (당신이 irq affinity와 함께이 내 메싱을 줄일 수 있습니다 - 그러나 아마 0이 아님).

2) 시계 타이머 인터럽트는 여전히 프로세스를 위해 스케줄되며 커널 측에서 다양한 작업을 수행 할 수 있습니다.

3) CPU 자체가 P- 상태 또는 C- 상태 전환 또는 다른 이유로 인해 일시 중지 될 수 있습니다 (예 : AVX 회로를 켠 후에 전압 수준이 안정화되는 등).

+0

설명해 주셔서 감사합니다. 이제 이해가된다. 어떻게 든 통계적으로 해결해야 할 것입니다. 메시지 집합을 여러 번 측정하여 최고 및 최저 값을 거부하고 나머지를 평균화합니다. –

+0

메시지가 예상 시간 내에 처리되는 등 자주 _close_가 될 가능성이 있습니다. 즉, 99.999 %의 메시지가 처리됩니다. 그래서 당신은 매우 낮은 % 이상치를 버립니다. – BeeOnRope

1

분리는 사용자 공간 프로세스에 영향을받을 것입니다 ... 우리가 문서를 확인하자.

따라서 적어도 커널이 아닌 완벽한 격리가 보장되지는 않습니다. 당신은 여전히 ​​적어도이 있기 때문에

+0

좋은 캐치! 커널 스레드에서 CPU를 분리하는 방법을 알고 있습니까? –

+0

@PawelFaron Linux에서 프로세서에 독점적으로 잠글 수 있는지 잘 모르겠습니다. –