2012-05-05 3 views
1

저는 "proc 당 페이지 공유 비율"에 대해 많은 것을 알아 봤습니다. 아무 것도 발견하지 못했습니다. 그것은 단지 나를 위해 흥미 롭습니다, 나는 지금 당장은 현재 문제가 없으며 단지 궁금합니다. sysctl을 그것은이다 : 사전에freebsd shpgperproc 책임은 무엇입니까?

vm.pmap.shpgperproc 

덕분에

+0

나는이 파라미터 레버가 (아마도, 나는 100 % 확신 할 수 없다) pv 항목 수에 대해 알아 냈다. 그러나 어떻게? freebsd 커널 소스 grep이 발견되지 않았습니다. 또는 나는 그렇게 열심히 수색하지 않았다. – milo

답변

3

첫 번째로주의해야 할 점은 shpgperproc은 로더 튜너 블이기 때문에 부팅시 적절한 지시문 loader.conf으로 설정해야하며 그 이후에는 읽기 전용입니다.

두 번째 주목해야 할 것은 <arch>/<arch>/pmap.c에 정의되어 있으며 이는 VM 하위 시스템의 아키텍처 종속 부분을 처리합니다. 특히, 실제로는 amd64 pmap.c에 없으므로 최근에 제거되었습니다. 아래에서이 문제에 대해 조금 논의 할 것입니다. 그러나 다른 아키텍처 (i386, arm, ...)에 대해서는 존재하지만 각 아키텍처에서 동일하게 사용됩니다. 즉, 다음과 같이 나타납니다.

void 
    pmap_init(void) 
    { 
      ... 
      TUNABLE_INT_FETCH("vm.pmap.shpgperproc", &shpgperproc); 
      pv_entry_max = shpgperproc * maxproc + cnt.v_page_count; 

다른 곳에서는 사용되지 않습니다. pmap_init()은 한 번만 호출됩니다. 부팅시에 VM 하위 시스템 초기화의 일부로 호출됩니다. maxproc은 존재할 수있는 최대 프로세스 수 (즉, kern.maxproc)이며 cnt.v_page_count은 사용 가능한 메모리의 실제 페이지 수 (즉, vm.stats.v_page_count)입니다. 두 개의 프로세스가 페이지를 공유하는 경우 있도록

pv_entry은 기본적으로 더 정확하게 단지 가상 물리적 페이지의 매핑 (또는 struct vm_page이며, 모두가 각각의 매핑에 대해 별도의 pv_entry 구조가있을 것입니다, 그들 매핑이있다. 따라서 주어진 dirty 또는 페이지 아웃해야하거나 hw 페이지 테이블 업데이트가 필요한 페이지 (struct vm_page)의 경우 대응하는 매핑 된 가상 페이지 목록은 pv_entry의 해당 목록을 보면 쉽게 찾을 수 있습니다 (예를 들어, i386/i386/pmap.c:pmap_remove_all())

pv_entry을 사용하면 특정 VM 작업이보다 효율적으로 수행되지만 현재 구현 n (i386 이상)은 pv_chunk에 대한 을 기준으로 설정된 정적 크기의 공간 (pv_entry_max을 기반으로 설정 됨)을 사용하여 pv_entry을 관리하는 데 사용됩니다. 비활성 커널을 할당 해제 한 후 커널이 pv_entry을 할당 할 수 없으면 패닉이 발생합니다.

따라서 pv_entry 개의 공간을 기준으로 pv_entry_max을 설정하려고합니다. 분명히 우리는 최소한 RAM의 페이지가있는만큼 많은 것을 원할 것입니다. (이것은 cnt.v_page_count이 나오는 곳입니다). 그런 다음 각 페이지마다 pv_entry을 할당해야하므로 많은 페이지가 서로 다른 프로세스에 의해 가상으로 매핑된다는 사실을 고려해야합니다. 따라서 모든 아치에서 기본값이 200 인 shpgperproc은이 크기를 조정하는 방법 일뿐입니다. 프로세스간에 많은 페이지가 공유되는 시스템 (예 : 아파치를 실행하는로드가 많은 웹 서버)에서는 pv_entry이 부족할 가능성이 있습니다.

+0

고맙습니다. – milo

+0

하나 더 질문 : 메모리가 조각난 수 있습니다. 'pv_entry'의 사용량 증가를 사용합니까? – milo

+0

글쎄,'pv_entry'는 모든 매핑 된 페이지에 할당됩니다. 따라서 메모리가 페이지 크기보다 작은 입도로 조각화되면 아마도 yes가됩니다. –

0

내가 지금 나에게 가까운 FreeBSD의 머신이없는 그러나이 매개 변수가 정의 pmap.c에 사용되는 것 같다 http://fxr.watson.org/fxr/ident?v=FREEBSD7&im=bigexcerpts&i=shpgperproc

+0

그래서, 나는 "pv_entry_max = shpgperproc * maxproc + cnt"를 발견했습니다.vp_page_count; "하지만 freebsd의 sysctl은 vm.pmap.pv_entry_max 매개 변수를 가지고 있습니다. 차이점은 무엇입니까? – milo

+0

shpgperproc이 나중에 조정할 수있는 초기 pv_entry_max 값에 미치는 영향 – milo