From 1a744614b682a7a9aec32bbe6ec6ea36a5308166 Mon Sep 17 00:00:00 2001 From: Rom Walton Date: Sat, 5 Apr 2014 14:28:33 -0400 Subject: [PATCH] VBOX: Introduce a random checkpoint offset value on initial start up to interleave the disk I/O when multiple vboxwrappers are running. --- samples/vboxwrapper/vboxwrapper.cpp | 39 ++++++++++++++++++++++------- win_build/vboxwrapper.vcxproj | 8 +++--- 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/samples/vboxwrapper/vboxwrapper.cpp b/samples/vboxwrapper/vboxwrapper.cpp index a32aee2b1b..f13636251b 100644 --- a/samples/vboxwrapper/vboxwrapper.cpp +++ b/samples/vboxwrapper/vboxwrapper.cpp @@ -372,6 +372,7 @@ int main(int argc, char** argv) { BOINC_OPTIONS boinc_options; VBOX_VM vm; APP_INIT_DATA aid; + double random_checkpoint_factor = 0; double elapsed_time = 0; double trickle_period = 0; double fraction_done = 0; @@ -432,6 +433,29 @@ int main(int argc, char** argv) { // Log important information // + + // Choose a random interleave value for checkpoint intervals to stagger disk I/O. + // + random_checkpoint_factor = (double)(((int)(drand() * 100000.0)) % 600); + fprintf( + stderr, + "%s Feature: Checkpoint interval offset (%f seconds)\n", + vboxwrapper_msg_prefix(buf, sizeof(buf)), + random_checkpoint_factor + ); + + // Display trickle value if specified + // + if (trickle_period > 0.0) { + fprintf( + stderr, + "%s Feature: Enabling trickle-ups (Interval: %f)\n", + vboxwrapper_msg_prefix(buf, sizeof(buf)), trickle_period + ); + } + + // Initialize system services + // #if defined(_WIN32) && defined(USE_WINSOCK) WSADATA wsdata; retval = WSAStartup( MAKEWORD( 1, 1 ), &wsdata); @@ -446,14 +470,6 @@ int main(int argc, char** argv) { } #endif - if (trickle_period > 0.0) { - fprintf( - stderr, - "%s Feature: Enabling trickle-ups (Interval: %f)\n", - vboxwrapper_msg_prefix(buf, sizeof(buf)), trickle_period - ); - } - // Check for architecture incompatibilities // #if defined(_WIN32) && defined(_M_IX86) @@ -973,7 +989,12 @@ int main(int argc, char** argv) { if (boinc_time_to_checkpoint()) { // Only peform a VM checkpoint every ten minutes or so. // - if (elapsed_time >= checkpoint_cpu_time + 600.0) { + if (elapsed_time >= checkpoint_cpu_time + random_checkpoint_factor + 600.0) { + // Basic interleave factor is only needed once. + if (random_checkpoint_factor > 0) { + random_checkpoint_factor = 0.0; + } + // Basic bookkeeping if (vm.job_duration) { fraction_done = elapsed_time / vm.job_duration; diff --git a/win_build/vboxwrapper.vcxproj b/win_build/vboxwrapper.vcxproj index 54405f175e..c21c7b68c6 100644 --- a/win_build/vboxwrapper.vcxproj +++ b/win_build/vboxwrapper.vcxproj @@ -128,12 +128,12 @@ libcmt.lib;libcpmt.lib;kernel32.lib;user32.lib;gdi32.lib;ole32.lib;wsock32.lib;psapi.lib;%(AdditionalDependencies) - .\Build\$(Platform)\$(Configuration)\vboxwrapper_26073_windows_intelx86.exe + .\Build\$(Platform)\$(Configuration)\vboxwrapper_26077_windows_intelx86.exe true true %(DelayLoadDLLs) true - .\Build\$(Platform)\$(Configuration)\vboxwrapper_26073_windows_intelx86.pdb + .\Build\$(Platform)\$(Configuration)\vboxwrapper_26077_windows_intelx86.pdb Windows MachineX86 @@ -177,12 +177,12 @@ libcmt.lib;libcpmt.lib;kernel32.lib;user32.lib;gdi32.lib;ole32.lib;wsock32.lib;psapi.lib;%(AdditionalDependencies) - .\Build\$(Platform)\$(Configuration)\vboxwrapper_26073_windows_x86_64.exe + .\Build\$(Platform)\$(Configuration)\vboxwrapper_26077_windows_x86_64.exe true true %(DelayLoadDLLs) true - .\Build\$(Platform)\$(Configuration)\vboxwrapper_26073_windows_x86_64.pdb + .\Build\$(Platform)\$(Configuration)\vboxwrapper_26077_windows_x86_64.pdb Windows MachineX64