28. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
zone::dirty_balance_reserve
? 当該zoneにおいて、dirtyにしないメモリ量。?
全ページから本reserve値を引いた数が、?
dirtyに出来るページ量の限界値となる。
? max(lowmem_reserve) + high_wmark_pagesで算出
/*
* Lowmem reserves are not available to
* GFP_HIGHUSER page cache allocations and
* kswapd tries to balance zones to their high
* watermark. As a result, neither should be
* regarded as dirtyable memory, to prevent a
* situation where reclaim has to clean pages
* in order to balance the zones.
*/
28
29. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
zone::percpu_drift_mark
? マイナーな機能。zone_watermark_ok_safe()でのみ使われる。
? zone_page_state(z, NR_FREE_PAGES)がpercpu_drift_mark
を下回っていた場合、?
zone_page_state_snapshot(percpuのNR_FREE_PAGESも加
算する)をfree_pagesとして、__zone_watermark_ok()を呼び
出す。
? percpu_drift_mark==0の時は無効
? page 迫時にpercpuのfree pageも動員する、その閾値を決め
るものと見なせる。
29
30. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
zone::pageset
? 型
? struct per_cpu_pageset __percpu *pageset;
? 各zoneはpercpuのキャッシュを持ち、出来るだけこの
キャッシュからページ割当を行う。?
解放時も最初はこのキャッシュへページを追加。
? ページが余ってくるとバディシステムに戻される。
? CPUキャッシュヒット率を高めることが目的。
30
31. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
zone::free_area[MAX_ORDER]
? zone毎のバディシステム(後述)。
31
37. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
for_each_zone_zonelist_n
odemaskループ!
1. zone_dirty_limitを越えてない?
? zone内のdirty page cacheの量に閾値がある。溜めすぎると?ush時にシステム止まるため。
2. zone->watermark(ここではlow)を下回ってない?
? sysctl -w zone_reclaim_mode=1 した場合のみ、zone_reclaim()を実行。?
でなければこの時点でこのzoneからの割当は諦め
? zone_reclaim():?
* Zone reclaim reclaims unmapped ?le backed pages and?
* slab pages if we are over the de?ned limits.?
*?
* A small portion of unmapped ?le backed pages is needed for?
* ?le I/O otherwise pages read by ?le I/O will be immediately?
* thrown out if the zone is overallocated. So we do not reclaim?
* if less than a speci?ed percentage of the zone is used by?
* unmapped ?le backed pages.
3. OKなら、このzoneのバディアロケータへ進む
37
38. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
__alloc_page_slowpath
? 簡単に???
1. wake_all_kswapds()
2. if alloc_?ags & ALLOC_NO_WATERMARKS:?
__alloc_pages_high_priority() … 緊急用メモリを使ってページを割当
3. __alloc_pages_direct_compact()?
CONFIG_COMPACTION is unsetなら何もしない
4. __alloc_pages_direct_reclaim()?
slow pathの主役っぽい。?
try_to_free_pages()してからget_page_from_freelist()を試行
5. __alloc_pages_may_oom()?
reclaimのprogressが全く無くなった場合に実行する
6. __alloc_pages_direct_compact()?
前回は非同期で、今回は同期的に実行(完了を待つ)
38
39. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
Memory policy
? Memory policyは、modeとnodemaskで定義される
? mode : MPOL_*** (後述)
? nodemask : mode毎に意味が違うが、基本的には割当に(優
先的に)使われるNUMA node群を示すbit mask
? 関連システムコール
? set_mempolicy(2): set memory policy for a process
? mbind(2): set memory policy for a memory range
39
40. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
Memory policy mode
? MPOL_PREFERRED
? nodemaskには1つのnodeだけ指定可能。ページ割当時は当該nodeか
らのアロケーションを試行し、失敗時は近傍のnodeへfallback。
? MPOL_INTERLEAVE
? nodemaskに1つ以上のnodeを指定。ページ割当のたびに、初回にアロ
ケーションを試行するnodeをround-robin。
? MPOL_BIND
? nodemaskに1つ以上のnodeを指定。ページ割当のたびに、node番号
昇順にページ割当を試行。nodemask外のnodeに対しては試行しない。
40
42. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
zone reclaim
? c.f. mm/vmscan.c:3686
? /*?
* Zone reclaim reclaims unmapped ?le backed pages and?
* slab pages if we are over the de?ned limits.?
*?
* A small portion of unmapped ?le backed pages is needed for?
* ?le I/O otherwise pages read by ?le I/O will be immediately?
* thrown out if the zone is overallocated. So we do not reclaim?
* if less than a speci?ed percentage of the zone is used by?
* unmapped ?le backed pages.?
*/
? 目的は恐らく???
? zonelistを走査してフリーメモリを探し、全滅だと__alloc_pages_slowpathに入るわけ
だけど、その前にlocal zoneで回収可能なページの回収を試みる。局所性維持が狙い。
42
43. Copyright? 2014 Hitachi, Ltd. All rights reserved. Yokohama Research Lab.
try_to_free_pages,
kswapd, compaction
? ページ回収系については次回以降でお願いします
43