3.4.2 시스템 구조 에 특 정 된 설정 (5): 냉 열 캐 시 초기 화

5190 단어
냉 열 캐 시 와 관련 된 데이터 구조의 초기 화 와 캐 시 충전 행 위 를 제어 하 는 '워 터 마크' 의 계산 에 대해 논의 합 니 다.Zone_pcp_init 는 이 캐 시 를 초기 화 하 는 것 을 책임 집 니 다. 이 함 수 는 freearea_init_nodes 호출.
start_kernel
->setup_arch
  ->machine_specific_memory_setup
  ->setup_memory
  ->paging_init
    -> free_area_init
      ->free_area_init_node
                ->free_area_init_core
                  ->zone_pcp_init
static __meminit void zone_pcp_init(struct zone *zone)
{
        /*
         * per cpu subsystem is not up at this point. The following code
         * relies on the ability of the linker to provide the
         * offset of a (static) per cpu variable into the per cpu area.
         */
        zone->pageset = &boot_pageset;
 
        if (populated_zone(zone))
                printk(KERN_DEBUG "  %s zone: %lu pages, LIFO batch:%u
", zone->name, zone->present_pages, zone_batchsize(zone)); }

유용 하 다
zone_batchsize
대량 크기 를 계산 한 후 코드 는 시스템 의 모든 것 을 옮 겨 다 닐 것 입 니 다.
CPU
동시 호출
setup_pageset
각각 채 우기
per_cpu_pageset
실례 의 상수.이 함 수 를 호출 할 때 사 용 했 습 니 다.
zone_pcp
매크로 선택 과 현재
CPU
관련 메모리 영역
pageset
실례
다음은 zonebatchsize 워 터 마크 계산 과정:
static int zone_batchsize(struct zone *zone)
{
#ifdef CONFIG_MMU
        int batch;
        batch = zone->managed_pages / 1024;
        if (batch * PAGE_SIZE > 512 * 1024)
                batch = (512 * 1024) / PAGE_SIZE;
        batch /= 4;             /* We effectively *= 4 below */
        if (batch < 1)
                batch = 1;
        batch = rounddown_pow_of_two(batch + batch/2) - 1;
 
        return batch;
 
#else
             return 0;
#endif
}

상기 코드 는 메모리 필드 의 페이지 수의 0.25% o 에 해당 하 는 batch 를 계산 할 수 있 습 니 다.시 프 트 작업 은 계산 결과 가 2 ^ N - 1 형식 이 있 는 지 확인 합 니 다.경험 에 따 르 면 이 값 은 대부분의 시스템 부하 에서 캐 시 혼합 효 과 를 최소 화 할 수 있다.Fls 는 컴퓨터 에 특 정 된 조작 으로 값 중 가장 낮은 비트 를 계산 하 는 데 사용 된다.이 교정 은 결과 값 을 메모리 영역 에서 0.25% o. batch 에서 벗 어 날 수 있 음 을 주의 하 십시오. = 22 시 편차 가 가장 크다. 22 + 11 - 1 = 32 로 인해 fls 는 비트 비트 비트 5 가 가장 낮은 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트 비트
메모리 필드 의 메모리 수량 이 512 MB 를 초과 할 때 대량 크기 는 증가 하지 않 습 니 다.페이지 크기 가 4 천 96KB 인 시스템 의 경우 페이지 수가 1 천 372 를 넘 으 면 512 MB 로 제한 된다.setuppageset 에서 캐 시 한계 계산 을 고려 할 때 batch 값 은 의미 가 있 습 니 다.
setup_pageset
  ->pageset_init
  ->pageset_set_batch
    ->pageset_update
static void setup_pageset(struct per_cpu_pageset *p, unsigned long batch)
{
        pageset_init(p);
        pageset_set_batch(p, batch);
}
 
static void pageset_init(struct per_cpu_pageset *p)
{
        struct per_cpu_pages *pcp;
        int migratetype;
 
        memset(p, 0, sizeof(*p));
 
        pcp = &p->pcp;
        pcp->count = 0;
        for (migratetype = 0; migratetype < MIGRATE_PCPTYPES; migratetype++)
                INIT_LIST_HEAD(&pcp->lists[migratetype]);
}
 
static void pageset_set_batch(struct per_cpu_pageset *p, unsigned long batch)
{
        pageset_update(&p->pcp, 6 * batch, max(1UL, 1 * batch));
}
 
static void pageset_update(struct per_cpu_pages *pcp, unsigned long high,
                unsigned long batch)
{
       /* start with a fail safe value for batch */
        pcp->batch = 1;
        smp_wmb();
 
       /* Update high, then batch, in order */
        pcp->high = high;
        smp_wmb();
 
        pcp->batch = batch;
}

열 페이지 의 경우 하한 선 은 0 이 고 상한 선 은 6 * batch 입 니 다. 캐 시 에 있 는 페이지 의 평균 수량 은 약 4 * batch 입 니 다. 커 널 은 캐 시 수준 을 너무 낮 추 지 않 기 때문에 batch * 4 는 메모리 필드 의 페이지 수 1000 분 의 1 에 해당 합 니 다. (이것 도 zone batchsize 가 전체 페이지 수 0.25% o 로 대량 크기 를 최적화 하려 고 하 는 이유 입 니 다)IA - 32 프로세서 의 L2 캐 시 수 는 0.25MB ~ 2mB 사이 이기 때문에 냉 열 캐 시 에 더 많은 메모 리 를 유지 하 는 것 은 무의미 하 다.경험 에 따 르 면 캐 시 크기 는 메 인 메모리 의 1000 분 의 1 입 니 다.현재 시스템 의 모든 CPU 에 설 치 된 물리 적 메모리 가 약 1GB ~ 2GB 인 것 을 감안 하면 이 규칙 은 의미 가 있다.이렇게 해서 대량의 크기 를 계산 하여 냉 열 캐 시 에 있 는 것 도 L2 캐 시 에 저장 할 수 있 습 니 다.
콜 드 페이지 목록 의 워 터 마크 는 약간 낮 습 니 다. 콜 드 페이지 는 캐 시 에 설치 되 어 있 지 않 기 때문에 성능 에 관심 이 없 는 작업 에 만 사 용 됩 니 다. 상한 선 은 batch 값 의 두 배 입 니 다.
Pcp - > batch 는 목록 을 다시 채 울 때 몇 페이지 가 바로 사용 되 는 지 결정 합 니 다.성능 측면 에서 볼 때 보통 한 페이지 가 아 닌 목록 에 여러 페이지 를 추가 합 니 다.
zone 에서pcp_init 가 끝 날 때 각 메모리 필드 의 페이지 수 와 계 산 된 대량 크기 를 출력 합 니 다. 시작 로그 에서 볼 수 있 습 니 다.
[    0.000000] Initmem setup node 0 [mem 0x00001000-0x6dffffff]
[    0.000000] On node 0 totalpages: 447905
[    0.000000]   DMA zone: 32 pages used for memmap
[    0.000000]   DMA zone: 0 pages reserved
[    0.000000]   DMA zone: 3995 pages, LIFO batch:0
[    0.000000]   Normal zone: 1744 pages used for memmap
[    0.000000]   Normal zone: 222974 pages, LIFO batch:31
[    0.000000]   HighMem zone: 1745 pages used for memmap
[    0.000000]   HighMem zone: 220936 pages, LIFO batch:31

좋은 웹페이지 즐겨찾기