123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245 |
- zram: Compressed RAM based block devices
- ----------------------------------------
- * Introduction
- The zram module creates RAM based block devices named /dev/zram<id>
- (<id> = 0, 1, ...). Pages written to these disks are compressed and stored
- in memory itself. These disks allow very fast I/O and compression provides
- good amounts of memory savings. Some of the usecases include /tmp storage,
- use as swap disks, various caches under /var and maybe many more :)
- Statistics for individual zram devices are exported through sysfs nodes at
- /sys/block/zram<id>/
- * Usage
- There are several ways to configure and manage zram device(-s):
- a) using zram and zram_control sysfs attributes
- b) using zramctl utility, provided by util-linux (util-linux@vger.kernel.org).
- In this document we will describe only 'manual' zram configuration steps,
- IOW, zram and zram_control sysfs attributes.
- In order to get a better idea about zramctl please consult util-linux
- documentation, zramctl man-page or `zramctl --help'. Please be informed
- that zram maintainers do not develop/maintain util-linux or zramctl, should
- you have any questions please contact util-linux@vger.kernel.org
- Following shows a typical sequence of steps for using zram.
- WARNING
- =======
- For the sake of simplicity we skip error checking parts in most of the
- examples below. However, it is your sole responsibility to handle errors.
- zram sysfs attributes always return negative values in case of errors.
- The list of possible return codes:
- -EBUSY -- an attempt to modify an attribute that cannot be changed once
- the device has been initialised. Please reset device first;
- -ENOMEM -- zram was not able to allocate enough memory to fulfil your
- needs;
- -EINVAL -- invalid input has been provided.
- If you use 'echo', the returned value that is changed by 'echo' utility,
- and, in general case, something like:
- echo 3 > /sys/block/zram0/max_comp_streams
- if [ $? -ne 0 ];
- handle_error
- fi
- should suffice.
- 1) Load Module:
- modprobe zram num_devices=4
- This creates 4 devices: /dev/zram{0,1,2,3}
- num_devices parameter is optional and tells zram how many devices should be
- pre-created. Default: 1.
- 2) Set max number of compression streams
- Compression backend may use up to max_comp_streams compression streams,
- thus allowing up to max_comp_streams concurrent compression operations.
- By default, compression backend uses single compression stream.
- Examples:
- #show max compression streams number
- cat /sys/block/zram0/max_comp_streams
- #set max compression streams number to 3
- echo 3 > /sys/block/zram0/max_comp_streams
- Note:
- In order to enable compression backend's multi stream support max_comp_streams
- must be initially set to desired concurrency level before ZRAM device
- initialisation. Once the device initialised as a single stream compression
- backend (max_comp_streams equals to 1), you will see error if you try to change
- the value of max_comp_streams because single stream compression backend
- implemented as a special case by lock overhead issue and does not support
- dynamic max_comp_streams. Only multi stream backend supports dynamic
- max_comp_streams adjustment.
- 3) Select compression algorithm
- Using comp_algorithm device attribute one can see available and
- currently selected (shown in square brackets) compression algorithms,
- change selected compression algorithm (once the device is initialised
- there is no way to change compression algorithm).
- Examples:
- #show supported compression algorithms
- cat /sys/block/zram0/comp_algorithm
- lzo [lz4]
- #select lzo compression algorithm
- echo lzo > /sys/block/zram0/comp_algorithm
- 4) Set Disksize
- Set disk size by writing the value to sysfs node 'disksize'.
- The value can be either in bytes or you can use mem suffixes.
- Examples:
- # Initialize /dev/zram0 with 50MB disksize
- echo $((50*1024*1024)) > /sys/block/zram0/disksize
- # Using mem suffixes
- echo 256K > /sys/block/zram0/disksize
- echo 512M > /sys/block/zram0/disksize
- echo 1G > /sys/block/zram0/disksize
- Note:
- There is little point creating a zram of greater than twice the size of memory
- since we expect a 2:1 compression ratio. Note that zram uses about 0.1% of the
- size of the disk when not in use so a huge zram is wasteful.
- 5) Set memory limit: Optional
- Set memory limit by writing the value to sysfs node 'mem_limit'.
- The value can be either in bytes or you can use mem suffixes.
- In addition, you could change the value in runtime.
- Examples:
- # limit /dev/zram0 with 50MB memory
- echo $((50*1024*1024)) > /sys/block/zram0/mem_limit
- # Using mem suffixes
- echo 256K > /sys/block/zram0/mem_limit
- echo 512M > /sys/block/zram0/mem_limit
- echo 1G > /sys/block/zram0/mem_limit
- # To disable memory limit
- echo 0 > /sys/block/zram0/mem_limit
- 6) Activate:
- mkswap /dev/zram0
- swapon /dev/zram0
- mkfs.ext4 /dev/zram1
- mount /dev/zram1 /tmp
- 7) Add/remove zram devices
- zram provides a control interface, which enables dynamic (on-demand) device
- addition and removal.
- In order to add a new /dev/zramX device, perform read operation on hot_add
- attribute. This will return either new device's device id (meaning that you
- can use /dev/zram<id>) or error code.
- Example:
- cat /sys/class/zram-control/hot_add
- 1
- To remove the existing /dev/zramX device (where X is a device id)
- execute
- echo X > /sys/class/zram-control/hot_remove
- 8) Stats:
- Per-device statistics are exported as various nodes under /sys/block/zram<id>/
- A brief description of exported device attributes. For more details please
- read Documentation/ABI/testing/sysfs-block-zram.
- Name access description
- ---- ------ -----------
- disksize RW show and set the device's disk size
- initstate RO shows the initialization state of the device
- reset WO trigger device reset
- num_reads RO the number of reads
- failed_reads RO the number of failed reads
- num_write RO the number of writes
- failed_writes RO the number of failed writes
- invalid_io RO the number of non-page-size-aligned I/O requests
- max_comp_streams RW the number of possible concurrent compress operations
- comp_algorithm RW show and change the compression algorithm
- notify_free RO the number of notifications to free pages (either
- slot free notifications or REQ_DISCARD requests)
- zero_pages RO the number of zero filled pages written to this disk
- orig_data_size RO uncompressed size of data stored in this disk
- compr_data_size RO compressed size of data stored in this disk
- mem_used_total RO the amount of memory allocated for this disk
- mem_used_max RW the maximum amount of memory zram have consumed to
- store the data (to reset this counter to the actual
- current value, write 1 to this attribute)
- mem_limit RW the maximum amount of memory ZRAM can use to store
- the compressed data
- pages_compacted RO the number of pages freed during compaction
- (available only via zram<id>/mm_stat node)
- compact WO trigger memory compaction
- WARNING
- =======
- per-stat sysfs attributes are considered to be deprecated.
- The basic strategy is:
- -- the existing RW nodes will be downgraded to WO nodes (in linux 4.11)
- -- deprecated RO sysfs nodes will eventually be removed (in linux 4.11)
- The list of deprecated attributes can be found here:
- Documentation/ABI/obsolete/sysfs-block-zram
- Basically, every attribute that has its own read accessible sysfs node
- (e.g. num_reads) *AND* is accessible via one of the stat files (zram<id>/stat
- or zram<id>/io_stat or zram<id>/mm_stat) is considered to be deprecated.
- User space is advised to use the following files to read the device statistics.
- File /sys/block/zram<id>/stat
- Represents block layer statistics. Read Documentation/block/stat.txt for
- details.
- File /sys/block/zram<id>/io_stat
- The stat file represents device's I/O statistics not accounted by block
- layer and, thus, not available in zram<id>/stat file. It consists of a
- single line of text and contains the following stats separated by
- whitespace:
- failed_reads
- failed_writes
- invalid_io
- notify_free
- File /sys/block/zram<id>/mm_stat
- The stat file represents device's mm statistics. It consists of a single
- line of text and contains the following stats separated by whitespace:
- orig_data_size
- compr_data_size
- mem_used_total
- mem_limit
- mem_used_max
- zero_pages
- num_migrated
- 9) Deactivate:
- swapoff /dev/zram0
- umount /dev/zram1
- 10) Reset:
- Write any positive value to 'reset' sysfs node
- echo 1 > /sys/block/zram0/reset
- echo 1 > /sys/block/zram1/reset
- This frees all the memory allocated for the given device and
- resets the disksize to zero. You must set the disksize again
- before reusing the device.
- Nitin Gupta
- ngupta@vflare.org
|