Re: [PATCH 0/4] PM: Drop shrink_all_memory (rev. 2) (was: Re: [PATCH 3/3] PM/Hibernate: Use memory allocations to free memory)

Wu Fengguang
2009-05-03T13:08:18Z

Hi Rafael,

I happened to be doing some benchmarks on the older shrink_all_memory(),
Hopefully it can be a useful reference point for the new design.

The current swsusp_shrink_memory()/shrink_all_memory() are terribly
inefficient: it takes 7-9s to free up 1.4G memory:

[ 131.899389] PM: Freed 1413380 kbytes in 7.03 seconds (201.04 MB/s)
[ 732.757916] PM: Freed 1490116 kbytes in 9.37 seconds (159.03 MB/s)

Below are the logs I collected by injecting printks. There are
basically two major problems:
- swsusp_shrink_memory() scans the whole 2G memory again and again;
- shrink_all_memory() is slow. It won't reclaim pages at all with
small priority values, because it's batching size is 10000 pages.

I wonder if it's possible to free up the memory within 1s at all.
(Maybe the slowness is due to too much enabled debugging options...)

Thanks,
Fengguang
---

vanilla 2.6.30-rc2-next-20090417:

[ 124.516187] PM: Marking nosave pages: 0000000000001000 - 0000000000006000
[ 124.523087] PM: Marking nosave pages: 000000000009f000 - 0000000000100000
[ 124.530060] PM: Basic memory bitmaps created
[ 124.534421] PM: Syncing filesystems ... done.
[ 124.842282] Freezing user space processes ... (elapsed 0.00 seconds) done.
[ 124.849800] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
[ 124.857571] PM: Shrinking memory... tmp=471584, size=491906, highmem_size=0
[ 124.939103] shrink_all_memory: pages=10000
[ 125.019543] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 125.027636]-tmp=451770, size=481986, highmem_size=0
[ 125.107571] shrink_all_memory: pages=10000
[ 125.139928] shrink_all_zones: pass=0, prio=7, lru=Normal.2, pages=10000, reclaimed=8500
[ 125.280940] shrink_all_zones: pass=0, prio=6, lru=DMA32.2, pages=1500, reclaimed=1500
[ 125.547990] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=10000
[ 125.556135]\tmp=411598, size=461898, highmem_size=0
[ 125.637414] shrink_all_memory: pages=10000
[ 125.716890] shrink_all_zones: pass=0, prio=7, lru=Normal.2, pages=10000, reclaimed=10000
[ 125.725092]|tmp=391507, size=451854, highmem_size=0
[ 125.806935] shrink_all_memory: pages=10000
[ 125.886317] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 125.894531]/tmp=371481, size=441841, highmem_size=0
[ 125.976823] shrink_all_memory: pages=10000
[ 126.104367] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 126.112572]-tmp=351715, size=431952, highmem_size=0
[ 126.195178] shrink_all_memory: pages=10000
[ 126.274586] shrink_all_zones: pass=0, prio=6, lru=DMA32.2, pages=10000, reclaimed=10000
[ 126.282698]\tmp=331949, size=422063, highmem_size=0
[ 126.365743] shrink_all_memory: pages=10000
[ 126.445851] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 126.453968]|tmp=311858, size=412019, highmem_size=0
[ 126.537417] shrink_all_memory: pages=10000
[ 126.616980] shrink_all_zones: pass=0, prio=9, lru=Normal.2, pages=10000, reclaimed=10000
[ 126.625180]/tmp=291751, size=401975, highmem_size=0
[ 126.709066] shrink_all_memory: pages=10000
[ 126.788665] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 126.796833]-tmp=271725, size=391962, highmem_size=0
[ 126.880997] shrink_all_memory: pages=10000
[ 127.008443] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 127.016667]\tmp=251716, size=381949, highmem_size=0
[ 127.101581] shrink_all_memory: pages=10000
[ 127.181588] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 127.189728]|tmp=231673, size=371936, highmem_size=0
[ 127.275105] shrink_all_memory: pages=10000
[ 127.354799] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 127.363003]/tmp=211599, size=361892, highmem_size=0
[ 127.448750] shrink_all_memory: pages=10000
[ 127.528252] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 127.536385]-tmp=191621, size=351910, highmem_size=0
[ 127.622369] shrink_all_memory: pages=10000
[ 127.750093] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 127.758295]\tmp=171539, size=341866, highmem_size=0
[ 127.844867] shrink_all_memory: pages=10000
[ 127.925614] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 127.933758]|tmp=151465, size=331822, highmem_size=0
[ 128.020878] shrink_all_memory: pages=10000
[ 128.100580] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 128.108803]/tmp=131391, size=321778, highmem_size=0
[ 128.196312] shrink_all_memory: pages=10000
[ 128.275643] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 128.283769]-tmp=111413, size=311796, highmem_size=0
[ 128.371814] shrink_all_memory: pages=10000
[ 128.501803] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=10000
[ 128.510007]\tmp=91339, size=301752, highmem_size=0
[ 128.597726] shrink_all_memory: pages=10000
[ 128.677138] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 128.685277]|tmp=71296, size=291739, highmem_size=0
[ 128.774061] shrink_all_memory: pages=10000
[ 128.855940] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=10000
[ 128.864145]/tmp=51259, size=281726, highmem_size=0
[ 128.953486] shrink_all_memory: pages=10000
[ 129.033417] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 129.041553]-tmp=31172, size=271682, highmem_size=0
[ 129.131233] shrink_all_memory: pages=10000
[ 129.210693] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=10000
[ 129.218994]\tmp=11146, size=261669, highmem_size=0
[ 129.309142] shrink_all_memory: pages=10000
[ 129.388523] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 129.396648]|tmp=-8880, size=251656, highmem_size=0
[ 129.487193] shrink_all_memory: pages=10000
[ 129.614831] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=10000
[ 129.623059]/tmp=-28954, size=241612, highmem_size=0
[ 129.714055] shrink_all_memory: pages=10000
[ 129.794104] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=10000
[ 129.802246]-tmp=-48932, size=231630, highmem_size=0
[ 129.893893] shrink_all_memory: pages=10000
[ 129.973667] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=10000, reclaimed=10000
[ 129.981892]\tmp=-69020, size=221586, highmem_size=0
[ 130.073916] shrink_all_memory: pages=10000
[ 130.154620] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=10000
[ 130.162853]|tmp=-89156, size=211511, highmem_size=0
[ 130.255274] shrink_all_memory: pages=10000
[ 130.334612] shrink_all_zones: pass=0, prio=8, lru=DMA32.2, pages=10000, reclaimed=10000
[ 130.342750]/tmp=-109182, size=201498, highmem_size=0
[ 130.435551] shrink_all_memory: pages=10000
[ 130.515074] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=10000
[ 130.523305]-tmp=-129273, size=191454, highmem_size=0
[ 130.616714] shrink_all_memory: pages=10000
[ 130.696350] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=10000
[ 130.704490]\tmp=-149299, size=181441, highmem_size=0
[ 130.798322] shrink_all_memory: pages=10000
[ 130.877834] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=10000
[ 130.886038]|tmp=-169325, size=171428, highmem_size=0
[ 130.980312] shrink_all_memory: pages=10000
[ 131.107844] shrink_all_zones: pass=0, prio=3, lru=DMA32.2, pages=10000, reclaimed=10000
[ 131.115982]/tmp=-189351, size=161415, highmem_size=0
[ 131.210530] shrink_all_memory: pages=10000
[ 131.291223] shrink_all_zones: pass=0, prio=7, lru=Normal.2, pages=10000, reclaimed=10000
[ 131.299433]-tmp=-209459, size=151371, highmem_size=0
[ 131.394488] shrink_all_memory: pages=10000
[ 131.474123] shrink_all_zones: pass=0, prio=3, lru=Normal.2, pages=10000, reclaimed=10000
[ 131.482344]\tmp=-229420, size=141389, highmem_size=0
[ 131.577910] shrink_all_memory: pages=10000
[ 131.657376] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=10000
[ 131.665498]|tmp=-249511, size=131345, highmem_size=0
[ 131.761676] shrink_all_memory: pages=3345
[ 131.791048] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=3345, reclaimed=3345
[ 131.799085]/tmp=-256256, size=127966, highmem_size=0
[ 131.895290]done (353345 pages freed)
[ 131.899389] PM: Freed 1413380 kbytes in 7.03 seconds (201.04 MB/s)

