커널에서 시간 측정하는 방법
커널 모듈 프로그래밍을 하다 궁금한 점이 있어서 글 올립니다.
코드의 성능을 분석하기 위해서 시간을 측정하려고 하는데요.
이것저것 찾아보니 간단히 몇가지로 추려지더라구요.
gettimeofday()를 이용한 timeval 타입의 시간.
rdtsc() 매크로를 이용한 cycle 값.
그런데 어떤 사이트에서 보니, rdtsc() 값은 정확하지 않다는 이야기가 있더라구요.
실제 측정해보았을 때도 시간으로 환산시 CPU HZ로 나누어주면 된다고 하는데,
나누고 보니 그것이 정확히 무슨일을 한 시간인지 이해가 안됩니다.
예를 들면, 400MHz의 CPU를 사용할 때 rdtsc로 측정한 값이 400000000 일 때 1초라는 것이지요.
동시에 몇가지 일을 하고 있다면 rdtsc로 측정한 값에는 다른 일에 해당하는 사이클까지 포함이되는 것일까요?
또 한가지는 gettimeofday 인데요.
이것은 elapsed time 이라고 해서 측정된 시간값이 크고, CPU를 비롯한 IO나 기타 모든 일들을 하는 시간을 포함
하는 것이라 일부분 코드의 수행시간으로 믿어도 되는 것인지 모르겠습니다.
모듈 아닌 일반 프로그램에서는 sys/times.h 에 정의된 times 함수를 사용해서 user cpu time과 system cpu time을 별도로 구할수도 있고, gettimeofday처럼 경과시간도 구할 수 있는데, 이때 세가지 값을 비교해봤을 때
총 cpu시간과 경과시간의 차이가 상당히 나는 것을 확인했습니다.
코드 예를 들면 이런 식입니다. (모듈 내에서)
rdtsc();
gettimeofday();
// 임의의 코드 ~~
gettimeofday();
rdtsc();
두번 측정해서 차를 구하는 형식으로요.
커널 내에서도 user cpu
커널 내에서도 user cpu time과 system cpu time을 각각 측정할 수 있습니다.
SMP 면 각 CPU 별로도 측정가능합니다.
Tick 값을 이용하는게
Tick 값을 이용하는게 좋을거 같은데요.
Tick값을 초로 변환하는건 금방 아실 수 있을테고.
/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/
xtime, jiffies
변수를 이용하심이...
아니면 kernel용 gettimeofday()함수인
do_gettimeofday()를 이용하세요
dogettimeofday()이덩가? 헷갈리네요
/***************************************
Being the one is just like being in love.
***************************************/
timer_tsc.c 코드를 보면
timer_tsc.c 코드를 보면 rdtsc 에서 읽은 time stamp counter(tsc) 값을 nanosecond 스케일로 변환하는 코드가 있습니다. 주석으로 설명도 잘 되어 있구요. tsc 를 쓸거라면 참조하셔도 될거예요.. tsc가 특정 코드를 정확하게 measure를 못하지만 제가 볼땐 스케줄링이나 I/O처리 캐쉬영향 등등 때문에, 두 지점에 시간 차를 계산해서 측정하는 방법은 어떤 방법을 써도 정밀한 측정은 힘들 거 같습니다.
댓글 달기