내 최저 및 최고 워터마크가 Documentation/sysctl/vm.txt의 예측보다 높은 것 같습니다.

내 최저 및 최고 워터마크가 Documentation/sysctl/vm.txt의 예측보다 높은 것 같습니다.

동기 부여

나는 여기에 답변을 썼습니다:내 시스템의 "워터마크" 메모리 예약은 얼마나 됩니까? "보통" 영역에 대한 "최소" 워터마크는 31449 페이지로 표시됩니다. 그것은 125796 KiB입니다. 전체 크기(67584)보다 min_free_kbytes큽니다 .

재설정은 이 영역의 워터마크를 예상 수준(예: 9582 페이지)으로 min_free_kbytes설정합니다 . min그러나 잠시 후 더 높은 수준으로 돌아왔습니다.

나는 이것이 확실하다.부스트_워터마크(). "최소", "낮음" 및 "높음" 워터마크를 향상시킵니다.같은 수량. 워터마크 부스트 팩터15000이므로 최대 개선은 원래 "높음" 워터마크의 150%여야 합니다...

질문

처음부터 내 "높음" 워터마크가 왜 그렇게 높나요? ("낮은" 워터마크도 있음):

내 이후로워터마크 배율10에서 "최소", "낮음" 및 "높음" 사이의 거리는 영역 크기의 0.1%에 불과해야 합니다. 하지만 재설정 직후에 보면 min_free_kbytes"최소"와 "낮음"의 차이는 영역 크기의 2%입니다. 왜?

("낮음"과 "높음"의 차이는 면적 크기의 0.2%입니다. 따라서 이는 우리가 기대하는 것과도 다릅니다!).

워터마크를 설정하는 코드는 다음과 같습니다.__setup_per_zone_wmarks().

커널 버전: 5.0.17-200.fc29.x86_64

에서 /proc/zoneinfo:

Node 0, zone   Normal
  pages free     74597
        min      9582
        low      34505
        high     36900
        spanned  1173504
        present  1173504
        managed  1140349

DMA32 영역에서는 그렇게 큰 차이를 볼 수 없습니다. "최소" 워터마크는 DMA32 영역에서도 승격되지 않는 것 같습니다. 아마도 커널이 "일반" 영역에서 할당하는 것을 선호하기 때문일 것입니다.

Node 0, zone      DMA
...
  pages free     3961
        min      33
        low      41
        high     49
        spanned  4095
        present  3996
        managed  3961
...
Node 0, zone    DMA32
  pages free     334671
        min      7280
        low      9100
        high     10920
        spanned  1044480
        present  888973
        managed  866356

답변1

워터마크 사이의 거리가 0.1% 수치와 일치하지 않는 이유를 알아냈습니다.

"소형 시스템"에서 워터마크 사이의 거리는 (강화되지 않은) "최소" 워터마크의 1/4입니다. 즉, 기록된 거리가 (특정 지역에 대해) managed * watermark_scale_factor / 10000보다 작 으면 해당 거리는 사용되지 않습니다.min / 4

    } else {
        /*
         * If it's a lowmem zone, reserve a number of pages
         * proportionate to the zone's size.
         */
        zone->_watermark[WMARK_MIN] = tmp;
    }

    /*
     * Set the kswapd watermarks distance according to the
     * scale factor in proportion to available memory, but
     * ensure a minimum size on small systems.
     */
    tmp = max_t(u64, tmp >> 2,
            mult_frac(zone_managed_pages(zone),
                  watermark_scale_factor, 10000));

    zone->_watermark[WMARK_LOW]  = min_wmark_pages(zone) + tmp;
    zone->_watermark[WMARK_HIGH] = min_wmark_pages(zone) + tmp * 2;
    zone->watermark_boost = 0;

tmp >> 2.tmp / 4

소스코드 링크:linux-5.0.17/mm/page_alloc.c:7531

나는 또한 여기서 최근 버그를 발견했습니다. "하이-로우"와 "로우-민" 사이에는 차이가 없어야 합니다! 이는 설정 여부 min_wmark_pages(zone)에 따라 다르기 때문에 발생할 수 있지만 zone->watermark_boost발생하기 전에 호출됩니다. 나는 가지고있다보고서오류를 관리자에게 전달하십시오.

관련 정보