91 lines
3.5 KiB
Markdown
91 lines
3.5 KiB
Markdown
# zpool and dataset creation
|
|
## zpool
|
|
This role can automatically create any number of zpool, to do so, you must specify at least their names and geometry with the `zfs_zpools` dictionary , for example:
|
|
```
|
|
zfs_zpools:
|
|
- name: "nvme"
|
|
geometry: "mirror nvme0n1 nvme1n1"
|
|
```
|
|
This will create a zpool named `nvme` in mirror mode with the 2 drives `nvme0n1` and `nvme1n1`. This will also set the following default option for the zpool creation:
|
|
```
|
|
-O compression=lz4 -O atime=off -O xattr=sa -O mountpoint=none -O acltype=posixacl
|
|
```
|
|
If you want different options, you can set them by adding the keyword `options`, for example:
|
|
```
|
|
zfs_zpools:
|
|
- name: "nvme"
|
|
geometry: "mirror nvme0n1 nvme1n1"
|
|
options: "-O compression=lz4 -O atime=off -O xattr=sa -O mountpoint=none -O acltype=posixacl"
|
|
```
|
|
After the zpool has been created, this role will export it and import it back with the `-d /dev/disk/by-id` option to use the device id for future imports.
|
|
## dataset
|
|
This role can also create any number of dataset with any zfs properties. The syntax is:
|
|
```
|
|
zfs_dataset_list:
|
|
- name: "tank/something"
|
|
properties:
|
|
mountpoint: "/media/something"
|
|
recordsize: "1M"
|
|
- name: "tank/something_else"
|
|
```
|
|
The previous example will simply result in the following zfs commands:
|
|
```
|
|
zfs create tank/something -o mountpoint=/media/something -o recordsize=1M
|
|
zfs create tank/something_else
|
|
```
|
|
# ARC settings
|
|
## Size
|
|
You can adjust the maximum size of the ARC, which is the maximum amount of memory that ZFS can use at any given time.
|
|
|
|
The default is 1/8 of the total memory. You can adjust this setting by changing the variable *max_arc_size*, since ansible uses the variable *ansible_memtotal_mb* for the host memory, you have to adjust the variable like this to get the amount of RAM that you want for ZoL:
|
|
```
|
|
# 1/2 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 524288 }}"
|
|
# 40% of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 419430 }}"
|
|
# 1/3 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 349525 }}"
|
|
# 1/4 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 262144 }}"
|
|
# 1/5 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 209715 }}"
|
|
# 1/6 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 174763 }}"
|
|
# 1/7 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 149797 }}"
|
|
# 1/8 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 131072 }}"
|
|
# 1/16 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 65536 }}"
|
|
# 1/32 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 32768 }}"
|
|
# 1/64 of RAM
|
|
max_arc_size: "{{ ansible_memtotal_mb * 16384 }}"
|
|
```
|
|
This is the same thing as *max_arc_size: {{ ansible_memtotal_mb * 1024 * 1024 / [RATIO] }}*, for example:
|
|
```
|
|
{{ ansible_memtotal_mb * 1024 * 1024 / 4 }} = {{ ansible_memtotal_mb * 262144 }}
|
|
```
|
|
## meta and dnode percent limit
|
|
By default, zfs set the the zfs_arc_dnode_limit_percent to 10% and the zfs_arc_meta_limit_percent to 75%.
|
|
|
|
From experience, most of the time it doesn't make any sense to limit ZFS for either values, so they are both set to 95% of the maximum memory in this role.
|
|
|
|
You can adjust both parameters with those values if needed:
|
|
```
|
|
zfs_arc_meta_limit_percent: 95
|
|
zfs_arc_dnode_limit_percent: 95
|
|
```
|
|
# ZFS tunnable
|
|
Currently, you can set the "zfs_txg_timeout" module option with this value:
|
|
```
|
|
zfs_txg_timeout: n
|
|
```
|
|
Where n is a number, in second (the default is 5).
|
|
# Automatic scrub deactivation
|
|
On Ubuntu, a crontab exists to run a scrub the second Sunday of every month at midnight. This disrupt the normal server usage.
|
|
|
|
By default this role deactivate this scrub, you can let it active by setting this variable:
|
|
```
|
|
zfs_auto_scrub: True
|
|
```
|