커널에서 시간 측정하는 방법

hj8296의 이미지

커널 모듈 프로그래밍을 하다 궁금한 점이 있어서 글 올립니다.

코드의 성능을 분석하기 위해서 시간을 측정하려고 하는데요.

이것저것 찾아보니 간단히 몇가지로 추려지더라구요.

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 time과 system cpu time을 각각 측정할 수 있습니다.
SMP 면 각 CPU 별로도 측정가능합니다.

lovemyin의 이미지

Tick 값을 이용하는게 좋을거 같은데요.
Tick값을 초로 변환하는건 금방 아실 수 있을테고.

/***************************************************
* 가장 심플한 것이 가장 아름다운 것이다.
***************************************************/

prether의 이미지

변수를 이용하심이...

아니면 kernel용 gettimeofday()함수인
do_gettimeofday()를 이용하세요

dogettimeofday()이덩가? 헷갈리네요

/***************************************
Being the one is just like being in love.
***************************************/

Kari의 이미지

timer_tsc.c 코드를 보면 rdtsc 에서 읽은 time stamp counter(tsc) 값을 nanosecond 스케일로 변환하는 코드가 있습니다. 주석으로 설명도 잘 되어 있구요. tsc 를 쓸거라면 참조하셔도 될거예요.. tsc가 특정 코드를 정확하게 measure를 못하지만 제가 볼땐 스케줄링이나 I/O처리 캐쉬영향 등등 때문에, 두 지점에 시간 차를 계산해서 측정하는 방법은 어떤 방법을 써도 정밀한 측정은 힘들 거 같습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.