Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


proc - meminfo(Memory Profile) Overview

보통 시스템에 메모리가 얼마나 남아 있는지 점검하고 싶을 때가 있어요.

cat "/proc/meminfo" 명령어를 치면 상세한 메모리 정보를 파악할 수 있거든요.
이번에는 "/proc/meminfo"란 노드가 proc 파일 시스템에 구현된 코드로 메모리 정보를 어떻게 읽어 오는 지 확인하려고 해요. 

우선 커널이 부팅하는 과정에서 아래 함수에서 meminfo란 이름으로 proc 파일 시스템으로 등록하는데요.
static int __init proc_meminfo_init(void)
{
proc_create("meminfo", 0, NULL, &meminfo_proc_fops);
return 0;
}

static int meminfo_proc_open(struct inode *inode, struct file *file)
{
return single_open(file, meminfo_proc_show, NULL);
}

static const struct file_operations meminfo_proc_fops = {
.open = meminfo_proc_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};

가끔 메모리 leak으로 이슈가 생길 경우 섬세한 디버깅 패치를 작성해서 메모리가 어느 시점에 변동되는지 점검해야 하거든요. 5초 간격으로 호출되는 간단한 타이머 함수를 호출해서 메모리 잔여량을 체크하는 함수를 작성하는거죠.

이 때 proc 파일 시스템으로 등록된 meminfo_proc_show 내에서 호출된 함수 조각을 잘 활용하면 매우 유용할 것 같아요. 아래 함수로 High 메모리 잔여양과 전체 High Memory 양을 확인할 수 있어요.
void si_meminfo(struct sysinfo *val)
{
val->totalram = totalram_pages;
val->sharedram = global_page_state(NR_SHMEM);
val->freeram = global_page_state(NR_FREE_PAGES);
val->bufferram = nr_blockdev_pages();
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
val->mem_unit = PAGE_SIZE;
}

전체 low memory 양은 val->totalram - val->totalhigh,
free low memory 양은 val->freeram -  val->freehigh 으로 계산할 수 있죠.

아래 메모리 정보는 아래 정보로 계산이 되니 아래 API를 참고해서 시간에 따라 메모리가 얼마나 남아 있는지 체크해도 좋을 것 같아요.
"MemTotal:       %8lu kB\n" // val->totalram
"MemFree:        %8lu kB\n" // val->freeram
"MemAvailable:   %8lu kB\n" // val->freeram + 페이지 캐시 + global_page_state(NR_SLAB_RECLAIMABLE)
"Buffers:        %8lu kB\n" // val->bufferram
"Cached:         %8lu kB\n" // global_page_state(NR_FILE_PAGES) - total_swapcache_pages() - val->bufferram
"SwapCached:     %8lu kB\n" // total_swapcache_pages()
"Active:         %8lu kB\n" // global_page_state(NR_ACTIVE_ANON) +  global_page_state(NR_ACTIVE_FILE) 
"Inactive:       %8lu kB\n" // global_page_state(NR_INACTIVE_ANON) +  global_page_state(NR_INACTIVE_FILE)

Reference(프로세스 관리)
4.9 프로세스 컨택스트 정보는 어떻게 저장할까?
 4.9.1 컨택스트 소개
 4.9.2 인터럽트 컨택스트 정보 확인하기
 4.9.3 Soft IRQ 컨택스트 정보 확인하기
 4.9.4 선점 스케줄링 여부 정보 저장
4.10 프로세스 디스크립터 접근 매크로 함수
 4.10.1 current_thread_info()
 4.10.2 current 매크로란
4.11 프로세스 디버깅
 4.11.1 glibc fork 함수 gdb 디버깅
 4.11.2 유저 프로그램 실행 추적 

덧글

댓글 입력 영역