프로세스의 page를 관찰하고 migration 가능한지에 대한 질문
글쓴이: smartcode / 작성시간: 화, 2012/12/11 - 9:26오후
안녕하세요.
제목처럼 커널에 올라와있는 프로세스들의 page를 특정 프로세스 (daemon)를 통해 관찰이 가능할까요?
예를 들면, 실행중인 프로그램이 두개가 있다고 하면 이 프로그램들이 사용하고 있는 (할당된) page 들의 접근 횟수를 특정 프로세스 (관찰 프로그램)를 짜서 이를 통해 알아볼 수 있는지 궁금합니다.
이유는, 물리메모리의 어느 address 영역이 주로 어느 프로세스가 access 하는지를 알아보려 합니다.
가능하다면 특정 물리주소에 할당된 page의 access 빈도가 높은편이라면 해당 page를 다른 address 로 migration을 하고 싶구요.
page migration은 커널의 NUMA와 관련된 코드에서 찾아볼 수 있었는데 일반적으로 여러개의 node를 두고 사용하지 않는 소규모 워크스테이션이나 데스크탑에서 (UMA)의 page migration이 가능한지 궁금합니다.
가능하다면 어느부분으로 page migration을 할 수 있는지도 궁금합니다.
너무 질문이 많고 두서가 없어 질문이 잘 전달이 될지 모르겠네요 ㅜ
많은 답변 부탁해요 ^^
Forums:
가능합니다.
Daemon만으로는 불가능하고, kernel module과 core kernel code를 조금 수정해주시면 됩니다. 중심이 되는 core logic은 다음과 같습니다.
1. user process가 물리 메모리 페이지에 최초 접근시 page fault가 발생한다.
2. kernel의 page fault handler에서 접근 빈도 count를 증가시킨다.
3. fault가 발생한 user 가상 주소에 debug exception을 건다. 그리고 유저모드로로 반환한다.
4. debug exception이 걸렸기 때문에 fault가 발생한 instruction을 수행한 후 다시 kernel 모드로 진입하게 된다.
5. kernel의 fault handler에서, debug exception이 걸렸던 주소의 페이지 테이블을 수정하여, 해당 주소에 r/w가 발생할 경우 다시 fault가 나게 만들고 debug exception을 풀어준다.
page migration은 NUMA뿐만이 아니라 UMA에서도 문제 없이 동작합니다.
Good luck
감사합니다.
상세한 답변 감사드립니다. :)
알려주신 방법에서 궁금한것이 있는데요,
migrate_pages() 가 UMA에서도 문제 없이 동작한다고 하셨는데 그렇다면 page fault handler에서 접근 빈도를 카운트해서 일정 카운트가 넘어가면 다른 physical address로 migrate_pages() 함수를 이용해서 migration이 가능한 것이지요?
처음에는 reverse address mapping을 통해 process가 사용중인 page의 virtual address를 physical address로 변환해서 수동으로 migration을 해야하나 했는데 이럴경우 해당 page의 page table과 TLB를 일일이 수정해야하는 부담이 있더라구요. 그런데 migrate_pages()를 사용하면 위의 과정을 automatic 하게 해주는것으로 알고있는데 제가 제대로 이해하고 있는지 모르겠습니다. 이게 맞다면 일이 많이 쉬워질텐데요..
네 알고 계신 내용이 맞습니다.
네 알고 계신 내용이 맞습니다. migrate_page함수는 user address space에 매핑된 모든 페이지를 이동시키는데 필요한 모든 scheme이 들어가 있으므로 그냥 믿고 사용하시면 됩니다. 이때, newpage인수로 님께서 원하시는 물리 주소의 페이지를 넘겨주시면 됩니다. 여기서 문제는 님께서 원하시는 물리 메모리의 페이지를 어떻게 할당할 수 있느냐 입니다. 이건 조금 생각해보시면 여러가지 방법이 있을 것 같습니다.
재밌는 거 하시네요. Good luck.
댓글 달기