public inbox for pbs-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification
@ 2025-11-13  9:31 Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 1/3] pbs-api-types: add schema for {worker, read, verify}-threads Nicolas Frey
                   ` (15 more replies)
  0 siblings, 16 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

This patch series aims to expand on Dominik's series [0] written for
pbs 3, parallelizing chunk reads in `VerifyWorker` using a seperate
thread pool from the verification.

The number of threads was previously hard-coded, but is now
configurable via the API and GUI with new properties called
`{read,verify}-threads`, similarly to tape backups.

The number of threads should also be configurable through tuning
options or datastore config (as discussed by Chris & Thomas on list),
which can be added in a follow up patch series.

In my local tests I measured the following speed difference:
verified a single snapshot with ~32 GiB (4x the RAM size) with 4
cores (just changing the read threads)

1 thread:    ~440MiB/s
2 threads:   ~780MiB/s
4 threads:   ~1140MiB/s

[0] https://lore.proxmox.com/pbs-devel/20250707132706.2854973-1-d.csapak@proxmox.com/#t

Changes since v3, thanks Chris!:
* correct the ordering of patches
* move thread schemas into jobs.rs, rename them and add more specific
  descriptions
* add api schema for {read,verify}-threads in backup manager
* add doc for new parameters
* rebase

Changes since v2:
* split move to parallel handler into 2 seperate commits
* add constructor to `IndexVerifyState` and clean up nits

Changes since v1, thanks to Chris:
* define dedicated schema for {worker,read,verify}-threads
* rebase proxmox-backup
* introduce new state struct `IndexVerifyState` to reduce the amount
  of Arc clones and overall better bundling
* adjust update endpoint and UI to the new properties

proxmox:

Nicolas Frey (3):
  pbs-api-types: add schema for {worker,read,verify}-threads
  pbs-api-types: jobs: add {read,verify}-threads to
    VerificationJobConfig
  pbs-api-types: use worker-threads schema for TapeBackupJobSetup

 pbs-api-types/src/jobs.rs | 41 ++++++++++++++++++++++++++++++++++-----
 1 file changed, 36 insertions(+), 5 deletions(-)


proxmox-backup:

Nicolas Frey (9):
  verify: correct typo in comment
  verify: introduce new state struct
  verify: refactor into associated functions to use new state struct
  verify: move chunk loading into parallel handler
  verify: determine the number of threads to use with
    {read,verify}-threads
  verify: add {read,verify}-threads to update endpoint
  verify: add {read,verify}-threads to api schema in backup manager
  ui: verify: add option to set number of threads for job
  docs: verify: document {read,verify}-threads and update screenshot

 .../pbs-gui-datastore-verifyjob-add.png       | Bin 15455 -> 41433 bytes
 docs/maintenance.rst                          |  11 +-
 src/api2/admin/datastore.rs                   |  16 +-
 src/api2/backup/environment.rs                |   4 +-
 src/api2/config/verify.rs                     |  16 ++
 src/backup/verify.rs                          | 171 +++++++++++-------
 src/bin/proxmox-backup-manager.rs             |  11 +-
 src/server/verify_job.rs                      |   7 +-
 www/window/VerifyAll.js                       |  18 ++
 www/window/VerifyJobEdit.js                   |  24 +++
 10 files changed, 210 insertions(+), 68 deletions(-)


Summary over all repositories:
  11 files changed, 246 insertions(+), 73 deletions(-)

-- 
Generated by git-murpp 0.8.1

_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox v4 1/3] pbs-api-types: add schema for {worker, read, verify}-threads
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 2/3] pbs-api-types: jobs: add {read, verify}-threads to VerificationJobConfig Nicolas Frey
                   ` (14 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

Add seperate schemas for read and verify thread count to use in
chunk verification. Also add worker-threads for use in
`TapeBackupJobSetup`.

Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 pbs-api-types/src/jobs.rs | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs
index 4dbbef2b..75e20992 100644
--- a/pbs-api-types/src/jobs.rs
+++ b/pbs-api-types/src/jobs.rs
@@ -64,6 +64,27 @@ pub const REMOVE_VANISHED_BACKUPS_SCHEMA: Schema = BooleanSchema::new(
 .default(false)
 .schema();
 
+const fn threads_schema(description: &'static str, default: i64) -> Schema {
+    IntegerSchema::new(description)
+        .minimum(1)
+        .maximum(32)
+        .default(default)
+        .schema()
+}
+
+pub const TAPE_JOB_THREADS_SCHEMA: Schema =
+    threads_schema("The number of threads to use for the tape backup job.", 1);
+
+pub const VERIFY_JOB_READ_THREADS_SCHEMA: Schema = threads_schema(
+    "The number of threads to use for reading chunks in verify job.",
+    1,
+);
+
+pub const VERIFY_JOB_VERIFY_THREADS_SCHEMA: Schema = threads_schema(
+    "The number of threads to use for verifying chunks in verify job.",
+    4,
+);
+
 #[api(
     properties: {
         "next-run": {
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox v4 2/3] pbs-api-types: jobs: add {read, verify}-threads to VerificationJobConfig
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 1/3] pbs-api-types: add schema for {worker, read, verify}-threads Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 3/3] pbs-api-types: use worker-threads schema for TapeBackupJobSetup Nicolas Frey
                   ` (13 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

controls the number of parallel threads to read/verify chunks
similarly to tape backup job `worker-threads`

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 pbs-api-types/src/jobs.rs | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs
index 75e20992..12e1f6c4 100644
--- a/pbs-api-types/src/jobs.rs
+++ b/pbs-api-types/src/jobs.rs
@@ -224,6 +224,14 @@ pub const VERIFICATION_OUTDATED_AFTER_SCHEMA: Schema =
             optional: true,
             schema: crate::NS_MAX_DEPTH_SCHEMA,
         },
+        "read-threads": {
+            schema: VERIFY_JOB_READ_THREADS_SCHEMA,
+            optional: true,
+        },
+        "verify-threads": {
+            schema: VERIFY_JOB_VERIFY_THREADS_SCHEMA,
+            optional: true,
+        },
     }
 )]
 #[derive(Serialize, Deserialize, Updater, Clone, PartialEq)]
@@ -254,6 +262,12 @@ pub struct VerificationJobConfig {
     /// how deep the verify should go from the `ns` level downwards. Passing 0 verifies only the
     /// snapshots on the same level as the passed `ns`, or the datastore root if none.
     pub max_depth: Option<usize>,
+    /// The number of read threads to use for the job.
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub read_threads: Option<usize>,
+    /// The number of verification threads to use for the job.
+    #[serde(skip_serializing_if = "Option::is_none")]
+    pub verify_threads: Option<usize>,
 }
 
 impl VerificationJobConfig {
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox v4 3/3] pbs-api-types: use worker-threads schema for TapeBackupJobSetup
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 1/3] pbs-api-types: add schema for {worker, read, verify}-threads Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 2/3] pbs-api-types: jobs: add {read, verify}-threads to VerificationJobConfig Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/9] verify: correct typo in comment Nicolas Frey
                   ` (12 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

use new worker-threads schema

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 pbs-api-types/src/jobs.rs | 6 +-----
 1 file changed, 1 insertion(+), 5 deletions(-)

diff --git a/pbs-api-types/src/jobs.rs b/pbs-api-types/src/jobs.rs
index 12e1f6c4..a8d5a657 100644
--- a/pbs-api-types/src/jobs.rs
+++ b/pbs-api-types/src/jobs.rs
@@ -342,11 +342,8 @@ pub struct VerificationJobStatus {
             optional: true,
         },
         "worker-threads": {
-            type: Integer,
+            schema: TAPE_JOB_THREADS_SCHEMA,
             optional: true,
-            minimum: 1,
-            maximum: 32,
-            default: 1,
         },
     }
 )]
