저는 "proc 당 페이지 공유 비율"에 대해 많은 것을 알아 봤습니다. 아무 것도 발견하지 못했습니다. 그것은 단지 나를 위해 흥미 롭습니다, 나는 지금 당장은 현재 문제가 없으며 단지 궁금합니다. sysctl을 그것은이다 : 사전에freebsd shpgperproc 책임은 무엇입니까?
vm.pmap.shpgperproc
덕분에
저는 "proc 당 페이지 공유 비율"에 대해 많은 것을 알아 봤습니다. 아무 것도 발견하지 못했습니다. 그것은 단지 나를 위해 흥미 롭습니다, 나는 지금 당장은 현재 문제가 없으며 단지 궁금합니다. sysctl을 그것은이다 : 사전에freebsd shpgperproc 책임은 무엇입니까?
vm.pmap.shpgperproc
덕분에
첫 번째로주의해야 할 점은 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
이 부족할 가능성이 있습니다.
내가 지금 나에게 가까운 FreeBSD의 머신이없는 그러나이 매개 변수가 정의 pmap.c에 사용되는 것 같다 http://fxr.watson.org/fxr/ident?v=FREEBSD7&im=bigexcerpts&i=shpgperproc
나는이 파라미터 레버가 (아마도, 나는 100 % 확신 할 수 없다) pv 항목 수에 대해 알아 냈다. 그러나 어떻게? freebsd 커널 소스 grep이 발견되지 않았습니다. 또는 나는 그렇게 열심히 수색하지 않았다. – milo