Use a much bigger block size when calling fwrite(). Each call to fwrite()
authorCarl Hetherington <cth@carlh.net>
Thu, 6 Aug 2020 22:11:38 +0000 (00:11 +0200)
committerCarl Hetherington <cth@carlh.net>
Thu, 6 Aug 2020 22:17:04 +0000 (00:17 +0200)
writes a few (often around 4) blocks of (I think) directory data to the
drive, so if you only fwrite() one block it ends up writing 1 block of
"payload" and 4 blocks of "admin".  Using bigger blocks makes it faster;
an even bigger block than this makes it a little faster still, but not
significantly.

The extra block writing is seemingly triggered by fwrite() calling
ext4_block_cache_write_back(..., 0). A better fix is probably to call
this another way, at the end of the file copy.

src/tools/dcpomatic_disk_writer.cc

index a2788e18bf0259cb3526335cc88d42cb8345a460..45a5e8c60a44345ab7eb74e631edca1a5701cad3 100644 (file)
@@ -89,7 +89,8 @@ using boost::optional;
 #ifdef DCPOMATIC_LINUX
 static PolkitAuthority* polkit_authority = 0;
 #endif
-static uint64_t const block_size = 4096;
+/* Use quite a big block size here, as ext4's fwrite() has quite a bit of overhead */
+static uint64_t const block_size = 4096 * 4096;
 static Nanomsg* nanomsg = 0;
 
 #define SHORT_TIMEOUT 100
@@ -128,7 +129,7 @@ write (boost::filesystem::path from, boost::filesystem::path to, uint64_t& total
        uint8_t* buffer = new uint8_t[block_size];
        Digester digester;
 
-       int progress_frequency = 5000;
+       int progress_frequency = 1;
        int progress_count = 0;
        uint64_t remaining = file_size (from);
        while (remaining > 0) {