Compcache

(How to enable compcache)
(How to enable compcache)
Line 126: Line 126:
Now you must change you VM settings to effectivly use the new ramz setup.  The following settings have been found to work with 32MB, 64MB and 128MB ramz sizes.  They are a work in progress and will be updated as they are tuned to the authors workload (heavy user, treating n900 as a pocket laptop as oppose to merely a phone).
Now you must change you VM settings to effectivly use the new ramz setup.  The following settings have been found to work with 32MB, 64MB and 128MB ramz sizes.  They are a work in progress and will be updated as they are tuned to the authors workload (heavy user, treating n900 as a pocket laptop as oppose to merely a phone).
 +
 +
Paste the below lines into xterm to setup the VM and tune the flash disc
<source lang="bash">
<source lang="bash">
Line 141: Line 143:
echo 32 > /sys/block/mmcblk0/queue/iosched/quantum
echo 32 > /sys/block/mmcblk0/queue/iosched/quantum
echo 32 > /sys/block/mmcblk1/queue/iosched/quantum
echo 32 > /sys/block/mmcblk1/queue/iosched/quantum
-
echo 125 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
+
echo 100 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
-
echo 125 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
+
echo 100 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
-
echo 250 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
+
echo 200 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
-
echo 250 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
+
echo 200 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
</source>
</source>

Revision as of 09:17, 1 June 2012

Compcache or Ramzswap, hitherto referred as ramz is a method for taking a chunk of 'normal' ram and using it as a compressed virtual memory(VM) swap space. That is, we use ram as virtual virtual ram by compressing the contents on the fly and storing it in ram. This is in order to squeeze as much space from the limited ram as possible.


Contents

N8x0


To be added by a wild N8x0 user...
Apparently compcache is the single greatest thing to ever happen to the N8x0.

N900

The problem


Lack of ram is seen as one on the main performance bottlenecks an N900 user has to contend with. In it's stock set up the N900 is prone to having massive swap space coronary. This can leads to poor performance, diminished user sexual function and in the worst cases, a reboot due to watchdog timers becoming ignored. This is generally alleviated in 1 of 4 ways.


The solutions


Install 'swappolube'

Swappolube is a set of VM tweaks initially dreamed up by the user Hawaii. For MOST users the installation of swappolube from the repositories and applying the default settings will suffice to alleviate the problem.


Swap on micro SD card(uSD)

It has been found that an easy way to alleviate eMMC contention is to move the swap space to the uSD card[1].


Swap de-fragmentation

It has been found that as the swap space fills up the OS is unable to allocate continuous space on the swap space. This leads to poor performance. The package ereswap was created to alleviate this.


Compcache

The articles namesake. The use of compcache has been a contentious issue. Most users have found it to cause extremely poor system performance. As soon as the ramz space gets filled, which is pretty quick, the system grinds to a slow crawl.

It has been suggested that by some users that the 'extreme' settings of swappolube that most users run are utterly wrong for ramz. Swappolube sets the VM to swap little bits rarely. This does not work for ramz. The opposite approach for ramz must be taken, the device must swap a lot, all the time. As the swapping is to ram, there will be little penalty in speed. Although it has been suggested that there will perhaps be a slight penalty in processor use (de/compression of ramz) and thus battery life.

Using compcache



Caveats!


  • While ramz does work on kernel power version 49 (KP49) it is highly recommended that you use KP50!
  • Ramz requires a disksize that is specified in KB in powers of 2. Acceptable sizes are:
Ramz size English
2048 2MB
4096 4MB
8192 8MB
16384 16MB
32768 32MB
65536 64MB
131072 128MB
  • It is recommended that you use 64MB
  • You MUST have swap enabled on a physical disk before enabling ramz or your n900 WILL insta-crash potentially taking your file system with it!
  • Compcache is still considered experimental! It may not work, assplode your n900 and rip your **** clean off. You have been warned.

How to enable compcache

To enable compcache you must enter these commands as root, the following will create a ramz disk of 64MB:

insmod /lib/modules/current/ramzswap.ko disksize_kb=65536

Once enabled you must tell the system to use the ramz disk:

swapon /dev/ramzswap0

For any of this to be any benefit the ramz disk needs to have a higher priority than the 'physical' swap space. Make sure ALL applications are closed and disable then re-enable your physical swap. On a stock setup (swap on eMMC) you can do this:

swapoff /dev/mmcblk0p3 && sleep 1 && swapon /dev/mmcblk0p3

