Dentry Cache clear 하기
version 2.4.26 으로 embedded linux 을 하나 돌리는데
화일을 서로 다른 이름으로 끊임없이 create , delete 을 반복하면서
dentry cache 사이즈가 memory full 되지 직전 까지 갑니다.
물론 memory 가 0kbyte ( 주로 500 ~ 600 K 사이 ) 되기 전에
clear 됩니다만 다른 app 를 실행하기 위해서는 항상 5Mbyte 정도의 여유 용량이 있어야 하는데 이것을 확보하기 위해서는 중간
중간에 5Mbyte 이하로 떨어지기 전에 clear 되어야 합니다.
따라서 커널 어느 부분에서인가 메모리 채크해서 bdflush 를 하는듯 한데 fs/buffer.c 에서
/*
* Ok, this is getblk, and it isn't very clear, again to hinder
* race-conditions. Most of the code is seldom used, (ie repeating),
* so it should be much more efficient than it looks.
*
* The algorithm is changed: hopefully better, and an elusive bug removed.
*
* 14.02.92: changed it to sync dirty buffers a bit: better performance
* when the filesystem starts to get full of dirty blocks (I hope).
*/
struct buffer_head * getblk(kdev_t dev, int block, int size)
{
for (;;) {
struct buffer_head * bh;
bh = get_hash_table(dev, block, size);
if (bh) {
touch_buffer(bh);
return bh;
}
if (!grow_buffers(dev, block, size))
free_more_memory();
}
}
위와 같이 하는듯 한데 위 부분은 아무래도 더이상 할당을 못할 경우 free more memory 을 하는 듯합니다.
제가 하고픈것은 일정 메모리 이하 일경우 free_more_momory 펑션을 실행 시키고 싶습니다.
어떤 방법이 있을까여?
filesystem 은 ram file system 을 모토롤라 MPC850 에서 사용중입니다.
커널에 미숙하므로 상세한 답변 부탁드립니다.
nr_free_pages()
파일을 생성/삭제를 반복하는데 dentry cache 가 폭주한다니 이상하군요..
(이상한게 아닌가요? :shock: )
어쨌든 원하는 기능을 넣으려면 다음과 같이 수정해 보시기 바랍니다.
실제로는 커널 내부적으로 사용하려고 예약해 둔 메모리 영역을 고려해야 하기 때문에
좀 더 많은 여유 용량이 필요할 듯 합니다.
(물론 실험해 보지는 않았습니다.. 8) )
댓글 달기