Messages in this thread | | | Date | Mon, 8 Nov 2010 13:55:25 -0800 | From | Mandeep Singh Baines <> | Subject | Re: [PATCH] RFC: vmscan: add min_filelist_kbytes sysctl for protecting the working set |
| |
Rik van Riel (riel@redhat.com) wrote: > On 11/03/2010 06:40 PM, Mandeep Singh Baines wrote: > > >I've created a patch which takes a slightly different approach. > >Instead of limiting how fast pages get reclaimed, the patch limits > >how fast the active list gets scanned. This should result in the > >active list being a better measure of the working set. I've seen > >fairly good results with this patch and a scan inteval of 1 > >centisecond. I see no thrashing when the scan interval is non-zero. > > > >I've made it a tunable because I don't know what to set the scan > >interval. The final patch could set the value based on HZ and some > >other system parameters. Maybe relate it to sched_period? > > I like your approach. For file pages it looks like it > could work fine, since new pages always start on the > inactive file list. > > However, for anonymous pages I could see your patch > leading to problems, because all anonymous pages start > on the active list. With a scan interval of 1 > centiseconds, that means there would be a limit of 3200 > pages, or 12MB of anonymous memory that can be moved to > the inactive list a second. >
Good point.
> I have seen systems with single SATA disks push out > several times that to swap per second, which matters > when someone starts up a program that is just too big > to fit in memory and requires that something is pushed > out. > > That would reduce the size of the inactive list to > zero, reducing our page replacement to a slow FIFO > at best, causing false OOM kills at worst. > > Staying with a default of 0 would of course not do > anything, which would make merging the code not too > useful. > > I believe we absolutely need to preserve the ability > to evict pages quickly, when new pages are brought > into memory or allocated quickly. >
Agree.
Instead of doing one scan of SWAP_CLUSTER_MAX pages per vmscan_interval, we could one "full" scan per vmscan_interval. You could do one full scan all at once or scan SWAP_CLUSTER_MAX every scan until you've scanned the whole list.
Psuedo code:
if (zone->to_scan[file] == 0 && !list_scanned_recently(zone, file)) zone->to_scan[file] = list_get_size(zone, file); if (zone->to_scan[file]) { shrink_active_list(nr_to_scan, zone, sc, priority, file); zone->to_scan[file] -= min(zone->to_scan[file], nr_to_scan); }
> However, speed limits are probably a very good idea > once a cache has been reduced to a smaller size, or > when most IO bypasses the reclaim-speed-limited cache. > > -- > All rights reversed
| |