For other setups i.e. when you have swap on uSD you must substitute 'mmcblk0p3' with the location of your swap space. (If you swap partition is the second partition on the uSD then it will be 'mmcblk1p2').

You can now check you have the appropriate partitions with:

cat /proc/swaps
Filename				Type		Size	Used	Priority
/dev/mmcblk0p3                          partition	786424	64476	-2
/dev/ramzswap0                          partition	65528	61572	-1

You can see ramzswap is 64MB AND with a higher priority than mmcblk0p3.

Now you must change you VM settings to effectivly use the new ramz setup. The following settings have been found to work with 32MB, 64MB and 128MB ramz sizes. They are a work in progress and will be updated as they are tuned to the authors workload (heavy user, treating n900 as a pocket laptop as oppose to merely a phone).

Paste the below lines into xterm to setup the VM and tune the flash disc

echo 10 > /proc/sys/vm/dirty_ratio
echo 10 > /proc/sys/vm/dirty_background_ratio
echo 250 > /proc/sys/vm/dirty_writeback_centisecs 
echo 1000 > /proc/sys/vm/dirty_expire_centisecs 
echo 100 > /proc/sys/vm/swappiness 
echo 200 > /proc/sys/vm/vfs_cache_pressure 
echo 0 > /proc/sys/vm/page-cluster
echo 64 > /sys/block/mmcblk0/queue/nr_requests
echo 64 > /sys/block/mmcblk1/queue/nr_requests
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle
echo 0 > /sys/block/mmcblk1/queue/iosched/slice_idle
echo 32 > /sys/block/mmcblk0/queue/iosched/quantum
echo 32 > /sys/block/mmcblk1/queue/iosched/quantum
echo 100 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
echo 100 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
echo 200 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
echo 200 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async

How to do this all at once


Paste the below code into a root xterm.

#!/bin/sh
 
#referance: http://www.westnet.com/~gsmith/content/linux-pdflush.htm
 
#swapoff ramzswap and remove ramzswap module
swapoff /dev/ramzswap0 && sleep 1
rmmod /ramzswap && sleep 1
 
#insert ramzswap module and specify disksize
insmod /lib/modules/current/ramzswap.ko disksize_kb=65536 && sleep 1
 
#swapon ramzswap & swap-reset eMMC
swapon /dev/ramzswap0 && sleep 1
swapoff /dev/mmcblk0p3 && sleep 1 && swapon /dev/mmcblk0p3 && sleep 1
 
#vm changes
#/proc/sys/vm/dirty_ratio (default 40)
echo 10 > /proc/sys/vm/dirty_ratio
 
#dirty_background_ratio
echo 10 > /proc/sys/vm/dirty_background_ratio
 
#dirty_writeback_centisecs
echo 250 > /proc/sys/vm/dirty_writeback_centisecs
 
#/proc/sys/vm/dirty_expire_centiseconds (default 3000)
echo 1000 > /proc/sys/vm/dirty_expire_centisecs
 
#free space saved for large allocations, values below 256 cause insta-crash
#echo 1024 > /proc/sys/vm/min_free_kbytes
 
#'Normal' VM stuff
echo 100 > /proc/sys/vm/swappiness
echo 200 > /proc/sys/vm/vfs_cache_pressure
echo 0 > /proc/sys/vm/page-cluster
 
#Flash disc tuning
echo 32 > /sys/block/mmcblk0/queue/nr_requests
echo 32 > /sys/block/mmcblk1/queue/nr_requests
echo 0 > /sys/block/mmcblk0/queue/iosched/slice_idle
echo 0 > /sys/block/mmcblk1/queue/iosched/slice_idle
echo 32 > /sys/block/mmcblk0/queue/iosched/quantum
echo 32 > /sys/block/mmcblk1/queue/iosched/quantum
echo 125 > /sys/block/mmcblk0/queue/iosched/fifo_expire_sync
echo 125 > /sys/block/mmcblk1/queue/iosched/fifo_expire_sync
echo 250 > /sys/block/mmcblk0/queue/iosched/fifo_expire_async
echo 250 > /sys/block/mmcblk1/queue/iosched/fifo_expire_async
 
#display results
cat /proc/swaps

Making all this happen automatically


There is a package called swapset[2], it claims to setup swaps and the ramz module automatically. The author of this article has not used it and thus cannot vouch for it's effectiveness. Using swapset AND putting the above settings into swappolube would probably cause all of the above to work automatically.


N9/50

To be added by an ardent masochist.