Ниже будет описан тюнинг самой mysql + OS-специфический. Тюнинг будет рассмотрен только для движка InnoDB.
mysql
Обязательно разнести базу и логи (innodb_log_group_home_dir) по разным датасетам (дискам). В идеале вынести на отдельный датасет и tmp_dir для mysql.
Установим правильные размеры recordsize для базы (database/mysql) и журналов (redolog):
# zfs set recordsize=16K database/mysql
# zfs set recordsize=128K redolog
Примечание:
Для myisaam – 8K
Тюним буфер и кеш:
# zfs set primarycache=metadata database/mysql
# zfs set primarycache=metadata redolog
# zfs set secondarycache=none database/mysql
# zfs set secondarycache=none redolog
# zfs set logbias=throughput database/mysql
# zfs set logbias=throughput redolog
Для FreeBSD можно еще
# zfs set redundant_metadata=most database/mysql
# zfs set redundant_metadata=most redolog
Прочий тюнинг zfs:
# zfs set atime=off database/mysql
# zfs set atime=off redolog
# zfs set compression=on database/mysql
# zfs set compression=on redolog
my.cnf:
innodb_flush_log_at_trx_commit = 2
innodb_file_format=barracuda
innodb_flush_method=O_DSYNC
skip-innodb_doublewrite
Последняя строка отключает буфер двойной записи (то есть дополнительной записи со стороны mysql). Это сделано для того, что бы использовать транзакционный журнал на стороне ФС.
Можно дополнительно отключить подсчёт CRC:
innodb_checksum_algorithm = none
PostgreSQL
Обязательно разнести базу и логи (pg_xlog) по разным датасетам (дискам).
Установим правильные размеры recordsize для базы (database/postgresql)
# zfs set recordsize=8K database/mysql
Тюним буфер и кеш:
# zfs set primarycache=metadata database/postgresql
# zfs set logbias=throughput database/postgresql
Для FreeBSD можно еще
# zfs set redundant_metadata=most database/postgresql
FreeBSD
/boot/loader.conf:
vfs.zfs.prefetch_disable=1
vfs.zfs.cache_flush_disable=1
Обязательно ограничить ARC кешь (не больше половины всей оперативной памяти):
vm.kmem_size_max=3G
Solaris
/etc/system:
set zfs:zfs_prefetch_disable=1
set zfs:zfs_nocacheflush=1
Обязательно ограничить ARC кешь (не больше половины всей оперативной памяти):
set zfs:zfs_arc_max=12884901888
Разное.
Очень неплохо расписано различие O_DIRECT / O_DSYNC здесь
Linux (ext4)
Здесь в принципе общие рекомендации:
barrier=0
noatime, nodiratime
data=writeback
commit=600
Возможно с data=journal (включения транзакционного лога) будет быстрее. Нужно экспериментировать.