From b4e91407550ea70cea3de389a67e6ca496eac90c Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 13 Jul 2024 00:45:53 +0300 Subject: [PATCH] Add defrag docs, fix trace message --- docs/usage/nfs.en.md | 37 +++++++++++++++++++++++++++++++---- docs/usage/nfs.ru.md | 41 ++++++++++++++++++++++++++++++++++----- src/nfs/nfs_kv_defrag.cpp | 6 ++++-- src/nfs/nfs_proxy.cpp | 10 +++++++--- 4 files changed, 80 insertions(+), 14 deletions(-) diff --git a/docs/usage/nfs.en.md b/docs/usage/nfs.en.md index 5da9ab27..fcfd372d 100644 --- a/docs/usage/nfs.en.md +++ b/docs/usage/nfs.en.md @@ -11,6 +11,8 @@ Vitastor has two file system implementations. Both can be used via `vitastor-nfs Commands: - [mount](#mount) - [start](#start) +- [upgrade](#upgrade) +- [defrag](#defrag) ## Pseudo-FS @@ -86,10 +88,6 @@ POSIX features currently not implemented in VitastorFS: - Modification time (`mtime`) is updated lazily every second (like `-o lazytime`) Other notable missing features which should be addressed in the future: -- Defragmentation of "shared" inodes. Files smaller than pool object size (block_size - multiplied by data part count if pool is EC) are internally stored in large block - volumes sequentially, one after another, and leave garbage after deleting or resizing. - Defragmentator will be implemented to collect this garbage. - Inode ID reuse. Currently inode IDs always grow, the limit is 2^48 inodes, so in theory you may hit it if you create and delete a very large number of files - Compaction of the key-value B-Tree. Current implementation never merges or deletes @@ -139,6 +137,37 @@ Start network NFS server. Options: | `--port ` | use port \ for NFS services (default is 2049) | | `--portmap 0` | do not listen on port 111 (portmap/rpcbind, requires root) | +### upgrade + +`vitastor-nfs --fs upgrade` + +Upgrade FS metadata. Can be run online, but server(s) should be restarted after upgrade. + +### defrag + +`vitastor-nfs --fs defrag [OPTIONS] [--dry-run]` + +Defragment volumes used for small file storage having more than \ % +of data removed. Can be run online. + +In VitastorFS, small files are stored in large "volumes" / "shared inodes" one +after another. When you delete or extend such files, they are moved and garbage is left +behind. Defragmentation removes garbage and moves data still in use to new volumes. + +Options: + +| | | +|--------------------------|------------------------------------------------------------------------ | +| --volume_untouched 86400 | Defragment volumes last appended to at least this number of seconds ago | +| --defrag_percent 50 | Defragment volumes with at least this % of removed data | +| --defrag_block_count 16 | Read this number of pool blocks at once during defrag | +| --defrag_iodepth 16 | Move up to this number of files in parallel during defrag | +| --trace | Print verbose defragmentation status | +| --dry-run | Skip modifications, only print status | +| --recalc-stats | Recalculate all volume statistics | +| --include-empty | Include old and empty volumes; make sure to restart NFS servers before using it | +| --no-rm | Move, but do not delete data | + ## Common options | | | diff --git a/docs/usage/nfs.ru.md b/docs/usage/nfs.ru.md index f4ab4817..a5d9ca69 100644 --- a/docs/usage/nfs.ru.md +++ b/docs/usage/nfs.ru.md @@ -11,6 +11,8 @@ Команды: - [mount](#mount) - [start](#start) +- [upgrade](#upgrade) +- [defrag](#defrag) ## Псевдо-ФС @@ -88,11 +90,6 @@ JSON-формате :-). Для инспекции содержимого БД - Времена модификации (`mtime`) отслеживаются асинхронно (как будто ФС смонтирована с `-o lazytime`) Другие недостающие функции, которые нужно добавить в будущем: -- Дефрагментация "общих инодов". На уровне реализации ФС файлы, меньшие, чем размер - объекта пула (block_size умножить на число частей данных, если пул EC), - упаковываются друг за другом в большие "общие" иноды/тома. Если такие файлы удалять - или увеличивать, они перемещаются и оставляют за собой "мусор", вот тут-то и нужен - дефрагментатор. - Переиспользование номеров инодов. В текущей реализации номера инодов всё время увеличиваются, так что в теории вы можете упереться в лимит, если насоздаёте и наудаляете больше, чем 2^48 файлов. @@ -145,6 +142,40 @@ JSON-формате :-). Для инспекции содержимого БД | `--port ` | использовать порт \ для NFS-сервисов (по умолчанию 2049) | | `--portmap 0` | отключить сервис portmap/rpcbind на порту 111 (по умолчанию включён и требует root привилегий) | +### upgrade + +`vitastor-nfs --fs upgrade` + +Обновить метаданные ФС. Можно запускать онлайн (при запущенных серверах NFS), но после выполнения их всё +же желательно перезапустить. + +### defrag + +`vitastor-nfs --fs defrag [OPTIONS] [--dry-run]` + +Дефрагментировать тома, используемые для хранения мелких файлов, в которых более, чем + процентов данных удалено. Можно запускать онлайн. + +На уровне реализации ФС файлы, меньшие, чем размер объекта пула (block_size умножить на число +частей данных, если пул EC), упаковываются друг за другом в большие "тома" / "общие иноды". +Когда такие файлы удаляются или увеличиваются, они перемещаются и оставляют за собой "мусор". + +При дефрагментации мусор удаляется, а всё ещё используемые данные перемещаются в новые тома. + +Опции: + +| | | +|--------------------------|------------------------------------------------------------------------ | +| --volume_untouched 86400 | Дефрагментировать только тома, в которые уже не писали это число секунд | +| --defrag_percent 50 | Дефрагментировать только тома, в которых этот % данных удалён | +| --defrag_block_count 16 | Читать это количество блоков пула за один раз | +| --defrag_iodepth 16 | Перемещать одновременно до этого числа файлов | +| --trace | Печатать детальную статистику дефрагментации | +| --dry-run | Не производить никаких изменений, только описать выполняемые действия | +| --recalc-stats | Пересчитать и сохранить статистику всех томов | +| --include-empty | Дефрагментировать старые и пустые тома; обязательно перезапустите NFS-сервера после использования этой опции | +| --no-rm | Перемещать, но не удалять данные | + ## Общие опции | | | diff --git a/src/nfs/nfs_kv_defrag.cpp b/src/nfs/nfs_kv_defrag.cpp index ad36234d..d049dd6f 100644 --- a/src/nfs/nfs_kv_defrag.cpp +++ b/src/nfs/nfs_kv_defrag.cpp @@ -139,8 +139,10 @@ void kv_fs_defrag_t::handle_read() { fprintf( stderr, was_moved - ? "Moved inode 0x%jx (%ju bytes) from volume 0x%jx offset 0x%ju\n" - : "Inode 0x%jx (%ju bytes) data in volume 0x%jx at offset 0x%ju is unused", + ? (dry_run + ? "In use inode 0x%jx (%ju bytes) in volume 0x%jx at offset 0x%jx\n" + : "Moved inode 0x%jx (%ju bytes) in volume 0x%jx at offset 0x%jx\n") + : "Unused inode 0x%jx (%ju bytes) in volume 0x%jx at offset 0x%jx\n", ino, alloc, shared_ino, shared_offset ); } diff --git a/src/nfs/nfs_proxy.cpp b/src/nfs/nfs_proxy.cpp index 215e28f5..01718440 100644 --- a/src/nfs/nfs_proxy.cpp +++ b/src/nfs/nfs_proxy.cpp @@ -69,12 +69,16 @@ static const char* help_text = " --portmap 0 do not listen on port 111 (portmap/rpcbind, requires root)\n" "\n" "vitastor-nfs --fs upgrade\n" - " Upgrade FS metadata. Can be run online, but server should be restarted\n" + " Upgrade FS metadata. Can be run online, but server(s) should be restarted\n" " after upgrade.\n" "\n" "vitastor-nfs --fs defrag [OPTIONS] [--dry-run]\n" - " Defragment volumes used for small file storage having more than\n" - " %% of data removed. Can be run online. Options:\n" + " Defragment volumes used for small file storage having more than %%\n" + " of data removed. Can be run online.\n" + " In VitastorFS, small files are stored in large \"volumes\" / \"shared inodes\" one\n" + " after another. When you delete or extend such files, they are moved and garbage is left\n" + " behind. Defragmentation removes garbage and moves data still in use to new volumes.\n" + " Options:\n" " --volume_untouched 86400\n" " Defragment volumes last appended to at least this number of seconds ago\n" " --defrag_percent 50\n"