
동기 부여
나는 여기에 답변을 썼습니다:내 시스템의 "워터마크" 메모리 예약은 얼마나 됩니까? "보통" 영역에 대한 "최소" 워터마크는 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
발생하기 전에 호출됩니다. 나는 가지고있다보고서오류를 관리자에게 전달하십시오.