- 论坛徽章:
- 16
|
回复 19# blake326
anon page直接就在 active list中,一般系统比较少才能调用到shrink_active_list,更突出了它的重要性。
你的帖子ubuntu为什么free内存这么少,其实就是buffer/cache很多,加进来的释放的主要都是cache,shrink_active_list调用比较少。
=============================================================
红色的部分怎么看出来的,貌似是swap tendency >= 100也就是你说的系统内存紧张时,从lump reclaim回收的page更有可能被
放到inactive。调不调用shrink_active_list与系统的紧张程度有关,进而影响回收的priority,那么紧张的话shrink_active_list和shrink_inactive_list
都会调用到。如果系统不是很紧张,而且要扫描的page数没有超过threshold sc->swap_cluster_max,那么就不会往下执行啊,接着在direct page reclaim path
和swap daemon path都会调用shrink_slab从icache,dcahce回收- static unsigned long shrink_zone(int priority, struct zone *zone,
- struct scan_control *sc)
- {
- unsigned long nr_active;
- unsigned long nr_inactive;
- unsigned long nr_to_scan;
- unsigned long nr_reclaimed = 0;
- /*
- * Add one to `nr_to_scan' just to make sure that the kernel will
- * slowly sift through the active list.
- */
- zone->nr_scan_active +=
- (zone_page_state(zone, NR_ACTIVE) >> priority) + 1;
- nr_active = zone->nr_scan_active;
- if (nr_active >= sc->swap_cluster_max)
- zone->nr_scan_active = 0;
- else
- nr_active = 0;
- zone->nr_scan_inactive +=
- (zone_page_state(zone, NR_INACTIVE) >> priority) + 1;
- nr_inactive = zone->nr_scan_inactive;
- if (nr_inactive >= sc->swap_cluster_max)
- zone->nr_scan_inactive = 0;
- else
- nr_inactive = 0;
- while (nr_active || nr_inactive) {
- if (nr_active) {
- nr_to_scan = min(nr_active,
- (unsigned long)sc->swap_cluster_max);
- nr_active -= nr_to_scan;
- shrink_active_list(nr_to_scan, zone, sc, priority);
- }
- if (nr_inactive) {
- nr_to_scan = min(nr_inactive,
- (unsigned long)sc->swap_cluster_max);
- nr_inactive -= nr_to_scan;
- nr_reclaimed += shrink_inactive_list(nr_to_scan, zone,
- sc);
- }
- }
- throttle_vm_writeout(sc->gfp_mask);
- return nr_reclaimed;
- }
复制代码 |
|