1/30 memory being mapped, vanilla 2.6.30-rc2-next-20090417:

AnonPages: 38684 kB
Mapped: 66940 kB

[ 722.944082] PM: Marking nosave pages: 0000000000001000 - 0000000000006000
[ 722.956215] PM: Marking nosave pages: 000000000009f000 - 0000000000100000
[ 722.963053] PM: Basic memory bitmaps created
[ 722.967365] PM: Syncing filesystems ... done.
[ 723.361274] Freezing user space processes ... (elapsed 0.00 seconds) done.
[ 723.369310] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
[ 723.377342] PM: Shrinking memory... tmp=508165, size=510179, highmem_size=0
[ 723.563602] shrink_all_memory: pages=10000
[ 723.648921] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9766
[ 723.733064] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19581
[ 723.741225]-tmp=468972, size=490587, highmem_size=0
[ 723.821406] shrink_all_memory: pages=10000
[ 723.902912] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9804
[ 723.987433] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19617
[ 723.995565]\tmp=429714, size=470964, highmem_size=0
[ 724.077458] shrink_all_memory: pages=10000
[ 724.160394] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9808
[ 724.261056] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19610
[ 724.269482]|tmp=390489, size=451341, highmem_size=0
[ 724.353672] shrink_all_memory: pages=10000
[ 724.556153] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9806
[ 724.669591] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19636
[ 724.677770]/tmp=351365, size=431780, highmem_size=0
[ 724.762188] shrink_all_memory: pages=10000
[ 724.923372] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9805
[ 725.037897] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19620
[ 725.046501]-tmp=312189, size=412188, highmem_size=0
[ 725.133452] shrink_all_memory: pages=10000
[ 725.371199] shrink_all_zones: pass=0, prio=5, lru=DMA32.2, pages=10000, reclaimed=9781
[ 725.519983] shrink_all_zones: pass=0, prio=5, lru=Normal.2, pages=10000, reclaimed=19585
[ 725.528233]\tmp=273061, size=392627, highmem_size=0
[ 725.616020] shrink_all_memory: pages=10000
[ 725.801211] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9804
[ 725.954523] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19617
[ 725.962685]|tmp=233885, size=373035, highmem_size=0
[ 726.051775] shrink_all_memory: pages=10000
[ 726.296589] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9804
[ 726.449150] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19682
[ 726.457342]/tmp=194507, size=353350, highmem_size=0
[ 726.548053] shrink_all_memory: pages=10000
[ 726.759180] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9803
[ 726.940475] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19561
[ 726.948638]-tmp=155396, size=333789, highmem_size=0
[ 727.040362] shrink_all_memory: pages=10000
[ 727.257478] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9804
[ 727.442356] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19544
[ 727.450548]\tmp=116319, size=314259, highmem_size=0
[ 727.543609] shrink_all_memory: pages=10000
[ 727.755346] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9804
[ 727.894707] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19555
[ 727.902910]|tmp=77256, size=294729, highmem_size=0
[ 727.997018] shrink_all_memory: pages=10000
[ 728.170973] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9799
[ 728.332426] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19545
[ 728.341152]/tmp=38210, size=275199, highmem_size=0
[ 728.437625] shrink_all_memory: pages=10000
[ 728.673862] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9773
[ 728.812572] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19517
[ 728.820738]-tmp=-852, size=255669, highmem_size=0
[ 728.917360] shrink_all_memory: pages=10000
[ 729.110178] shrink_all_zones: pass=0, prio=4, lru=DMA32.2, pages=10000, reclaimed=9839
[ 729.266243] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=19610
[ 729.274407]\tmp=-40045, size=236077, highmem_size=0
[ 729.372371] shrink_all_memory: pages=10000
[ 729.553743] shrink_all_zones: pass=0, prio=4, lru=Normal.2, pages=10000, reclaimed=9741
[ 729.673174] shrink_all_zones: pass=0, prio=3, lru=DMA.2, pages=259, reclaimed=256
[ 729.681224] shrink_all_zones: pass=0, prio=3, lru=DMA32.0, pages=259, reclaimed=256
[ 729.693997] shrink_all_zones: pass=0, prio=3, lru=DMA32.2, pages=259, reclaimed=513
[ 730.006423] shrink_all_zones: pass=0, prio=2, lru=DMA32.2, pages=9487, reclaimed=9296
[ 730.177563] shrink_all_zones: pass=0, prio=2, lru=Normal.2, pages=9487, reclaimed=18626
[ 730.185640]|tmp=-98138, size=207022, highmem_size=0
[ 730.285280] shrink_all_memory: pages=10000
[ 730.484499] shrink_all_zones: pass=0, prio=3, lru=DMA32.2, pages=10000, reclaimed=9807
[ 730.637792] shrink_all_zones: pass=0, prio=3, lru=Normal.2, pages=10000, reclaimed=19613
[ 730.645975]/tmp=-137343, size=187430, highmem_size=0
[ 730.746709] shrink_all_memory: pages=10000
[ 730.754374] shrink_all_zones: pass=0, prio=5, lru=Normal.0, pages=10000, reclaimed=0
[ 731.101101] shrink_all_zones: pass=0, prio=3, lru=DMA32.2, pages=10000, reclaimed=9777
[ 731.257243] shrink_all_zones: pass=0, prio=3, lru=Normal.2, pages=10000, reclaimed=19582
[ 731.265411]-tmp=-176567, size=167807, highmem_size=0
[ 731.367111] shrink_all_memory: pages=10000
[ 731.567779] shrink_all_zones: pass=0, prio=3, lru=DMA32.2, pages=10000, reclaimed=9811
[ 731.803019] shrink_all_zones: pass=0, prio=3, lru=Normal.2, pages=10000, reclaimed=19615
[ 731.811189]\tmp=-215837, size=148184, highmem_size=0
[ 731.913738] shrink_all_memory: pages=10000
[ 732.123893] shrink_all_zones: pass=0, prio=2, lru=DMA32.2, pages=10000, reclaimed=9808
[ 732.312075] shrink_all_zones: pass=0, prio=2, lru=Normal.2, pages=10000, reclaimed=19580
[ 732.320234]|tmp=-254948, size=128623, highmem_size=0
[ 732.423776] shrink_all_memory: pages=623
[ 732.432862] shrink_all_zones: pass=0, prio=12, lru=DMA.2, pages=623, reclaimed=617
[ 732.441782] shrink_all_zones: pass=0, prio=12, lru=Normal.0, pages=623, reclaimed=617
[ 732.453341] shrink_all_zones: pass=0, prio=11, lru=DMA.0, pages=6, reclaimed=0
[ 732.460712] shrink_all_zones: pass=0, prio=11, lru=DMA32.0, pages=6, reclaimed=0
[ 732.468390] shrink_all_zones: pass=0, prio=11, lru=DMA32.2, pages=6, reclaimed=6
[ 732.488091] shrink_all_zones: pass=0, prio=6, lru=DMA32.2, pages=623, reclaimed=617
[ 732.508256] shrink_all_zones: pass=0, prio=6, lru=Normal.2, pages=623, reclaimed=1233
[ 732.516202]/tmp=-258774, size=126704, highmem_size=0
[ 732.753869]done (372529 pages freed)
[ 732.757916] PM: Freed 1490116 kbytes in 9.37 seconds (159.03 MB/s)