FreeBSD のスワップの仕組みを追う - swap_pager_putpages と vm_pageout_cluster2016年02月17日 15時02分03秒

最近、FreeBSD の swapping の実装を調べている。

pagger の実装は各サブシステム毎に実装され、struct pageops を経て、vm から実装される。スワップデバイスへの書き出しは、pgo_putpages の動作の一つ。swappagerops は swap_pager_putpages 関数が設定されている。

swap_pager_putpages() 関数が、実際のスワップデバイスへの書き出しを行う最終関数。既に、何を書き出すかが決められていて、その vm page が渡される。一回に書き出されるページ数も上限があって、BLIST_MAX_ALLOC 以下で無ければならない。この値は FreeBSD 11 CURRENT 現在の値で 32。また、他にも一回の書き出しの限界は nsw_cluster_max が min((MAXPHYS/PAGE_SIZE), MAX_PAGEOUT_CLUSTER) と設定されており、MAX_PAGEOUT_CLUSTER は初期値では 16 となっている。

また、vm がスワップを行うときに、連続した vm page を一括して書き出すように努めている。swap_pager_putpages() 関数がその仕事を行う。vm_pageout_page_count がその時に、一回にまとめる数で、VM_PAGEOUT_PAGE_COUNT は 16 に設定されている。