diff --git a/docs/config/layout-osd.en.md b/docs/config/layout-osd.en.md index 5e795eb1..524b21d1 100644 --- a/docs/config/layout-osd.en.md +++ b/docs/config/layout-osd.en.md @@ -9,6 +9,7 @@ These parameters apply to OSDs, are fixed at the moment of OSD drive initialization and can't be changed after it without losing data. +- [meta_format](#meta_format) - [data_device](#data_device) - [meta_device](#meta_device) - [journal_device](#journal_device) @@ -27,6 +28,21 @@ initialization and can't be changed after it without losing data. - [data_csum_type](#data_csum_type) - [csum_block_size](#csum_block_size) +## meta_format + +- Type: integer +- Default: 3 + +OSD store implementation version and on-disk metadata format. + +Three versions are currently supported: 3, 2 and 1. +- 3 the new log-structured store, it's overall faster, has lower Write + Amplification, which may be even close to 1 (i.e. almost no extra writes) + if your SSDs support atomic writes (see [atomic_write_size](osd.en.md#atomic_write_size)). +- 2 is the old stable store from Vitastor 0.9-2.x. +- 1 is the same old store but with a legacy metadata format from Vitastor + versions to up 0.8.x, without any support for checksums. + ## data_device - Type: string diff --git a/docs/config/layout-osd.ru.md b/docs/config/layout-osd.ru.md index 51f0e3ba..1b40768f 100644 --- a/docs/config/layout-osd.ru.md +++ b/docs/config/layout-osd.ru.md @@ -10,6 +10,7 @@ дисковые параметры, задаются в момент инициализации дисков OSD и не могут быть изменены после этого без потери данных. +- [meta_format](#meta_format) - [data_device](#data_device) - [meta_device](#meta_device) - [journal_device](#journal_device) @@ -28,6 +29,23 @@ - [data_csum_type](#data_csum_type) - [csum_block_size](#csum_block_size) +## meta_format + +- Тип: целое число +- Значение по умолчанию: 3 + +Версия реализации дискового хранилища OSD и дискового формата метаданных. + +Поддерживаются три версии: 3, 2 и 1. +- 3 - новое лог-структурированное хранилище, в целом более быстрое, со + сниженным фактором амплификации записи, который может составлять около 1 + (то есть, практически без лишней служебной записи), если ваши SSD + поддерживают атомарную запись (см. [atomic_write_size](osd.ru.md#atomic_write_size)). +- 2 - старое стабильное хранилище из версий Vitastor 0.9-2.x. +- 1 - то же самое стабильное хранилище, но с ещё более старым форматом + метаданных из версий Vitastor до 0.8.x, без какой-либо поддержки + контрольных сумм. + ## data_device - Тип: строка diff --git a/docs/config/osd.en.md b/docs/config/osd.en.md index 9937185b..1676e85e 100644 --- a/docs/config/osd.en.md +++ b/docs/config/osd.en.md @@ -65,6 +65,8 @@ with an OSD restart or, for some of them, even without restarting by updating co - [allow_net_split](#allow_net_split) - [enable_pg_locks](#enable_pg_locks) - [pg_lock_retry_interval_ms](#pg_lock_retry_interval_ms) +- [atomic_write_size](#atomic_write_size) +- [use_atomic_flag](#use_atomic_flag) ## bind_address @@ -666,3 +668,33 @@ Use this parameter to enable or disable this function for all pools. - Default: 100 Retry interval for failed PG lock attempts. + +## atomic_write_size + +- Type: integer +- Default: 4096 + +Maximum data device atomic write size allowed for OSD to use. + +Only affects the new metadata store ([meta_format](layout-osd.en.md#meta_format)=3). + +Default value is auto-detected during OSD initialization from +`/sys/block/xx/queue/atomic_write_max_bytes` or assumed to be 4096 bytes +because all known disks support 4 KB atomic writes. + +Atomic writes allow to skip double data writes in replicated pools, thus +reducing Write Amplification and improving write performance up to 2 times. + +## use_atomic_flag + +- Type: boolean + +This option controls whether the Vitastor OSD uses RWF_ATOMIC write flag with atomic +writes. This flag is only supported on Linux kernel since 6.11. Atomic writes are +generally only safe to use with this flag because it tells the kernel to never fragment +write requests and also to check the write against the actual atomic write capabilities +of the device. + +This option is enabled by default when atomic_write_size is set to a value larger than 4 KB. +You can disable it if you're sure that your disks support atomic writes and you want to +bypass the Linux atomic write checks. diff --git a/docs/config/osd.ru.md b/docs/config/osd.ru.md index f3edb106..38e22028 100644 --- a/docs/config/osd.ru.md +++ b/docs/config/osd.ru.md @@ -66,6 +66,8 @@ - [allow_net_split](#allow_net_split) - [enable_pg_locks](#enable_pg_locks) - [pg_lock_retry_interval_ms](#pg_lock_retry_interval_ms) +- [atomic_write_size](#atomic_write_size) +- [use_atomic_flag](#use_atomic_flag) ## bind_address @@ -699,3 +701,35 @@ pg_minsize OSD во время переключений, что может по - Значение по умолчанию: 100 Интервал повтора неудачных попыток блокировки PG. + +## atomic_write_size + +- Тип: целое число +- Значение по умолчанию: 4096 + +Максимальный размер атомарной записи на диск данных, который OSD разрешено использовать. + +Затрагивает только новое хранилище ([meta_format](layout-osd.ru.md#meta_format)=3). + +Значение по умолчанию авто-определяется во время инициализации OSD из +`/sys/block/xx/queue/atomic_write_max_bytes` либо принимается равным 4096, +так как все известные диски поддерживают атомарную запись 4 КБ блоков. + +Атомарная запись позволяет не использовать двойную запись данных (в журнал и на +устройство данных) в реплицированных пулах и таким образом снижает амплификацию +записи (объём служебной записи на диск) и улучшает производительность записи +вплоть до 2-х кратного прироста. + +## use_atomic_flag + +- Тип: булево (да/нет) + +Данная опция контролирует использование Vitastor OSD флага RWF_ATOMIC при атомарной записи +блоков. Этот флаг поддерживается только в ядрах Linux начиная с 6.11. Атомарная запись +является безопасной только при использовании этого флага, так как он сообщает ядру о том, +что запрос записи нельзя фрагментировать и о том, что запрос нужно проверить на соответствие +реальным возможностям атомарной записи устройства. + +Опция включается по умолчанию, когда atomic_write_size устанавливается в значение больше 4 КБ. +Вы можете явно отключить её, если уверены, что ваши диски поддерживают атомарную запись и +хотите обойти проверки уровня ядра. diff --git a/docs/config/src/layout-osd.yml b/docs/config/src/layout-osd.yml index 061d9362..4a5d28bb 100644 --- a/docs/config/src/layout-osd.yml +++ b/docs/config/src/layout-osd.yml @@ -1,3 +1,28 @@ +- name: meta_format + type: int + default: 3 + info: | + OSD store implementation version and on-disk metadata format. + + Three versions are currently supported: 3, 2 and 1. + - 3 the new log-structured store, it's overall faster, has lower Write + Amplification, which may be even close to 1 (i.e. almost no extra writes) + if your SSDs support atomic writes (see [atomic_write_size](osd.en.md#atomic_write_size)). + - 2 is the old stable store from Vitastor 0.9-2.x. + - 1 is the same old store but with a legacy metadata format from Vitastor + versions to up 0.8.x, without any support for checksums. + info_ru: | + Версия реализации дискового хранилища OSD и дискового формата метаданных. + + Поддерживаются три версии: 3, 2 и 1. + - 3 - новое лог-структурированное хранилище, в целом более быстрое, со + сниженным фактором амплификации записи, который может составлять около 1 + (то есть, практически без лишней служебной записи), если ваши SSD + поддерживают атомарную запись (см. [atomic_write_size](osd.ru.md#atomic_write_size)). + - 2 - старое стабильное хранилище из версий Vitastor 0.9-2.x. + - 1 - то же самое стабильное хранилище, но с ещё более старым форматом + метаданных из версий Vitastor до 0.8.x, без какой-либо поддержки + контрольных сумм. - name: data_device type: string info: | diff --git a/docs/config/src/osd.yml b/docs/config/src/osd.yml index f474a1a9..1ea18769 100644 --- a/docs/config/src/osd.yml +++ b/docs/config/src/osd.yml @@ -801,3 +801,52 @@ default: 100 info: Retry interval for failed PG lock attempts. info_ru: Интервал повтора неудачных попыток блокировки PG. +- name: atomic_write_size + type: int + default: 4096 + info: | + Maximum data device atomic write size allowed for OSD to use. + + Only affects the new metadata store ([meta_format](layout-osd.en.md#meta_format)=3). + + Default value is auto-detected during OSD initialization from + `/sys/block/xx/queue/atomic_write_max_bytes` or assumed to be 4096 bytes + because all known disks support 4 KB atomic writes. + + Atomic writes allow to skip double data writes in replicated pools, thus + reducing Write Amplification and improving write performance up to 2 times. + info_ru: | + Максимальный размер атомарной записи на диск данных, который OSD разрешено использовать. + + Затрагивает только новое хранилище ([meta_format](layout-osd.ru.md#meta_format)=3). + + Значение по умолчанию авто-определяется во время инициализации OSD из + `/sys/block/xx/queue/atomic_write_max_bytes` либо принимается равным 4096, + так как все известные диски поддерживают атомарную запись 4 КБ блоков. + + Атомарная запись позволяет не использовать двойную запись данных (в журнал и на + устройство данных) в реплицированных пулах и таким образом снижает амплификацию + записи (объём служебной записи на диск) и улучшает производительность записи + вплоть до 2-х кратного прироста. +- name: use_atomic_flag + type: bool + info: | + This option controls whether the Vitastor OSD uses RWF_ATOMIC write flag with atomic + writes. This flag is only supported on Linux kernel since 6.11. Atomic writes are + generally only safe to use with this flag because it tells the kernel to never fragment + write requests and also to check the write against the actual atomic write capabilities + of the device. + + This option is enabled by default when atomic_write_size is set to a value larger than 4 KB. + You can disable it if you're sure that your disks support atomic writes and you want to + bypass the Linux atomic write checks. + info_ru: | + Данная опция контролирует использование Vitastor OSD флага RWF_ATOMIC при атомарной записи + блоков. Этот флаг поддерживается только в ядрах Linux начиная с 6.11. Атомарная запись + является безопасной только при использовании этого флага, так как он сообщает ядру о том, + что запрос записи нельзя фрагментировать и о том, что запрос нужно проверить на соответствие + реальным возможностям атомарной записи устройства. + + Опция включается по умолчанию, когда atomic_write_size устанавливается в значение больше 4 КБ. + Вы можете явно отключить её, если уверены, что ваши диски поддерживают атомарную запись и + хотите обойти проверки уровня ядра. diff --git a/docs/usage/disk.en.md b/docs/usage/disk.en.md index b2d5bfef..8a047415 100644 --- a/docs/usage/disk.en.md +++ b/docs/usage/disk.en.md @@ -51,6 +51,9 @@ Options (automatic mode): ``` --osd_per_disk Create OSDs on each disk (default 1) +--meta_format 3 + Metadata store version. 3 is the new log-structured store, 2 is the stable store + from Vitastor 0.9-2.x, 1 is the legacy store from Vitastor 0.6-0.8. --hybrid Prepare hybrid (HDD+SSD, NVMe+SATA or etc) OSDs using provided devices. By default, any passed SSDs will be used for journals and metadata, HDDs will be used for data, diff --git a/docs/usage/disk.ru.md b/docs/usage/disk.ru.md index ca3808c5..c9010a0c 100644 --- a/docs/usage/disk.ru.md +++ b/docs/usage/disk.ru.md @@ -50,6 +50,9 @@ vitastor-disk - инструмент командной строки для уп ``` --osd_per_disk Создавать по несколько () OSD на каждом диске (по умолчанию 1) +--meta_format 3 + Версия хранилища метаданных. 3 - новое лог-структурированное хранилище, + 2 - стабильное хранилище из Vitastor 0.9-2.x, 1 - старое хранилище из Vitastor 0.6-0.8. --hybrid Инициализировать гибридные (HDD+SSD, NVMe+SATA и т.п.) OSD на указанных дисках. По умолчанию, SSD будут использованы для журналов и метаданных, а HDD - для данных, diff --git a/src/disk_tool/disk_tool.cpp b/src/disk_tool/disk_tool.cpp index 95c23a11..61e1f280 100644 --- a/src/disk_tool/disk_tool.cpp +++ b/src/disk_tool/disk_tool.cpp @@ -26,6 +26,9 @@ static const char *help_text = " Options (automatic mode):\n" " --osd_per_disk \n" " Create OSDs on each disk (default 1)\n" + " --meta_format 3\n" + " Metadata store version. 3 is the new log-structured store, 2 is the stable store\n" + " from Vitastor 0.9-2.x, 1 is the legacy store from Vitastor 0.6-0.8.\n" " --hybrid\n" " Prepare hybrid (HDD+SSD, NVMe+SATA or etc) OSDs using provided devices. By default,\n" " any passed SSDs will be used for journals and metadata, HDDs will be used for data,\n" @@ -87,7 +90,8 @@ static const char *help_text = " inmemory_metadata, inmemory_journal, max_write_iodepth,\n" " min_flusher_count, max_flusher_count, journal_sector_buffer_count,\n" " journal_no_same_sector_overwrites, throttle_small_writes, throttle_target_iops,\n" - " throttle_target_mbs, throttle_target_parallelism, throttle_threshold_us.\n" + " throttle_target_mbs, throttle_target_parallelism, throttle_threshold_us,\n" + " atomic_write_size, use_atomic_flag.\n" "\n" "vitastor-disk upgrade-simple \n" " Upgrade an OSD created by old (0.7.1 and older) make-osd.sh or make-osd-hybrid.js scripts.\n" diff --git a/src/disk_tool/disk_tool_prepare.cpp b/src/disk_tool/disk_tool_prepare.cpp index 92bcd1e6..d8f58eb5 100644 --- a/src/disk_tool/disk_tool_prepare.cpp +++ b/src/disk_tool/disk_tool_prepare.cpp @@ -91,6 +91,12 @@ int disk_tool_t::prepare_one(std::map options, int is_ options["use_atomic_flag"] = "1"; } } + else if (options.find("use_atomic_flag") == options.end() && + parse_size(options["atomic_write_size"]) > 4096) + { + fprintf(stderr, "Atomic writes larger than 4 KB are enabled manually, enabling use_atomic_flag too.\n"); + options["use_atomic_flag"] = "1"; + } for (auto dev: std::vector{"data", "meta", "journal"}) { if (options[dev+"_device"] != "" && options["disable_"+dev+"_fsync"] == "auto")