kmalloc()이 최대 128k를 할당 받을 수 있는데,
궁금한게 kmalloc()으로 128k를 받는 것과 buddy allocation으로 (order : 5)할당 받는 것 차이가 뭔가요??
slab으로 받는 게 속도는 더 빠를 거 같은데, 그 외 어떤점이 있나요?
즉 slab으로 캐쉬를 구성할 때 사이즈가 큰 오브젝트(kmalloc()의 128, 64등)구성은 어떤 의미인가요?
예를 들어 kmalloc(100, GFP_KERNEL);을 하면 이때도 단편화는 발생할텐데요.;;;;;;;
뭔가 질문이 중복되네요.
답변 부탁드립니다.^^:;
댓글 8
-
홍문화
2012.08.30 22:18
-
김광식
2012.08.31 09:19
음..제 질문은 128k등 큰 사이즈를 요청할 때 버디로 직접 줄때와 슬랩으로 구성해서 줄 때 차이점이 뭔가하는 거였습니다.
그리고 큰 사이즈를 요청할 수록 슬랩에서도 단편화는 커질텐데(kmalloc(100k, gfp_kernel)을 하면 128k 오브젝트 리턴. 28k 낭비), 굳이 큰 오브젝트를 관리하는 슬랩을 버디에서 페이지를 받아 구성할 이유가 있을까??입니다. 애초에 버디에서 주면 될 것 같은데 말이죠..;;;;;일단 속도는 슬랩에서 주는 것이 더 빠를텐데, 이런 속도 관점 말고 또 다른 이유가 있는지 궁금합니다.
-
홍문화
2012.08.31 13:11
버디와 슬랩은 용도 자체가 다릅니다.
버디는 메모리 할당 시스템이고 슬랩은 커널 오브젝트를 위한 메모리를 제공하기 위해 버디 시스템에서
할당 받은 메모리를 캐시 하는 시스템입니다.
즉, 커널 오브젝트가 아니라면 버디로부터 직접 메모리 할당을 받게 될 것입니다.
-
노서영
2012.08.31 18:44
속도외에 그럴싸한 답은 생각나지 않지만 한번쯤 생각해 볼만한것 같습니다.
질문의 요지는 "4KB가 넘어가는 2^{order} KB 오브젝트들을 슬랩캐시로 별도로 구성할 필요가 있느냐?" 인것 같습니다. 왜냐하면 버디도 2^{order}KB의 페이지를 관리하기 때문입니다.
예를 드신것 처럼 128KB 메모리를 할당 받고자 하면 다음과 같이 호출하면 되는데
__get_free_pages(5, GFP_KENEL)
궂이 슬랩을 사용하는
kmalloc(131072, GFP_KERNEL)
함수를 호출할 이유가 없다는 것입니다. 즉, 4KB, 8KB, 16KB, 32KB, 64KB, 128KB 슬랩캐시를 만들 이유가 없어 보인다는 것입니다. 질문에도 말씀하셨듯이, 이것들이 많이 사용되기 때문에 속도를 높이기 위한 휴리스틱적인 이유 외에 다른 이유가 딱히 떠오르지 않네요..속도가 중요하닌까요.
참고로 비슷한 질문을 가지신 분이 여기에올린 분이 계시네요 ^^;
http://lists.kernelnewbies.org/pipermail/kernelnewbies/2011-March/001257.html
-
노서영
2012.10.14 00:02
질문하고 답변을 다시 읽고나니..뭔가 정리가 안되었네요.
포인트로 잡은 것은 /proc/slabinfo를 보면 8KB, 4KB 슬랩 캐시가 보이는데, 이 캐시들은 별로 캐시로 만들 이유가 없어보인다는 것이었습니다. (왜 128KB 캐시에 대한 답이 있었는지 ㅠ.ㅠ)
지난주에 Korea Linux Forum에 참석했는데, 슬랩할당자를 개발하셨던 Christoph Lameter분에게 질문할 기회가 있어서 물어봤습니다.
요점은 8KB, 4KB 페이지에 대한 슬랩 캐시는 원래 없었다고 합니다. 그런데 슬랩할당자를 만들어서 테스트를 하는데 팀의 다른 동료가 개발한 모듈의 속도가 많이 떨어져 그때 8KB, 4KB 슬랩캐시를 만들어서 넣었다고 합니다. 결국은 아주 오래전에 만들었던 캐시가 지금까지쓰이고 있다는 것입니다.
답변 후에 뒤쪽에 계셨던 허태준님께서 커널이 발전하면서 다른 모듈들의 성능도 8KB, 4KB 캐시에 영향을 받을 수 있기 때문에 계속 유지될 수 밖에 없었을 것라고 덧붙혔습니다.
아무튼 이것은 히스토리가 있는 레거시 코드고, 제거해도 성능에 문제가 없다면 빼도 되겠죠.
-
홍문화
2012.10.16 11:36
그렇군요. 화끈하게 이해가 되었습니다. ㅋ
감사합니다. ^^;
-
노서영
2012.10.16 10:49
설명이 명확하지 않았나 봅니다. ㅎ
1번의 경우는 페이지프레임이 4KB라고 가정하면, 말씀 하신것처럼 4KB 페이지에 작은 커널 오브젝트들을 캐시할때 단편화 관점에서 의미가 있습니다. 하지만 오브젝트가 4KB, 8KB 처럼 4KB의 배수 (정확히는 4*2^{order-1}KB)인 경우는 단편화 문제가 발생할까요? 제가 말씀드린 포인트는 이부분입니다. 따라서 4KB, 8KB *kmalloc 캐시*를 슬랩에 유지할 필요가 있느냐? 하는 것이었습니다. 슬랩의 kmalloc 캐시는 kmalloc() 함수에서 메모리를 할당 받으려고 시도할 때 먼저 찾는 캐시입니다. 4KB, 8KB는 단편화 문제도 발생하지 않을것이기 때문에 궂이 슬랩캐시로 구성하지 않아도 된다는 것이죠. 그래서 속도외에는 이유를 찾을 수가 없다는 것이고 슬랩할당자 개발자분도 속도를 말씀을 하셨습니다. (나중엔 이것이 슬랩할당자 초기의 문제였을 수 있다는 생각이 들더군요. 왜냐하면 슬랩할당자를 사용하지 않았던 버전에서는 팀동료의 모듈의 속도 문제가 없었다는 의미이므로...)
2번의 경우는 말씀하신것도 하나의 이유가 될것 같습니다. 좀 더 정확하게는 해당 오브젝트가 액티브하게 사용된다는 가정이 있어야 합니다. 슬랩의 크기는 축소될 수 있기 때문입니다.
제가 언급한 포인트를 이해하는데 도움이 되셨길 바랍니다.
P.S. 답변에 수정을 하려다 수정하는 것 대신 추가 설명부분을 덧붙힙니다.
kmalloc() 함수로 4KB 메모리를 할당할때만 4KB kmalloc 캐시가 사용되는 것은 아닙니다. kmalloc() 함수를 통해 3KB를 할당할때 4KB kmalloc 캐시가 사용됩니다.
-
홍문화
2012.10.15 20:17
이해가 잘 안되네요. ㅋ
1. 포인트로 잡은 것은 /proc/slabinfo를 보면 8KB, 4KB 슬랩 캐시가 보이는데, 이 캐시들은 별로 캐시로 만들 이유가 없어보인다는 것이었습니다. (왜 128KB 캐시에 대한 답이 있었는지 ㅠ.ㅠ)
=> 4KB 보다 작은 커널 오브젝트들의 단편화 방지와 속도 향상을 위해 필요한 것으로 알고 있습니다.
2. "4KB가 넘어가는 2^{order} KB 오브젝트들을 슬랩캐시로 별도로 구성할 필요가 있느냐?"
=> 최소한의 커널 오브젝트의 개수를 보장하기 위함이 아닐까요?
어디까지나 추측이지만 120KB 짜리 A라는 커널 오브젝트 10개를 슬랩 캐시로 가지고 있는 경우는 시스템의
메모리가 아무리 부족해져도 A를 10개까지 보장 할 수 있습니다. 하지만 슬랩 캐시로 유지 하지 않고
버디에서 할당 받는다면 10개를 보장 할 수 없게 될듯 싶습니다.
.
버디로 슬랩을 구성하며 슬랩은 내부 단편화를 줄이기 위해서 사용합니다.