@@ -374,7 +371,6 @@ pub struct TapeBackupJobSetup {
     pub ns: Option<BackupNamespace>,
     #[serde(skip_serializing_if = "Option::is_none", default)]
     pub max_depth: Option<usize>,
-    /// Set the number of worker threads to use for the job
     #[serde(skip_serializing_if = "Option::is_none")]
     pub worker_threads: Option<u64>,
 }
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 1/9] verify: correct typo in comment
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (2 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 3/3] pbs-api-types: use worker-threads schema for TapeBackupJobSetup Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/9] verify: introduce new state struct Nicolas Frey
                   ` (11 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/api2/admin/datastore.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 6e66b5cf..2d70e997 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -688,7 +688,7 @@ pub async fn status(
 )]
 /// Verify backups.
 ///
-/// This function can verify a single backup snapshot, all backup from a backup group,
+/// This function can verify a single backup snapshot, all backups from a backup group,
 /// or all backups in the datastore.
 #[allow(clippy::too_many_arguments)]
 pub fn verify(
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 2/9] verify: introduce new state struct
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (3 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/9] verify: correct typo in comment Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/9] verify: refactor into associated functions to use " Nicolas Frey
                   ` (10 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

to prepare for better bundling when introducing parallel chunk loading

Suggested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/backup/verify.rs | 30 +++++++++++++++++++++++++++++-
 1 file changed, 29 insertions(+), 1 deletion(-)

diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index 2871f1a6..e8ea49b2 100644
--- a/src/backup/verify.rs
+++ b/src/backup/verify.rs
@@ -1,6 +1,6 @@
 use pbs_config::BackupLockGuard;
 use std::collections::HashSet;
-use std::sync::atomic::{AtomicUsize, Ordering};
+use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering};
 use std::sync::{Arc, Mutex};
 use std::time::Instant;
 
@@ -34,6 +34,34 @@ pub struct VerifyWorker {
     backend: DatastoreBackend,
 }
 
+struct IndexVerifyState {
+    read_bytes: AtomicU64,
+    decoded_bytes: AtomicU64,
+    errors: AtomicUsize,
+    datastore: Arc<DataStore>,
+    corrupt_chunks: Arc<Mutex<HashSet<[u8; 32]>>>,
+    verified_chunks: Arc<Mutex<HashSet<[u8; 32]>>>,
+    start_time: Instant,
+}
+
+impl IndexVerifyState {
+    fn new(
+        datastore: &Arc<DataStore>,
+        corrupt_chunks: &Arc<Mutex<HashSet<[u8; 32]>>>,
+        verified_chunks: &Arc<Mutex<HashSet<[u8; 32]>>>,
+    ) -> Self {
+        Self {
+            read_bytes: AtomicU64::new(0),
+            decoded_bytes: AtomicU64::new(0),
+            errors: AtomicUsize::new(0),
+            datastore: Arc::clone(datastore),
+            corrupt_chunks: Arc::clone(corrupt_chunks),
+            verified_chunks: Arc::clone(verified_chunks),
+            start_time: Instant::now(),
+        }
+    }
+}
+
 impl VerifyWorker {
     /// Creates a new VerifyWorker for a given task worker and datastore.
     pub fn new(
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 3/9] verify: refactor into associated functions to use new state struct
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (4 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/9] verify: introduce new state struct Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 4/9] verify: move chunk loading into parallel handler Nicolas Frey
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

bundles nicely into one struct to pass around, to prepare for parallel
chunk loading.

Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/backup/verify.rs | 114 +++++++++++++++++++++----------------------
 1 file changed, 57 insertions(+), 57 deletions(-)

diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index e8ea49b2..e1eda039 100644
--- a/src/backup/verify.rs
+++ b/src/backup/verify.rs
@@ -20,7 +20,7 @@ use pbs_datastore::index::{ChunkReadInfo, IndexFile};
 use pbs_datastore::manifest::{BackupManifest, FileInfo};
 use pbs_datastore::{DataBlob, DataStore, DatastoreBackend, StoreProgress};
 
-use crate::tools::parallel_handler::ParallelHandler;
+use crate::tools::parallel_handler::{ParallelHandler, SendHandle};
 
 use crate::backup::hierarchy::ListAccessibleBackupGroups;
 
