zram swap on Desktop

John Moser john.r.moser at gmail.com
Tue Feb 28 01:58:05 UTC 2012

I've been toying with zram swap on the desktop, under Ubuntu Precise.  
It looks like a good candidate for a major feature in the next version; 
Precise is currently in feature freeze.  Yes, implementing this would 
involve just a single Upstart script; but it's a major change to the 
memory system in practice, thus a major feature.  I am not pushing this 
for implementation in Precise.

Looking for comments on if I should spec this out and put it up on 
Launchpad as a goal for Precise+1, and maybe additional testing if 
anyone cares to.

The justification for this is as follows:

The zram device dynamically allocates RAM to store a block device in 
compressed blocks.  The device has a fixed size, but zram only allocates 
RAM when it needs it.  When the kernel frees swap, it now informs the 
underlying device; thus zram releases that RAM back to the system.  
Similarly, when a file system frees a block, it now also informs the 
underlying device; zram supports this.

Because of all this, you can feasibly actually have a swap device on RAM 
the size of your entire RAM and nothing will happen until you start 
swapping--you can have 2GB of RAM, a 2GB zram block device, mkswap on 
it, and activate it.  Nothing will happen until it was time to start 
swapping anyway, in which case it'll work.  That means zram swap devices 
have no negative impact by design.  They could only have a negative 
impact if they were slower than regular RAM (purpose defeating) or if 
the driver had bugs (obviously wrong and should be fixed).

All this basically means a number of things, in theory:

  - The LiveCD should activate a zram0 swap device immediately at boot, 
equivalent to the size of physical RAM.
    * "Immediately at boot" is feasible as soon as /sys and /dev are 
    * tmpfs swaps, so tmpfs inherits compression!

  - Desktops may benefit by eschewing physical swap for RAM
    * But this breaks suspend-to-disk; then again, so does everything:
       + Who has a 16GB swap partition?  Many people have 4GB, 8GB, 16GB RAM
       + The moment RAM + SWAP - CACHE > TOTAL_SWAP, suspend to disk breaks

  - Servers may benefit greatly by eschewing physical swap for RAM
    * More RAM means an even bigger impact
    * Suspend to disk isn't important

Also for consideration is that Linux doesn't (to my knowledge) 
differentiate between "fast" and "Slow" swap and won't start moving 
really old stuff out of zram0 and onto regular disk swap if you have 
both.  This naturally means that the oldest, least used stuff would tend 
to float to zram0 if you had both.


The test conditions are as such:

  - Limited RAM to 2GB with mem=2G
  - Running a normal desktop:  Xchat, bitlbee, Thunderbird, Rhythmbox, 
  - Memory pressure occasionally supplied by VirtualBox

In this case, I ran under 2GB with a 1.5GB swap as such:

$ sudo -i
# echo 1610612736 > /sys/block/zram0/disksize
# mkswap /dev/zram0
# swapon /dev/zram0
# swapoff /dev/sda5

My swap device is now solely zram0.  I have attached an analysis script 
that analyzes /sys/block/zram0/


===STAGE 1===
Condition:  VirtualBox running Windows XP and Ubuntu 11.4 from LiveCD 
(two VMs).

Memory looks like:

Mem:   2051396k total,  1997028k used,    54368k free,       92k buffers
Swap:  1572860k total,   945784k used,   627076k free,    51576k cached

Every 2.0s: ./zram_stat.sh                              Mon Feb 27 
17:09:40 2012

                 Current         Predicted
Original:       922M            1536M
Compressed:     262M
Total mem use:  269M            448M
Saved:          652M            1087M
Ratio:          29%     (28%)

Physical RAM:   2003M
Effective RAM:  2656M           (3090M)

[Explanation of zram_stat.sh:  Current data in zram0; Compresesd data 
size; Total size of zram0 in memory including fragmentation, padding, 
etc; RAM saved by compression; size, i.e. 4M becomes 1M then size is 
25%; Effective RAM = physical RAM + Saved RAM.  The Predicted column 
assumes the same Ratio and a full swap device on zram0.]

In this case, the machine was extremely slow due to constant hammering 
of the disk.  I was quite aware of the reason:  not enough disk cache, 
thus lots of reading libraries off disk.  I tried adjusting 
/proc/sys/vm/swappiness=100 but no luck.

===STAGE 2===

I closed the VirtualBox machine running the Ubuntu installer.

Mem:   2051396k total,  1614096k used,   437300k free,      192k buffers
Swap:  1572860k total,   860040k used,   712820k free,   138940k cached

                Current         Predicted
Original:       821M            1536M
Compressed:     240M
Total mem use:  267M            499M
Saved:          554M            1036M
Ratio:          32%     (29%)

Physical RAM:   2003M
Effective RAM:  2558M           (3040M)

Notice that 100M was in swap and about  475M got freed in actual RAM, 
almost 90MB of which went directly to cache.  That's how much cache 
pressure there was.

The machine is now quite peppy, tapping the disk frequently but not 
enough to cause a problem.

===STAGE 3===

And of course a little while later:

Mem:   2051396k total,  1982984k used,    68412k free,     6284k buffers
Swap:  1572860k total,   717232k used,   855628k free,   200620k cached

And even after that:

Mem:   2051396k total,  1956432k used,    94964k free,    12792k buffers
Swap:  1572860k total,   630040k used,   942820k free,   167204k cached

Every 2.0s: ./zram_stat.sh                              Mon Feb 27 
18:10:31 2012

                 Current         Predicted
Original:       590M            1536M
Compressed:     175M
Total mem use:  234M            611M
Saved:          355M            924M
Ratio:          39%     (29%)

Physical RAM:   2003M
Effective RAM:  2358M           (2927M)

Cache pressure has stabilized.  My machine is now running faster than it 
was before, by a lot.  The reason is simple:  almost no disk activity 
since most libraries are cached.

It looks to me like fragmentation fluffs up as the kernel frees swap.  
To my knowledge, fragmented data eventually gets repacked (decompressed 
and then recompressed; shuffled around for consolidation; eventually) as 
the device is swapped onto, so this is less a problem than it seems as 
it will go away in high memory pressure situations.  In truth, the ratio 
turned to 32%/28% an hour later under minimal load so it looks like 
Nitin did a good job when he wrote this (right now I have 704M in 228M 
of RAM, with 203M of that being compressed data).

-------------- next part --------------
A non-text attachment was scrubbed...
Name: zram_stat.sh
Type: application/x-shellscript
Size: 1619 bytes
Desc: not available
URL: <https://lists.ubuntu.com/archives/ubuntu-devel-discuss/attachments/20120227/6db0ed87/attachment.bin>

More information about the Ubuntu-devel-discuss mailing list