cache memory를 어떻게 flush하죠? // cacheflush() 라는 리눅스 내장함수를 아시는분?

ukyoukyo의 이미지


페도라 9에서 C로 프로그램짜다가,

# free

해서 나타나는 buffer와 cached 용량을 줄이는 방법을 찾고 있는데요...

#man cacheflush

하니까 data cache를 flush한다는 내용이 있었습니다.

NAME
       cacheflush - flush contents of instruction and/or data cache
 
SYNOPSIS
       #include <asm/cachectl.h>
       int cacheflush(char *addr, int nbytes, int cache);

제 시스템에는 asm/cachectl.h 파일이 없습니다.

그러니까 manpage만 있고, 실제 소스는 없는 경우입니다.

CONFORMING TO
       This Linux-specific system call is only available on MIPS based systems.
       It should not be used in programs intended to be portable.

MIPS 기반 장비에서만 설치되는것 같은데,

일반 시스템에 적용하려면 어떤 방법이 필요한가요?

아!

echo 3 > /proc/sys/vm/drop_caches

이렇게 실행해도 cache size가 엄청나게 줄어버리더군요...

궁극적으로 알고 싶은것은,

API를 써서 cache 영역을 비우는 함수를 짜고 싶습니다...

고수분들의 조언을 부탁드립니다.

jick의 이미지

그 cache가 그 cache가 아닙니다. 전혀 다른 cache입니다.

"MIPS CPU에 달린 cache를 flush하는 명령"을 x86(..이겠죠?) CPU에 들고 와서 어쩌실라구요?

ukyoukyo의 이미지


그렇다면, user space memory의 cache를 지우는 API는 어떤게 있나요...

------------------ System programmer...^^


------------------ System programmer...^^

bushi의 이미지

x86 에는 cache를 다루기 위한 instruction 이 없을 겁니다.
write buffer 를 위한 instruction 만 찾아낸 기억이 있습니다.

OTL

tj의 이미지

echo 3 > /proc/sys/vm/drop_caches

bushi의 이미지

jick 님이 이미 언급하셨듯
"그 cache가 그 cache가 아닙니다. 전혀 다른 cache입니다."

OTL

tj의 이미지

아 끝 부분을 안 읽었네요. free에서 나오는 cache는 그 cache가 맞고, 그거 줄이는 방법은 /proc/sys/vm/drop_caches에 쓰는 방법밖엔 없습니다. CPU cache는 x86에선 PREFETCH, CLFLUSH, INVD 인스트럭션들로 건드릴 수 있긴 한데, 시퓨가 알아서 하니까 대게는 건드릴 이윤 없고, 말씀하셨듯 전혀 다른 캐시구요.

으음... 근데 왜 cached/buffered를 줄이려고 하시나요?

bushi의 이미지

아 저기.. 이 자리에서 할 얘기는 아닌 것 같습니다만... 그래도 ... 찾기가 어려워서요...
x86 L1 cache 중 instruction cache 만 invalidate 하는 instruction 을 알고계시면 좀 가르쳐주세요.

질문하신 분은 pagecache 가 아니라 CPU cache 를 말하는 것 같습니다. 이것 말입니다.

[bushi@rose wrs-donut]$ strings `which getconf`| grep CACHE
LEVEL1_ICACHE_SIZE
LEVEL1_ICACHE_ASSOC
LEVEL1_ICACHE_LINESIZE
LEVEL1_DCACHE_SIZE
LEVEL1_DCACHE_ASSOC
LEVEL1_DCACHE_LINESIZE
LEVEL2_CACHE_SIZE
LEVEL2_CACHE_ASSOC
LEVEL2_CACHE_LINESIZE
LEVEL3_CACHE_SIZE
LEVEL3_CACHE_ASSOC
LEVEL3_CACHE_LINESIZE
LEVEL4_CACHE_SIZE
LEVEL4_CACHE_ASSOC
LEVEL4_CACHE_LINESIZE
[bushi@rose wrs-donut]$ 
[bushi@rose wrs-donut]$ getconf LEVEL1_ICACHE_SIZE
32768
[bushi@rose wrs-donut]$ getconf LEVEL1_ICACHE_ASSOC
8
[bushi@rose wrs-donut]$ getconf LEVEL1_ICACHE_LINESIZE
64
[bushi@rose wrs-donut]$

OTL

tj의 이미지

fs cache 질문하신 것 같은걸요?

질문하신 분: "free 해서 나타나는 buffer와 cached 용량을 줄이는 방법을 찾고 있는데요..."

음... icache flush 인스트럭션은 없는데, self-modifying code 때문에 그러시는거면 코드 바꾼 후 한 번 점프하거나 serializing instruction 한 번 불러주면 된다고 메뉴얼에서 그러네요.

bushi의 이미지

그렇군요. cacheflush() 언급하셔서 그쪽에 시야가 집중됐었습니다.

사실은 icache linesize 에 맞추고 못 맞추는게 얼마나 차이가 나는 지 알아보기 위해 고민했던 적이 있는데,
x86 에선 테스트 단계 진입 전에 강제로 flush/invalidate 하는 방법을 못 찾았습니다.

OTL

tj의 이미지

아... 테스팅 목적이군요. 저도 전혀 모르겠습니다. WBINVD하고 의미 없는 코드 덩어리를 밟은 다음 CPUID하고 들어가면 되려나요?

ukyoukyo의 이미지

echo 3 > /proc/sys/vm/drop_caches

를 수행하는 함수 같은건 없나요?

/proc/sys/vm/drop_caches의 내용을 파일 포인터로 잡아서

내용을 3으로 변경하려고 하니 안되더군요. 항상 크기가 '0'인 특수한(?) 파일이어서요.

------------------ System programmer...^^


------------------ System programmer...^^

bushi의 이미지

sysctl() 사용하세요.
{ CTL_VM, VM_DROP_PAGECACHE } 으로 접근하시면 됩니다.

OTL

ukyoukyo의 이미지


bushi님 감사합니다.

한번 해보고 안되면 다시 여쭙겠습니다.

로또 사시길...^^

------------------ System programmer...^^


------------------ System programmer...^^

ukyoukyo의 이미지

bushi님.

알려주신 VM_DROP_PAGECACHE는 Linux 2.6.16부터 adding되었는데,

Linux 2.4.x에서는 어떠한 방법으로 접근할 수 있는지요?

그리고 2.6에서의 예제 사이트 좀 추천을...^^

------------------ System programmer...^^


------------------ System programmer...^^

Necromancer의 이미지

인텔 프로세서 매뉴얼은 아래 사이트에서 볼 수 있습니다.

http://www.intel.com/products/processor/manuals/index.htm

명령어셋은 아래 문서를 다운받으시면 됩니다.
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2A: Instruction Set Reference, A-M
Intel® 64 and IA-32 Architectures Software Developer's Manual Volume 2B: Instruction Set Reference, N-Z

그리고 예전에 위 매뉴얼 본 바로는 x86 명령어 중에 캐쉬 비우는 명령 있습니다. 찾아볼 시간이 안되니 알아서 찾아보세요.

Written By the Black Knight of Destruction

Written By the Black Knight of Destruction

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.