@@ -109,27 +109,20 @@ impl VerifyWorker {
         index: Box<dyn IndexFile + Send>,
         crypt_mode: CryptMode,
     ) -> Result<(), Error> {
-        let errors = Arc::new(AtomicUsize::new(0));
-
-        let start_time = Instant::now();
-
-        let mut read_bytes = 0;
-        let mut decoded_bytes = 0;
-
-        let datastore2 = Arc::clone(&self.datastore);
-        let corrupt_chunks2 = Arc::clone(&self.corrupt_chunks);
-        let verified_chunks2 = Arc::clone(&self.verified_chunks);
-        let errors2 = Arc::clone(&errors);
-
-        let decoder_pool = ParallelHandler::new(
-            "verify chunk decoder",
-            4,
+        let verify_state = Arc::new(IndexVerifyState::new(
+            &self.datastore,
+            &self.corrupt_chunks,
+            &self.verified_chunks,
+        ));
+
+        let decoder_pool = ParallelHandler::new("verify chunk decoder", 4, {
+            let verify_state = Arc::clone(&verify_state);
             move |(chunk, digest, size): (DataBlob, [u8; 32], u64)| {
                 let chunk_crypt_mode = match chunk.crypt_mode() {
                     Err(err) => {
-                        corrupt_chunks2.lock().unwrap().insert(digest);
+                        verify_state.corrupt_chunks.lock().unwrap().insert(digest);
                         info!("can't verify chunk, unknown CryptMode - {err}");
-                        errors2.fetch_add(1, Ordering::SeqCst);
+                        verify_state.errors.fetch_add(1, Ordering::SeqCst);
                         return Ok(());
                     }
                     Ok(mode) => mode,
@@ -139,25 +132,25 @@ impl VerifyWorker {
                     info!(
                     "chunk CryptMode {chunk_crypt_mode:?} does not match index CryptMode {crypt_mode:?}"
                 );
-                    errors2.fetch_add(1, Ordering::SeqCst);
+                    verify_state.errors.fetch_add(1, Ordering::SeqCst);
                 }
 
                 if let Err(err) = chunk.verify_unencrypted(size as usize, &digest) {
-                    corrupt_chunks2.lock().unwrap().insert(digest);
+                    verify_state.corrupt_chunks.lock().unwrap().insert(digest);
                     info!("{err}");
-                    errors2.fetch_add(1, Ordering::SeqCst);
-                    match datastore2.rename_corrupt_chunk(&digest) {
+                    verify_state.errors.fetch_add(1, Ordering::SeqCst);
+                    match verify_state.datastore.rename_corrupt_chunk(&digest) {
                         Ok(Some(new_path)) => info!("corrupt chunk renamed to {new_path:?}"),
                         Err(err) => info!("{err}"),
                         _ => (),
                     }
                 } else {
-                    verified_chunks2.lock().unwrap().insert(digest);
+                    verify_state.verified_chunks.lock().unwrap().insert(digest);
                 }
 
                 Ok(())
-            },
-        );
+            }
+        });
 
         let skip_chunk = |digest: &[u8; 32]| -> bool {
             if self.verified_chunks.lock().unwrap().contains(digest) {
@@ -165,7 +158,7 @@ impl VerifyWorker {
             } else if self.corrupt_chunks.lock().unwrap().contains(digest) {
                 let digest_str = hex::encode(digest);
                 info!("chunk {digest_str} was marked as corrupt");
-                errors.fetch_add(1, Ordering::SeqCst);
+                verify_state.errors.fetch_add(1, Ordering::SeqCst);
                 true
             } else {
                 false
@@ -195,18 +188,20 @@ impl VerifyWorker {
                 continue; // already verified or marked corrupt
             }
 
-            self.verify_chunk_by_backend(
+            Self::verify_chunk_by_backend(
+                &self.backend,
+                Arc::clone(&verify_state),
+                &decoder_pool.channel(),
                 &info,
-                &mut read_bytes,
-                &mut decoded_bytes,
-                Arc::clone(&errors),
-                &decoder_pool,
             )?;
         }
 
         decoder_pool.complete()?;
 
-        let elapsed = start_time.elapsed().as_secs_f64();
+        let elapsed = verify_state.start_time.elapsed().as_secs_f64();
+
+        let read_bytes = verify_state.read_bytes.load(Ordering::SeqCst);
+        let decoded_bytes = verify_state.decoded_bytes.load(Ordering::SeqCst);
 
         let read_bytes_mib = (read_bytes as f64) / (1024.0 * 1024.0);
         let decoded_bytes_mib = (decoded_bytes as f64) / (1024.0 * 1024.0);
@@ -214,13 +209,13 @@ impl VerifyWorker {
         let read_speed = read_bytes_mib / elapsed;
         let decode_speed = decoded_bytes_mib / elapsed;
 
-        let error_count = errors.load(Ordering::SeqCst);
+        let error_count = verify_state.errors.load(Ordering::SeqCst);
 
         info!(
             "  verified {read_bytes_mib:.2}/{decoded_bytes_mib:.2} MiB in {elapsed:.2} seconds, speed {read_speed:.2}/{decode_speed:.2} MiB/s ({error_count} errors)"
         );
 
-        if errors.load(Ordering::SeqCst) > 0 {
+        if verify_state.errors.load(Ordering::SeqCst) > 0 {
             bail!("chunks could not be verified");
         }
 
@@ -228,25 +223,25 @@ impl VerifyWorker {
     }
 
     fn verify_chunk_by_backend(
-        &self,
+        backend: &DatastoreBackend,
+        verify_state: Arc<IndexVerifyState>,
+        decoder_pool: &SendHandle<(DataBlob, [u8; 32], u64)>,
         info: &ChunkReadInfo,
-        read_bytes: &mut u64,
-        decoded_bytes: &mut u64,
-        errors: Arc<AtomicUsize>,
-        decoder_pool: &ParallelHandler<(DataBlob, [u8; 32], u64)>,
     ) -> Result<(), Error> {
-        match &self.backend {
-            DatastoreBackend::Filesystem => match self.datastore.load_chunk(&info.digest) {
-                Err(err) => self.add_corrupt_chunk(
+        match backend {
+            DatastoreBackend::Filesystem => match verify_state.datastore.load_chunk(&info.digest) {
+                Err(err) => Self::add_corrupt_chunk(
+                    verify_state,
                     info.digest,
-                    errors,
                     &format!("can't verify chunk, load failed - {err}"),
                 ),
                 Ok(chunk) => {
                     let size = info.size();
-                    *read_bytes += chunk.raw_size();
+                    verify_state
+                        .read_bytes
+                        .fetch_add(chunk.raw_size(), Ordering::SeqCst);
                     decoder_pool.send((chunk, info.digest, size))?;
-                    *decoded_bytes += size;
+                    verify_state.decoded_bytes.fetch_add(size, Ordering::SeqCst);
                 }
             },
             DatastoreBackend::S3(s3_client) => {
@@ -258,13 +253,17 @@ impl VerifyWorker {
                                 match DataBlob::from_raw(raw_chunk.to_bytes().to_vec()) {
                                     Ok(chunk) => {
                                         let size = info.size();
-                                        *read_bytes += chunk.raw_size();
+                                        verify_state
+                                            .read_bytes
+                                            .fetch_add(chunk.raw_size(), Ordering::SeqCst);
                                         decoder_pool.send((chunk, info.digest, size))?;
-                                        *decoded_bytes += size;
+                                        verify_state
+                                            .decoded_bytes
+                                            .fetch_add(size, Ordering::SeqCst);
                                     }
-                                    Err(err) => self.add_corrupt_chunk(
+                                    Err(err) => Self::add_corrupt_chunk(
+                                        verify_state,
                                         info.digest,
-                                        errors,
                                         &format!(
                                             "can't verify chunk with digest {} - {err}",
                                             hex::encode(info.digest)
@@ -273,21 +272,21 @@ impl VerifyWorker {
                                 }
                             }
                             Err(err) => {
-                                errors.fetch_add(1, Ordering::SeqCst);
+                                verify_state.errors.fetch_add(1, Ordering::SeqCst);
                                 error!("can't verify chunk, load failed - {err}");
                             }
                         }
                     }
-                    Ok(None) => self.add_corrupt_chunk(
+                    Ok(None) => Self::add_corrupt_chunk(
+                        verify_state,
                         info.digest,
-                        errors,
                         &format!(
                             "can't verify missing chunk with digest {}",
                             hex::encode(info.digest)
                         ),
                     ),
                     Err(err) => {
-                        errors.fetch_add(1, Ordering::SeqCst);
+                        verify_state.errors.fetch_add(1, Ordering::SeqCst);
                         error!("can't verify chunk, load failed - {err}");
                     }
                 }
@@ -296,12 +295,13 @@ impl VerifyWorker {
         Ok(())
     }
 
-    fn add_corrupt_chunk(&self, digest: [u8; 32], errors: Arc<AtomicUsize>, message: &str) {
+    fn add_corrupt_chunk(verify_state: Arc<IndexVerifyState>, digest: [u8; 32], message: &str) {
         // Panic on poisoned mutex
-        self.corrupt_chunks.lock().unwrap().insert(digest);
+        let mut corrupt_chunks = verify_state.corrupt_chunks.lock().unwrap();
+        corrupt_chunks.insert(digest);
         error!(message);
-        errors.fetch_add(1, Ordering::SeqCst);
-        match self.datastore.rename_corrupt_chunk(&digest) {
+        verify_state.errors.fetch_add(1, Ordering::SeqCst);
+        match verify_state.datastore.rename_corrupt_chunk(&digest) {
             Ok(Some(new_path)) => info!("corrupt chunk renamed to {new_path:?}"),
             Err(err) => info!("{err}"),
             _ => (),
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 4/9] verify: move chunk loading into parallel handler
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (5 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/9] verify: refactor into associated functions to use " Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 5/9] verify: determine the number of threads to use with {read, verify}-threads Nicolas Frey
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

This way, the chunks will be loaded in parallel in addition to being
checked in parallel.

Depending on the underlying storage, this can speed up reading chunks
from disk, especially when the underlying storage is IO depth
dependent, and the CPU is faster than the storage.

Originally-by: Dominik Csapak <d.csapak@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/backup/verify.rs | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index e1eda039..07d51dcf 100644
--- a/src/backup/verify.rs
+++ b/src/backup/verify.rs
@@ -177,6 +177,20 @@ impl VerifyWorker {
             .datastore
             .get_chunks_in_order(&*index, skip_chunk, check_abort)?;
 
+        let reader_pool = ParallelHandler::new("read chunks", 1, {
+            let decoder_pool = decoder_pool.channel();
+            let verify_state = Arc::clone(&verify_state);
+            let backend = self.backend.clone();
+
+            move |info: ChunkReadInfo| {
+                Self::verify_chunk_by_backend(
+                    &backend,
+                    Arc::clone(&verify_state),
+                    &decoder_pool,
+                    &info,
+                )
+            }
+        });
         for (pos, _) in chunk_list {
             self.worker.check_abort()?;
             self.worker.fail_on_shutdown()?;
@@ -188,15 +202,10 @@ impl VerifyWorker {
                 continue; // already verified or marked corrupt
             }
 
-            Self::verify_chunk_by_backend(
-                &self.backend,
-                Arc::clone(&verify_state),
-                &decoder_pool.channel(),
-                &info,
-            )?;
+            reader_pool.send(info)?;
         }
 
-        decoder_pool.complete()?;
+        reader_pool.complete()?;
 
         let elapsed = verify_state.start_time.elapsed().as_secs_f64();
 
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 5/9] verify: determine the number of threads to use with {read, verify}-threads
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (6 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 4/9] verify: move chunk loading into parallel handler Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 6/9] verify: add {read, verify}-threads to update endpoint Nicolas Frey
                   ` (7 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

use previously introduced {read,verify}-threads in API, where default
values match the ones of the schema definition.

Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/api2/admin/datastore.rs    | 14 +++++++++++++-
 src/api2/backup/environment.rs |  4 +++-
 src/backup/verify.rs           | 16 ++++++++++++++--
 src/server/verify_job.rs       |  7 ++++++-
 4 files changed, 36 insertions(+), 5 deletions(-)

diff --git a/src/api2/admin/datastore.rs b/src/api2/admin/datastore.rs
index 2d70e997..044dfb57 100644
--- a/src/api2/admin/datastore.rs
+++ b/src/api2/admin/datastore.rs
@@ -46,6 +46,7 @@ use pbs_api_types::{
     IGNORE_VERIFIED_BACKUPS_SCHEMA, MAX_NAMESPACE_DEPTH, NS_MAX_DEPTH_SCHEMA, PRIV_DATASTORE_AUDIT,
     PRIV_DATASTORE_BACKUP, PRIV_DATASTORE_MODIFY, PRIV_DATASTORE_PRUNE, PRIV_DATASTORE_READ,
     PRIV_DATASTORE_VERIFY, PRIV_SYS_MODIFY, UPID, UPID_SCHEMA, VERIFICATION_OUTDATED_AFTER_SCHEMA,
+    VERIFY_JOB_READ_THREADS_SCHEMA, VERIFY_JOB_VERIFY_THREADS_SCHEMA,
 };
 use pbs_client::pxar::{create_tar, create_zip};
 use pbs_config::CachedUserInfo;
@@ -675,6 +676,14 @@ pub async fn status(
                 schema: NS_MAX_DEPTH_SCHEMA,
                 optional: true,
             },
+            "read-threads": {
+                schema: VERIFY_JOB_READ_THREADS_SCHEMA,
+                optional: true,
+            },
+            "verify-threads": {
+                schema: VERIFY_JOB_VERIFY_THREADS_SCHEMA,
+                optional: true,
+            },
         },
     },
     returns: {
@@ -700,6 +709,8 @@ pub fn verify(
     ignore_verified: Option<bool>,
     outdated_after: Option<i64>,
     max_depth: Option<usize>,
+    read_threads: Option<usize>,
+    verify_threads: Option<usize>,
     rpcenv: &mut dyn RpcEnvironment,
 ) -> Result<Value, Error> {
     let auth_id: Authid = rpcenv.get_auth_id().unwrap().parse()?;
@@ -779,7 +790,8 @@ pub fn verify(
         auth_id.to_string(),
         to_stdout,
         move |worker| {
-            let verify_worker = VerifyWorker::new(worker.clone(), datastore)?;
+            let verify_worker =
+                VerifyWorker::new(worker.clone(), datastore, read_threads, verify_threads)?;
             let failed_dirs = if let Some(backup_dir) = backup_dir {
                 let mut res = Vec::new();
                 if !verify_worker.verify_backup_dir(
diff --git a/src/api2/backup/environment.rs b/src/api2/backup/environment.rs
index 1b8e0e1d..bd9c5211 100644
--- a/src/api2/backup/environment.rs
+++ b/src/api2/backup/environment.rs
@@ -800,7 +800,9 @@ impl BackupEnvironment {
             move |worker| {
                 worker.log_message("Automatically verifying newly added snapshot");
 
-                let verify_worker = VerifyWorker::new(worker.clone(), datastore)?;
+                // FIXME: update once per-datastore read/verify settings
+                // are available to not use default amount of threads here
+                let verify_worker = VerifyWorker::new(worker.clone(), datastore, None, None)?;
                 if !verify_worker.verify_backup_dir_with_lock(
                     &backup_dir,
                     worker.upid().clone(),
diff --git a/src/backup/verify.rs b/src/backup/verify.rs
index 07d51dcf..734c7b30 100644
--- a/src/backup/verify.rs
+++ b/src/backup/verify.rs
@@ -32,6 +32,8 @@ pub struct VerifyWorker {
     verified_chunks: Arc<Mutex<HashSet<[u8; 32]>>>,
     corrupt_chunks: Arc<Mutex<HashSet<[u8; 32]>>>,
     backend: DatastoreBackend,
+    read_threads: usize,
+    verify_threads: usize,
 }
 
 struct IndexVerifyState {
@@ -67,6 +69,8 @@ impl VerifyWorker {
     pub fn new(
         worker: Arc<dyn WorkerTaskContext>,
         datastore: Arc<DataStore>,
+        read_threads: Option<usize>,
+        verify_threads: Option<usize>,
     ) -> Result<Self, Error> {
         let backend = datastore.backend()?;
         Ok(Self {
@@ -77,6 +81,8 @@ impl VerifyWorker {
             // start with 64 chunks since we assume there are few corrupt ones
             corrupt_chunks: Arc::new(Mutex::new(HashSet::with_capacity(64))),
             backend,
+            read_threads: read_threads.unwrap_or(1),
+            verify_threads: verify_threads.unwrap_or(4),
         })
     }
 
@@ -115,7 +121,7 @@ impl VerifyWorker {
             &self.verified_chunks,
         ));
 
-        let decoder_pool = ParallelHandler::new("verify chunk decoder", 4, {
+        let decoder_pool = ParallelHandler::new("verify chunk decoder", self.verify_threads, {
             let verify_state = Arc::clone(&verify_state);
             move |(chunk, digest, size): (DataBlob, [u8; 32], u64)| {
                 let chunk_crypt_mode = match chunk.crypt_mode() {
@@ -177,7 +183,7 @@ impl VerifyWorker {
             .datastore
             .get_chunks_in_order(&*index, skip_chunk, check_abort)?;
 
-        let reader_pool = ParallelHandler::new("read chunks", 1, {
+        let reader_pool = ParallelHandler::new("read chunks", self.read_threads, {
             let decoder_pool = decoder_pool.channel();
             let verify_state = Arc::clone(&verify_state);
             let backend = self.backend.clone();
@@ -585,6 +591,12 @@ impl VerifyWorker {
         let group_count = list.len();
         info!("found {group_count} groups");
 
+        log::info!(
+            "using {} read and {} verify thread(s)",
+            self.read_threads,
+            self.verify_threads,
+        );
+
         let mut progress = StoreProgress::new(group_count as u64);
 
         for (pos, group) in list.into_iter().enumerate() {
diff --git a/src/server/verify_job.rs b/src/server/verify_job.rs
index c8792174..e0b03155 100644
--- a/src/server/verify_job.rs
+++ b/src/server/verify_job.rs
@@ -41,7 +41,12 @@ pub fn do_verification_job(
                 None => Default::default(),
             };
 
-            let verify_worker = VerifyWorker::new(worker.clone(), datastore)?;
+            let verify_worker = VerifyWorker::new(
+                worker.clone(),
+                datastore,
+                verification_job.read_threads,
+                verification_job.verify_threads,
+            )?;
             let result = verify_worker.verify_all_backups(
                 worker.upid(),
                 ns,
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 6/9] verify: add {read, verify}-threads to update endpoint
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (7 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 5/9] verify: determine the number of threads to use with {read, verify}-threads Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 7/9] verify: add {read, verify}-threads to api schema in backup manager Nicolas Frey
                   ` (6 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

Allows to add, update or delete the {read,verify}-thread property in
the verify job config via the API.

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/api2/config/verify.rs | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/src/api2/config/verify.rs b/src/api2/config/verify.rs
index e71e0c2e..a88a3c32 100644
--- a/src/api2/config/verify.rs
+++ b/src/api2/config/verify.rs
@@ -149,6 +149,10 @@ pub enum DeletableProperty {
     Ns,
     /// Delete max-depth property, defaulting to full recursion again
     MaxDepth,
+    /// Delete read-threads property
+    ReadThreads,
+    /// Delete verify-threads property
+    VerifyThreads,
 }
 
 #[api(
@@ -229,6 +233,12 @@ pub fn update_verification_job(
                 DeletableProperty::MaxDepth => {
                     data.max_depth = None;
                 }
+                DeletableProperty::ReadThreads => {
+                    data.read_threads = None;
+                }
+                DeletableProperty::VerifyThreads => {
+                    data.verify_threads = None;
+                }
             }
         }
     }
@@ -266,6 +276,12 @@ pub fn update_verification_job(
             data.max_depth = Some(max_depth);
         }
     }
+    if update.read_threads.is_some() {
+        data.read_threads = update.read_threads;
+    }
+    if update.verify_threads.is_some() {
+        data.verify_threads = update.verify_threads;
+    }
 
     // check new store and NS
     user_info.check_privs(&auth_id, &data.acl_path(), PRIV_DATASTORE_VERIFY, true)?;
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 7/9] verify: add {read, verify}-threads to api schema in backup manager
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (8 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 6/9] verify: add {read, verify}-threads to update endpoint Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 8/9] ui: verify: add option to set number of threads for job Nicolas Frey
                   ` (5 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

Suggested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 src/bin/proxmox-backup-manager.rs | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/bin/proxmox-backup-manager.rs b/src/bin/proxmox-backup-manager.rs
index 142f0584..d9f41353 100644
--- a/src/bin/proxmox-backup-manager.rs
+++ b/src/bin/proxmox-backup-manager.rs
@@ -15,7 +15,8 @@ use pbs_api_types::{
     GROUP_FILTER_LIST_SCHEMA, IGNORE_VERIFIED_BACKUPS_SCHEMA, NS_MAX_DEPTH_SCHEMA,
     REMOTE_ID_SCHEMA, REMOVE_VANISHED_BACKUPS_SCHEMA, RESYNC_CORRUPT_SCHEMA,
     SYNC_ENCRYPTED_ONLY_SCHEMA, SYNC_VERIFIED_ONLY_SCHEMA, TRANSFER_LAST_SCHEMA, UPID_SCHEMA,
-    VERIFICATION_OUTDATED_AFTER_SCHEMA,
+    VERIFICATION_OUTDATED_AFTER_SCHEMA, VERIFY_JOB_READ_THREADS_SCHEMA,
+    VERIFY_JOB_VERIFY_THREADS_SCHEMA,
 };
 use pbs_client::{display_task_log, view_task_result};
 use pbs_config::sync;
@@ -583,6 +584,14 @@ async fn push_datastore(
                 schema: OUTPUT_FORMAT,
                 optional: true,
             },
+            "read-threads": {
+                schema: VERIFY_JOB_READ_THREADS_SCHEMA,
+                optional: true,
+            },
+            "verify-threads": {
+                schema: VERIFY_JOB_VERIFY_THREADS_SCHEMA,
+                optional: true,
+            },
         }
    }
 )]
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 8/9] ui: verify: add option to set number of threads for job
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (9 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 7/9] verify: add {read, verify}-threads to api schema in backup manager Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot Nicolas Frey
                   ` (4 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

Exposes the {read,verify}-threads property in the `VerifyJobEdit`
window and `VerifyAll` window so the user can update the values
accordingly.

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 www/window/VerifyAll.js     | 18 ++++++++++++++++++
 www/window/VerifyJobEdit.js | 24 ++++++++++++++++++++++++
 2 files changed, 42 insertions(+)

diff --git a/www/window/VerifyAll.js b/www/window/VerifyAll.js
index 01bcd63d..4239c215 100644
--- a/www/window/VerifyAll.js
+++ b/www/window/VerifyAll.js
@@ -80,6 +80,24 @@ Ext.define('PBS.window.VerifyAll', {
                         },
                     ],
                 },
+                {
+                    xtype: 'proxmoxintegerfield',
+                    name: 'read-threads',
+                    fieldLabel: gettext('# of Read Threads'),
+                    emptyText: '1',
+                    skipEmptyText: true,
+                    minValue: 1,
+                    maxValue: 32,
+                },
+                {
+                    xtype: 'proxmoxintegerfield',
+                    name: 'verify-threads',
+                    fieldLabel: gettext('# of Verify Threads'),
+                    emptyText: '4',
+                    skipEmptyText: true,
+                    minValue: 1,
+                    maxValue: 32,
+                },
             ],
         },
     ],
diff --git a/www/window/VerifyJobEdit.js b/www/window/VerifyJobEdit.js
index e87ca069..5650ed5c 100644
--- a/www/window/VerifyJobEdit.js
+++ b/www/window/VerifyJobEdit.js
@@ -154,6 +154,30 @@ Ext.define('PBS.window.VerifyJobEdit', {
             },
         ],
         advancedColumn1: [
+            {
+                xtype: 'proxmoxintegerfield',
+                name: 'read-threads',
+                fieldLabel: gettext('# of Read Threads'),
+                emptyText: '1',
+                minValue: 1,
+                maxValue: 32,
+                cbind: {
+                    deleteEmpty: '{!isCreate}',
+                },
+            },
+            {
+                xtype: 'proxmoxintegerfield',
+                name: 'verify-threads',
+                fieldLabel: gettext('# of Verify Threads'),
+                emptyText: '4',
+                minValue: 1,
+                maxValue: 32,
+                cbind: {
+                    deleteEmpty: '{!isCreate}',
+                },
+            },
+        ],
+        advancedColumn2: [
             {
                 xtype: 'pmxDisplayEditField',
                 fieldLabel: gettext('Job ID'),
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (10 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 8/9] ui: verify: add option to set number of threads for job Nicolas Frey
@ 2025-11-13  9:31 ` Nicolas Frey
  2025-11-14 10:41   ` Christian Ebner
  2025-11-13 12:53 ` [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Fabian Grünbichler
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 18+ messages in thread
From: Nicolas Frey @ 2025-11-13  9:31 UTC (permalink / raw)
  To: pbs-devel

documents new {read,verify}-threads parameters and updates the
screenshot of adding a verifyjob to include them.

Suggested-by: Christian Ebner <c.ebner@proxmox.com>
Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
---
 .../pbs-gui-datastore-verifyjob-add.png       | Bin 15455 -> 41433 bytes
 docs/maintenance.rst                          |  11 +++++++++--
 2 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/docs/images/screenshots/pbs-gui-datastore-verifyjob-add.png b/docs/images/screenshots/pbs-gui-datastore-verifyjob-add.png
index 6ec52ba608ec8fda9d9a13c0fbc41b89b240eaf6..6c6e688d772f73a6b61be831ba990a4c040eb562 100644
GIT binary patch
literal 41433
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

literal 15455
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

diff --git a/docs/maintenance.rst b/docs/maintenance.rst
index c1b38fc7..4f6178f0 100644
--- a/docs/maintenance.rst
+++ b/docs/maintenance.rst
@@ -296,8 +296,15 @@ data is intact. Verification is generally carried out through the creation of
 verify jobs. These are scheduled tasks that run verification at a given interval
 (see :ref:`calendar-event-scheduling`). With these, you can also set whether
 already verified snapshots are ignored, as well as set a time period, after
-which snapshots are checked again. The interface for creating verify jobs can be
-found under the **Verify Jobs** tab of the datastore.
+which snapshots are checked again. The number of threads to use for verifying
+and reading can also be specified.
+
+.. Note:: Increasing the number of read threads can increase performance depending
+  on the underlying storage: Especially when it is IO depth dependent and the CPU
+  is faster than the storage.
+
+The interface for creating verify jobs can be found under the **Verify Jobs** tab
+of the datastore.
 
 .. Note:: It is recommended that you reverify all backups at least monthly, even
   if a previous verification was successful. This is because physical drives
-- 
2.47.3


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (11 preceding siblings ...)
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot Nicolas Frey
@ 2025-11-13 12:53 ` Fabian Grünbichler
  2025-11-14 10:46 ` Christian Ebner
                   ` (2 subsequent siblings)
  15 siblings, 0 replies; 18+ messages in thread
From: Fabian Grünbichler @ 2025-11-13 12:53 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion

Gave this a spin as well, the code looks good to me and adding more
threads does make things faster, although finding the best combination
is probably a bit tricky:

1:4 90s (baseline)
1:8 91s (verify threads were already not fully utilized in the baseline)
4:4 46s
2:6 58s

these were with a smaller set of snapshots and a warm cache.

with a full datastore that doesn't fit into RAM/cache:

1:4 408s
1:8 349s
4:4 159s
2:6 204s

adding more threads mostly does not help anymore in my case..

On November 13, 2025 10:31 am, Nicolas Frey wrote:
> This patch series aims to expand on Dominik's series [0] written for
> pbs 3, parallelizing chunk reads in `VerifyWorker` using a seperate
> thread pool from the verification.
> 
> The number of threads was previously hard-coded, but is now
> configurable via the API and GUI with new properties called
> `{read,verify}-threads`, similarly to tape backups.
> 
> The number of threads should also be configurable through tuning
> options or datastore config (as discussed by Chris & Thomas on list),
> which can be added in a follow up patch series.
> 
> In my local tests I measured the following speed difference:
> verified a single snapshot with ~32 GiB (4x the RAM size) with 4
> cores (just changing the read threads)
> 
> 1 thread:    ~440MiB/s
> 2 threads:   ~780MiB/s
> 4 threads:   ~1140MiB/s
> 
> [0] https://lore.proxmox.com/pbs-devel/20250707132706.2854973-1-d.csapak@proxmox.com/#t
> 
> Changes since v3, thanks Chris!:
> * correct the ordering of patches
> * move thread schemas into jobs.rs, rename them and add more specific
>   descriptions
> * add api schema for {read,verify}-threads in backup manager
> * add doc for new parameters
> * rebase
> 
> Changes since v2:
> * split move to parallel handler into 2 seperate commits
> * add constructor to `IndexVerifyState` and clean up nits
> 
> Changes since v1, thanks to Chris:
> * define dedicated schema for {worker,read,verify}-threads
> * rebase proxmox-backup
> * introduce new state struct `IndexVerifyState` to reduce the amount
>   of Arc clones and overall better bundling
> * adjust update endpoint and UI to the new properties
> 
> proxmox:
> 
> Nicolas Frey (3):
>   pbs-api-types: add schema for {worker,read,verify}-threads
>   pbs-api-types: jobs: add {read,verify}-threads to
>     VerificationJobConfig
>   pbs-api-types: use worker-threads schema for TapeBackupJobSetup
> 
>  pbs-api-types/src/jobs.rs | 41 ++++++++++++++++++++++++++++++++++-----
>  1 file changed, 36 insertions(+), 5 deletions(-)
> 
> 
> proxmox-backup:
> 
> Nicolas Frey (9):
>   verify: correct typo in comment
>   verify: introduce new state struct
>   verify: refactor into associated functions to use new state struct
>   verify: move chunk loading into parallel handler
>   verify: determine the number of threads to use with
>     {read,verify}-threads
>   verify: add {read,verify}-threads to update endpoint
>   verify: add {read,verify}-threads to api schema in backup manager
>   ui: verify: add option to set number of threads for job
>   docs: verify: document {read,verify}-threads and update screenshot
> 
>  .../pbs-gui-datastore-verifyjob-add.png       | Bin 15455 -> 41433 bytes
>  docs/maintenance.rst                          |  11 +-
>  src/api2/admin/datastore.rs                   |  16 +-
>  src/api2/backup/environment.rs                |   4 +-
>  src/api2/config/verify.rs                     |  16 ++
>  src/backup/verify.rs                          | 171 +++++++++++-------
>  src/bin/proxmox-backup-manager.rs             |  11 +-
>  src/server/verify_job.rs                      |   7 +-
>  www/window/VerifyAll.js                       |  18 ++
>  www/window/VerifyJobEdit.js                   |  24 +++
>  10 files changed, 210 insertions(+), 68 deletions(-)
> 
> 
> Summary over all repositories:
>   11 files changed, 246 insertions(+), 73 deletions(-)
> 
> -- 
> Generated by git-murpp 0.8.1
> 
> _______________________________________________
> pbs-devel mailing list
> pbs-devel@lists.proxmox.com
> https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel
> 
> 
> 


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot
  2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot Nicolas Frey
@ 2025-11-14 10:41   ` Christian Ebner
  0 siblings, 0 replies; 18+ messages in thread
From: Christian Ebner @ 2025-11-14 10:41 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Nicolas Frey

nit: in the screenshot the borders of the edit window are visible, for 
other screenshots in the docs that is not the case. Please crop accordingly.

another two comments inline.

On 11/13/25 10:31 AM, Nicolas Frey wrote:
> documents new {read,verify}-threads parameters and updates the
> screenshot of adding a verifyjob to include them.
> 
> Suggested-by: Christian Ebner <c.ebner@proxmox.com>
> Signed-off-by: Nicolas Frey <n.frey@proxmox.com>
> ---
>   .../pbs-gui-datastore-verifyjob-add.png       | Bin 15455 -> 41433 bytes
>   docs/maintenance.rst                          |  11 +++++++++--
>   2 files changed, 9 insertions(+), 2 deletions(-)
> 
> diff --git a/docs/images/screenshots/pbs-gui-datastore-verifyjob-add.png b/docs/images/screenshots/pbs-gui-datastore-verifyjob-add.png
> index 6ec52ba608ec8fda9d9a13c0fbc41b89b240eaf6..6c6e688d772f73a6b61be831ba990a4c040eb562 100644
> GIT binary patch
> literal 41433
> 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
> 
> literal 15455
> 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
> 
> diff --git a/docs/maintenance.rst b/docs/maintenance.rst
> index c1b38fc7..4f6178f0 100644
> --- a/docs/maintenance.rst
> +++ b/docs/maintenance.rst
> @@ -296,8 +296,15 @@ data is intact. Verification is generally carried out through the creation of
>   verify jobs. These are scheduled tasks that run verification at a given interval
>   (see :ref:`calendar-event-scheduling`). With these, you can also set whether
>   already verified snapshots are ignored, as well as set a time period, after
> -which snapshots are checked again. The interface for creating verify jobs can be
> -found under the **Verify Jobs** tab of the datastore.
> +which snapshots are checked again. The number of threads to use for verifying
> +and reading can also be specified.

IMO this is to generic, rather this should explicitly mention the 
paramters, so e.g.

The number of read and verify threads used for a verification job can be 
specified via the `read-threads` and `verify-threads` parameters. 
Possible values range from 1 to 32 threads, defaults being 1 reader and 
4 verify threads.

> +
> +.. Note:: Increasing the number of read threads can increase performance depending
> +  on the underlying storage: Especially when it is IO depth dependent and the CPU
> +  is faster than the storage.

Not sure if this warants it's own note. However, you could include a cli 
example to show how to set the number of read/verify threads and an 
example invocation with the parameters when running a verify via 
proxmox-backup-manager verify.

> +
> +The interface for creating verify jobs can be found under the **Verify Jobs** tab
> +of the datastore.
>   
>   .. Note:: It is recommended that you reverify all backups at least monthly, even
>     if a previous verification was successful. This is because physical drives



_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* Re: [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (12 preceding siblings ...)
  2025-11-13 12:53 ` [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Fabian Grünbichler
@ 2025-11-14 10:46 ` Christian Ebner
  2025-11-14 21:36 ` [pbs-devel] applied: " Thomas Lamprecht
  2025-11-14 22:17 ` Thomas Lamprecht
  15 siblings, 0 replies; 18+ messages in thread
From: Christian Ebner @ 2025-11-14 10:46 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Nicolas Frey

Gave this another spin, looks good to me apart from the commit tag ordering.

Some additional ballpark benchmark figures from my testing:

Used for tests:
echo 3 > /proc/sys/vm/drop_caches && time proxmox-backup-manager verify 
<datastore> --read-threads 1 --verify-threads 4 --ignore-verified false

S3 store backed by Ceph RGW (6365 chunks with total 10.907 GiB, 42 index 
files)
-------------------------------
#threads | #threads   | runtime
-------------------------------
read: 1  | verify: 4  | 168s
read: 1  | verify: 8  | 166s
read: 2  | verify: 4  |  89s
read: 4  | verify: 4  |  50s
read: 8  | verify: 4  |  32s
read: 16 | verify: 4  |  26s
read: 32 | verify: 4  |  25s
read: 8  | verify: 8  |  30s
read: 16 | verify: 8  |  23s
read: 32 | verify: 8  |  23s
read: 8  | verify: 16 |  30s
read: 16 | verify: 16 |  23s
read: 16 | verify: 32 |  23s
read: 32 | verify: 32 |  23s

so above 8 verify threads CPU bound, below 16 read threads IO bound.

Regular datastore on NVME SSD (6012 chunks with total 8.059 GiB, 37 
index files)
-------------------------------
#threads | #threads   | runtime
-------------------------------
read: 1  | verify: 4  | 11s
read: 1  | verify: 8  |  9s
read: 2  | verify: 4  |  9s
read: 4  | verify: 4  |  8s
read: 8  | verify: 4  |  8s
read: 16 | verify: 4  |  8s
read: 32 | verify: 4  |  9s
read: 8  | verify: 8  |  6s
read: 16 | verify: 8  |  6s
read: 32 | verify: 8  |  6s
read: 8  | verify: 16 |  5s
read: 16 | verify: 16 |  6s
read: 16 | verify: 32 |  6s
read: 32 | verify: 32 |  6s

so mostly CPU bound.

With the comments on the doc patch addressed, consider:

Reviewed-by: Christian Ebner <c.ebner@proxmox.com>
Tested-by: Christian Ebner <c.ebner@proxmox.com>


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] applied:  [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (13 preceding siblings ...)
  2025-11-14 10:46 ` Christian Ebner
@ 2025-11-14 21:36 ` Thomas Lamprecht
  2025-11-14 22:17 ` Thomas Lamprecht
  15 siblings, 0 replies; 18+ messages in thread
From: Thomas Lamprecht @ 2025-11-14 21:36 UTC (permalink / raw)
  To: pbs-devel, Nicolas Frey

On Thu, 13 Nov 2025 10:31:06 +0100, Nicolas Frey wrote:
> This patch series aims to expand on Dominik's series [0] written for
> pbs 3, parallelizing chunk reads in `VerifyWorker` using a seperate
> thread pool from the verification.
> 
> The number of threads was previously hard-coded, but is now
> configurable via the API and GUI with new properties called
> `{read,verify}-threads`, similarly to tape backups.
> 
> [...]

Applied pbs-api-types, thanks!

[01/3] pbs-api-types: add schema for {worker, read, verify}-threads
       commit: 1a744d0962eac66831503ddeea9884e9c3e81a73
[02/3] pbs-api-types: jobs: add {read, verify}-threads to VerificationJobConfig
       commit: 286a2b6bea39d98fa0dc3f988b42a5bc90560bd3
[03/3] pbs-api-types: use worker-threads schema for TapeBackupJobSetup
       commit: 9679d979c75fa34ad94977b169c4abbe6fe7dfbe


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

* [pbs-devel] applied:  [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification
  2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
                   ` (14 preceding siblings ...)
  2025-11-14 21:36 ` [pbs-devel] applied: " Thomas Lamprecht
@ 2025-11-14 22:17 ` Thomas Lamprecht
  15 siblings, 0 replies; 18+ messages in thread
From: Thomas Lamprecht @ 2025-11-14 22:17 UTC (permalink / raw)
  To: Proxmox Backup Server development discussion, Nicolas Frey

Am 13.11.25 um 10:31 schrieb Nicolas Frey:
> proxmox-backup:
> 
> Nicolas Frey (9):
>   verify: correct typo in comment
>   verify: introduce new state struct
>   verify: refactor into associated functions to use new state struct
>   verify: move chunk loading into parallel handler
>   verify: determine the number of threads to use with
>     {read,verify}-threads
>   verify: add {read,verify}-threads to update endpoint
>   verify: add {read,verify}-threads to api schema in backup manager
>   ui: verify: add option to set number of threads for job
>   docs: verify: document {read,verify}-threads and update screenshot
> 
>  .../pbs-gui-datastore-verifyjob-add.png       | Bin 15455 -> 41433 bytes
>  docs/maintenance.rst                          |  11 +-
>  src/api2/admin/datastore.rs                   |  16 +-
>  src/api2/backup/environment.rs                |   4 +-
>  src/api2/config/verify.rs                     |  16 ++
>  src/backup/verify.rs                          | 171 +++++++++++-------
>  src/bin/proxmox-backup-manager.rs             |  11 +-
>  src/server/verify_job.rs                      |   7 +-
>  www/window/VerifyAll.js                       |  18 ++
>  www/window/VerifyJobEdit.js                   |  24 +++
>  10 files changed, 210 insertions(+), 68 deletions(-)
> 
> 
> Summary over all repositories:
>   11 files changed, 246 insertions(+), 73 deletions(-)
> 


applied now PBS part but skipped the docs patch for now, thanks!


_______________________________________________
pbs-devel mailing list
pbs-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pbs-devel


^ permalink raw reply	[flat|nested] 18+ messages in thread

end of thread, other threads:[~2025-11-14 22:17 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-11-13  9:31 [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 1/3] pbs-api-types: add schema for {worker, read, verify}-threads Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 2/3] pbs-api-types: jobs: add {read, verify}-threads to VerificationJobConfig Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox v4 3/3] pbs-api-types: use worker-threads schema for TapeBackupJobSetup Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 1/9] verify: correct typo in comment Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 2/9] verify: introduce new state struct Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 3/9] verify: refactor into associated functions to use " Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 4/9] verify: move chunk loading into parallel handler Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 5/9] verify: determine the number of threads to use with {read, verify}-threads Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 6/9] verify: add {read, verify}-threads to update endpoint Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 7/9] verify: add {read, verify}-threads to api schema in backup manager Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 8/9] ui: verify: add option to set number of threads for job Nicolas Frey
2025-11-13  9:31 ` [pbs-devel] [PATCH proxmox-backup v4 9/9] docs: verify: document {read, verify}-threads and update screenshot Nicolas Frey
2025-11-14 10:41   ` Christian Ebner
2025-11-13 12:53 ` [pbs-devel] [PATCH proxmox{, -backup} v4 00/12] parallelize chunk reads in verification Fabian Grünbichler
2025-11-14 10:46 ` Christian Ebner
2025-11-14 21:36 ` [pbs-devel] applied: " Thomas Lamprecht
2025-11-14 22:17 ` Thomas Lamprecht

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal