Rik van Riel (riel@xxxxxxxxxx) 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 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom policy in Canada: sign http://dissolvethecrtc.ca/ Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>