slabinfo 에서..
글쓴이: 익명 사용자 / 작성시간: 월, 2002/10/07 - 12:56오후
/proc/slabinfo 안에 보면
kmem_cache 64 64 244 4 4 1 252 126
...
..
이렇게 쭉 캐쉬들이 보이는데요...
그런데 각 값들이 무엇을 하는 것인지 알고 싶습니다...
그리고 kmem_cache에 대한 것인데요.. 처음 cache_cache를 초기화 할 때
생기는 처음 생기는 거잖아요..(맞겠죠...)
그런데 이 캐쉬의 플래그가 SLAB_NO_REAP로 되어 있습니다. 그럼 이 캐쉬
는 프로세스에서 사용할 수 없는 것이며 단지 전체 캐쉬들을 관리하기 위
한 메인 캐쉬인가요??(용어가 좀 이상하지만...)
Forums:
Re: slabinfo 에서..
$ cat /proc/slabinfo
slabinfo - version 1.1
kmem_cache 55 68 112 2 2 1
tcp_tw_bucket 0 40 96 0 1 1
tcp_bind_bucket 28 113 32 1 1 1
tcp_open_request 0 59 64 0 1 1
inet_peer_cache 2 59 64 1 1 1
ip_fib_hash 11 113 32 1 1 1
ip_dst_cache 107 144 160 6 6 1
arp_cache 5 30 128 1 1 1
blkdev_requests 640 640 96 16 16 1
dnotify cache 0 0 20 0 0 1
file lock cache 40 84 92 1 2 1
fasync cache 0 0 16 0 0 1
uid_cache 4 113 32 1 1 1
skbuff_head_cache 162 312 160 13 13 1
sock 103 126 832 12 14 2
sigqueue 0 29 132 0 1 1
cdev_cache 1869 1888 64 32 32 1
bdev_cache 5 59 64 1 1 1
mnt_cache 15 59 64 1 1 1
inode_cache 236687 236880 480 29610 29610 1
dentry_cache 266542 266550 128 8885 8885 1
dquot 0 0 128 0 0 1
filp 1743 1770 128 59 59 1
names_cache 0 2 4096 0 2 1
buffer_head 26340 26640 96 666 666 1
mm_struct 101 120 160 5 5 1
vm_area_struct 3063 3600 96 77 90 1
fs_cache 100 118 64 2 2 1
files_cache 100 117 416 12 13 1
signal_act 102 117 1312 34 39 1
size-131072(DMA) 0 0 131072 0 0 32
size-131072 0 0 131072 0 0 32
size-65536(DMA) 0 0 65536 0 0 16
size-65536 0 0 65536 0 0 16
size-32768(DMA) 0 0 32768 0 0 8
size-32768 0 4 32768 0 4 8
size-16384(DMA) 0 0 16384 0 0 4
size-16384 0 1 16384 0 1 4
size-8192(DMA) 0 0 8192 0 0 2
size-8192 2 3 8192 2 3 2
size-4096(DMA) 0 0 4096 0 0 1
size-4096 54 57 4096 54 57 1
size-2048(DMA) 0 0 2048 0 0 1
size-2048 42 116 2048 21 58 1
size-1024(DMA) 0 0 1024 0 0 1
size-1024 41 96 1024 11 24 1
size-512(DMA) 0 0 512 0 0 1
size-512 38 40 512 5 5 1
size-256(DMA) 0 0 256 0 0 1
size-256 14 30 256 1 2 1
size-128(DMA) 0 0 128 0 0 1
size-128 613 630 128 21 21 1
size-64(DMA) 0 0 64 0 0 1
size-64 12715 12744 64 216 216 1
size-32(DMA) 0 0 32 0 0 1
size-32 30924 30962 32 274 274 1
/proc/slabinfo를 만들어 주는 컬널 소스를
따라가다 보면,
mm/slab.c에서
/**
* slabinfo_op - iterator that generates /proc/slabinfo
*
* Output layout
* cache-name
* num-active-objs
* total-objs
* object size
* num-active-slabs
* total-slabs
* num-pages-per-slab
* + further values on SMP and with statistics enabled
*/
이것을 볼수 있고..
kmem_cache는 님 말씀데로 슬랩객체관리를 위한 캐쉬입니다.
저의 경우엔, 갯수가 55개인데, 이것이
만들어진 slab객체의 수와 동일한 것을 확인할 수 있습니다.
그리고 SLAB_NO_REAP의 의미는
메모리가 부족할때 슬랩에 할당된 개체를 자동으로 반환하는
것을 금지한다는 뜻이죠,
그런데, 제가 알기론 슬랩객체에 한번 할당이 되면,
원래 논문에서와는달리 해제가 리눅스에서는 안되는 것으로 알고
있습니다. 그러니까 한번 할당된 캐쉬는 쭈욱~ 남아 있죠..
(빈자리로 남아서 다시 사용되겠죠..)
예를 들면,
vm_area_struct 3063 3600 96 77 90 1
제가 테스트좀 한다고 가상메모리 주소를 가지고 장난을
쳤더니만,, 저렇게 90개의 슬랩객체를 할당했다가
지금은 77개만 액티브로 남고.. 13개는 그냥 남아 있는겁니다.
(실제로 캐슁된 vm_area_struct객체의 수는 537개..)
size-2048 42 116 2048 21 58 1
이 녀석도 마찬가지구요
Re^2: slabinfo 에서..
slabinfo를 보면 kmem_cache가 68개의 캐쉬 구조체를 가지고 있는데요..
이것이 두 프레임에 들어가니 하나의 페이지 프레임에(현재는 하나의 슬랩
에) 34개의 캐쉬 구조체가 들어간다고 봐야 되겠죠..
그런데 계산을 해보면 kmem_cache_estimate()의 마지막에서 wastage가
288 정도가 남습니다. 288바이트는 어디에 쓰이는 것입니까?
static void kmem_cache_estimate (unsigned long gfporder, size_t size,
int flags, size_t *left_over, unsigned int *num)
{
int i;
size_t wastage = PAGE_SIZE< size_t extra = 0;
size_t base = 0;
if (!(flags & CFLGS_OFF_SLAB)) {
base = sizeof(slab_t);
extra = sizeof(kmem_bufctl_t);
}
i = 0;
while (i*size + L1_CACHE_ALIGN(base+i*extra) <= wastage)
i++;
if (i > 0)
i--;
if (i > SLAB_LIMIT)
i = SLAB_LIMIT;
*num = i;
wastage -= i*size; --> 이부분입니다. i를 34로 놓고 size를
112로 계산하면 wastage(4096)-i*size(3808)이 되어 wastage는 288이됩니
다.
wastage -= L1_CACHE_ALIGN(base+i*extra); -->초기화에서는 슬
랩을 위한 구조체나 객체 구조체가 0이니 이것은 뛰어 넘겠죠..
*left_over = wastage;
}
그리고 다른 질문이 있는습니다. 캐쉬하나에는 슬랩이 여러개 들어갈 수
있잖아요.(full슬립여러개, partial여러개->할당,해제를 반복한 경우..)
그런데 왜 슬랩 하나당 객체수를 계산하나요?
또, 캐쉬 구조체에서 colour 필드가 무엇을 의미하는지 도대체 모르겠습니
다.
질문이 너무 많아 죄송합니다. 그런데 앞으로는 더 많아 질 것 같은 생각
이 듭니다.
Re^3: 슬랩 할당자 (Slab Allocator)의 이해를 돕는 그림
아래의 글을 참고 하시죠..
http//www.ezdoum.com/stories.php?story=02/10/08/3410709
댓글 달기