-
Notifications
You must be signed in to change notification settings - Fork 526
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[tests] Run tests in parallel on non-Windows #2224
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This looks good.
The only thing I wonder. What will happen in monodroid
? We have some MSBuild tests (InstallTests
and InstantRunTests
) that deploy to the device. Will those work in parallel with the APK tests?
@jonathanpeppers asked:
Nothing; |
Alas, the macOS PR Build is unstable, but wow is it not happy:
Eep! I suspect we have a build order dependency problem. |
2b7ca1b
to
dc48e5a
Compare
Merged PR #2001 (so that we'd get separate |
dc48e5a
to
563fd17
Compare
The actual problem appears to be because the initial effort was using The latest effort uses |
Review is out of date because of most recent changes.
Retrying, in the hope it'll actually work. |
Behold, it is green. Now, is it worth it? The PR build for this PR took 2h2min. Meanwhile, perusing the green PR builds on xam-mac-mini-7 shows:
I'll immediately discount #2019; 4h36min is an outlier. I've also restarted this PR, so that we have an additional data point, i.e. "how consistent" is 2h2min? https://jenkins.mono-project.com/job/xamarin-android-pr-builder/4285/ Assuming 2h2min is consistent, then we're seeing build time improvements between 7% (vs. 2h11min) and 15% (vs 2h23min). That seems pretty good. @grendello, @jonathanpeppers: Thoughts? Is this worth merging? |
The rebuild is 2h3min, which is 6.1% faster than the 2h11min time. |
@jonpryor my only concern is if it’s going to make our plots have slower times and make them fluctuate a lot? Could RunPerformanceTests still happen last, but not parallel? I think it only takes 5 min (I think that was my machine), so I would have to look on Jenkins. We could also try this for a while and see what the plots do. |
What do we want? Faster unit test execution! How do we do that? By running things in parallel! Some of our existing tests are already run in parallel, such as the `src/Xamarin.Android.Build.Tasks/Tests` tests which use NUnit's `[Parallelizable (ParallelScope.Children)]`, but there is currently no way to run the `Xamarin.Android.Build.Tasks` NUnit tests *concurrently* with the on-device `.apk` tests concurrently with the Java.Interop unit tests concurrently with... We *think* there might be a "win" here, as the `Xamarin.Android.Build.Tasks` unit tests are heavily I/O bound, while the `.apk` BCL tests are -- presumably -- CPU bound, so executing these at the same time might net some nice time savings. Spike the idea by updating the `RunAllTests` target to *generate a shell script* which executes `msbuild` to run the appropriate test target, in the background, then waiting for all jobs to finish. The generated `bin/Test$(Configuration)/parallel-targets.sh` file resembles: echo Executing in background: msbuild …/build-tools/scripts/RunTests.targets /v:normal /binaryLogger:"…/msbuild-20181012T083249-Target-RunNUnitTests.binlog" /t:RunNUnitTests msbuild …/build-tools/scripts/RunTests.targets /v:normal /binaryLogger:"…/msbuild-20181012T083249-Target-RunNUnitTests.binlog" /t:RunNUnitTests & wait exit 0
563fd17
to
3bcbfe3
Compare
Updated the PR so that the |
By not executing the Wait, what? (Consistency, Conschmistency!) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I would double check the log that they all ran since it was faster, but it looks right to me.
That's why we need to apply some statistical treatment to the raw data, so that aberrations like PR 2019 don't blur the image |
Hm, maybe it kinda sorta makes sense? Those are performance tests, which means they are stressing the machine (I'm guessing)? So running them in parallel may slow things down by increasing process queue time. |
All in all, I think it's worth saving the 6-7% of time we spend on build. It's not an insignificant amount of time. |
Changes: JamesNK/Newtonsoft.Json@12.0.3...13.0.1 * JamesNK/Newtonsoft.Json@ae9fe44e: Remove compiler package and update sourcelink (dotnet#2498) * JamesNK/Newtonsoft.Json@8ef66218: Remove prerelease for 13.0.1 * JamesNK/Newtonsoft.Json@11331f50: Update SDK to 5.0.200 (dotnet#2495) * JamesNK/Newtonsoft.Json@c7e8abc0: Update to 13.0.1-beta2 * JamesNK/Newtonsoft.Json@1745d7c1: Fix JTokenWriter when writing comment to an object (dotnet#2493) * JamesNK/Newtonsoft.Json@583eb120: Fix missing error when deserializing JToken with a contract type mismatch (dotnet#2494) * JamesNK/Newtonsoft.Json@b6dc05be: Change MaxDepth default to 64 (dotnet#2473) * JamesNK/Newtonsoft.Json@15525f1c: Fix JsonWriter.WriteToken to allow null with string token (dotnet#2472) * JamesNK/Newtonsoft.Json@926d2f0f: Enable embed untracked sources (dotnet#2471) * JamesNK/Newtonsoft.Json@0a56633b: Fixes dotnet#2372 - variable typos (dotnet#2465) * JamesNK/Newtonsoft.Json@5a35c77d: Update version to 13.0.1 (dotnet#2463) * JamesNK/Newtonsoft.Json@7e77bbe1: Change JsonReader and JsonSerializer default max depth to 128 (dotnet#2462) * JamesNK/Newtonsoft.Json@42139ea6: Add JsonSelectSettings and regex timeout * JamesNK/Newtonsoft.Json@95a6eb3a: jpath regex timeout support added for a single regex expression, global umbrella for all regex calls, and support for allowing regex calls to get compiled if necessary * JamesNK/Newtonsoft.Json@1403f5d3: Fix serializing nullable struct dictionaries (dotnet#2452) * JamesNK/Newtonsoft.Json@60be32f4: Use naming strategy when deserializing dictionary enum keys (dotnet#2448) * JamesNK/Newtonsoft.Json@ff5ffb28: Copy annotations when cloning elements (dotnet#2442) * JamesNK/Newtonsoft.Json@0cf47a46: Missing nullability annotation (dotnet#2438) * JamesNK/Newtonsoft.Json@6795ca55: Fixed tests to work in Moscow, Russia UTC+3 timezone. (dotnet#2416) * JamesNK/Newtonsoft.Json@c918ca86: Code Typo Fix: Universial => Universal (dotnet#2383) * JamesNK/Newtonsoft.Json@c298f3d6: Fix typo in SerializeTypeNameHandling sample (dotnet#2428) * JamesNK/Newtonsoft.Json@a222c8b6: Update to net50 and fix warnings (dotnet#2424) * JamesNK/Newtonsoft.Json@666d9760: Fix wrong define is used in StringUtils.ToLower() (dotnet#2304) * JamesNK/Newtonsoft.Json@a31156e9: Update NullValueHandlingIgnore.aml (dotnet#2226) * JamesNK/Newtonsoft.Json@936acbf6: Update version to 13.0.1-beta and remove portable builds (dotnet#2228) * JamesNK/Newtonsoft.Json@9be95e0f: Do not treat ignored field as missing member when deserializing from overriden json constructor (dotnet#2224)
Changes: JamesNK/Newtonsoft.Json@12.0.3...13.0.1 * JamesNK/Newtonsoft.Json@ae9fe44e: Remove compiler package and update sourcelink (dotnet#2498) * JamesNK/Newtonsoft.Json@8ef66218: Remove prerelease for 13.0.1 * JamesNK/Newtonsoft.Json@11331f50: Update SDK to 5.0.200 (dotnet#2495) * JamesNK/Newtonsoft.Json@c7e8abc0: Update to 13.0.1-beta2 * JamesNK/Newtonsoft.Json@1745d7c1: Fix JTokenWriter when writing comment to an object (dotnet#2493) * JamesNK/Newtonsoft.Json@583eb120: Fix missing error when deserializing JToken with a contract type mismatch (dotnet#2494) * JamesNK/Newtonsoft.Json@b6dc05be: Change MaxDepth default to 64 (dotnet#2473) * JamesNK/Newtonsoft.Json@15525f1c: Fix JsonWriter.WriteToken to allow null with string token (dotnet#2472) * JamesNK/Newtonsoft.Json@926d2f0f: Enable embed untracked sources (dotnet#2471) * JamesNK/Newtonsoft.Json@0a56633b: Fixes dotnet#2372 - variable typos (dotnet#2465) * JamesNK/Newtonsoft.Json@5a35c77d: Update version to 13.0.1 (dotnet#2463) * JamesNK/Newtonsoft.Json@7e77bbe1: Change JsonReader and JsonSerializer default max depth to 128 (dotnet#2462) * JamesNK/Newtonsoft.Json@42139ea6: Add JsonSelectSettings and regex timeout * JamesNK/Newtonsoft.Json@95a6eb3a: jpath regex timeout support added for a single regex expression, global umbrella for all regex calls, and support for allowing regex calls to get compiled if necessary * JamesNK/Newtonsoft.Json@1403f5d3: Fix serializing nullable struct dictionaries (dotnet#2452) * JamesNK/Newtonsoft.Json@60be32f4: Use naming strategy when deserializing dictionary enum keys (dotnet#2448) * JamesNK/Newtonsoft.Json@ff5ffb28: Copy annotations when cloning elements (dotnet#2442) * JamesNK/Newtonsoft.Json@0cf47a46: Missing nullability annotation (dotnet#2438) * JamesNK/Newtonsoft.Json@6795ca55: Fixed tests to work in Moscow, Russia UTC+3 timezone. (dotnet#2416) * JamesNK/Newtonsoft.Json@c918ca86: Code Typo Fix: Universial => Universal (dotnet#2383) * JamesNK/Newtonsoft.Json@c298f3d6: Fix typo in SerializeTypeNameHandling sample (dotnet#2428) * JamesNK/Newtonsoft.Json@a222c8b6: Update to net50 and fix warnings (dotnet#2424) * JamesNK/Newtonsoft.Json@666d9760: Fix wrong define is used in StringUtils.ToLower() (dotnet#2304) * JamesNK/Newtonsoft.Json@a31156e9: Update NullValueHandlingIgnore.aml (dotnet#2226) * JamesNK/Newtonsoft.Json@936acbf6: Update version to 13.0.1-beta and remove portable builds (dotnet#2228) * JamesNK/Newtonsoft.Json@9be95e0f: Do not treat ignored field as missing member when deserializing from overriden json constructor (dotnet#2224) The `PackagingTest.NetStandardReferenceTest()` test is updated to no longer list `Microsoft.CSharp.dll` as an expected file, as with `Newtonsoft.Json.dll` v13.0.1, our build now consumes the netstandard2.0-profile version, not the netstandard1.3 version, and the netstandard 2.0 version doesn't require `Microsoft.CSharp.dll`.
Changes: JamesNK/Newtonsoft.Json@12.0.3...13.0.1 * JamesNK/Newtonsoft.Json@ae9fe44e: Remove compiler package and update sourcelink (dotnet#2498) * JamesNK/Newtonsoft.Json@8ef66218: Remove prerelease for 13.0.1 * JamesNK/Newtonsoft.Json@11331f50: Update SDK to 5.0.200 (dotnet#2495) * JamesNK/Newtonsoft.Json@c7e8abc0: Update to 13.0.1-beta2 * JamesNK/Newtonsoft.Json@1745d7c1: Fix JTokenWriter when writing comment to an object (dotnet#2493) * JamesNK/Newtonsoft.Json@583eb120: Fix missing error when deserializing JToken with a contract type mismatch (dotnet#2494) * JamesNK/Newtonsoft.Json@b6dc05be: Change MaxDepth default to 64 (dotnet#2473) * JamesNK/Newtonsoft.Json@15525f1c: Fix JsonWriter.WriteToken to allow null with string token (dotnet#2472) * JamesNK/Newtonsoft.Json@926d2f0f: Enable embed untracked sources (dotnet#2471) * JamesNK/Newtonsoft.Json@0a56633b: Fixes dotnet#2372 - variable typos (dotnet#2465) * JamesNK/Newtonsoft.Json@5a35c77d: Update version to 13.0.1 (dotnet#2463) * JamesNK/Newtonsoft.Json@7e77bbe1: Change JsonReader and JsonSerializer default max depth to 128 (dotnet#2462) * JamesNK/Newtonsoft.Json@42139ea6: Add JsonSelectSettings and regex timeout * JamesNK/Newtonsoft.Json@95a6eb3a: jpath regex timeout support added for a single regex expression, global umbrella for all regex calls, and support for allowing regex calls to get compiled if necessary * JamesNK/Newtonsoft.Json@1403f5d3: Fix serializing nullable struct dictionaries (dotnet#2452) * JamesNK/Newtonsoft.Json@60be32f4: Use naming strategy when deserializing dictionary enum keys (dotnet#2448) * JamesNK/Newtonsoft.Json@ff5ffb28: Copy annotations when cloning elements (dotnet#2442) * JamesNK/Newtonsoft.Json@0cf47a46: Missing nullability annotation (dotnet#2438) * JamesNK/Newtonsoft.Json@6795ca55: Fixed tests to work in Moscow, Russia UTC+3 timezone. (dotnet#2416) * JamesNK/Newtonsoft.Json@c918ca86: Code Typo Fix: Universial => Universal (dotnet#2383) * JamesNK/Newtonsoft.Json@c298f3d6: Fix typo in SerializeTypeNameHandling sample (dotnet#2428) * JamesNK/Newtonsoft.Json@a222c8b6: Update to net50 and fix warnings (dotnet#2424) * JamesNK/Newtonsoft.Json@666d9760: Fix wrong define is used in StringUtils.ToLower() (dotnet#2304) * JamesNK/Newtonsoft.Json@a31156e9: Update NullValueHandlingIgnore.aml (dotnet#2226) * JamesNK/Newtonsoft.Json@936acbf6: Update version to 13.0.1-beta and remove portable builds (dotnet#2228) * JamesNK/Newtonsoft.Json@9be95e0f: Do not treat ignored field as missing member when deserializing from overriden json constructor (dotnet#2224) The `PackagingTest.NetStandardReferenceTest()` test is updated, as the list of implicitly referenced assemblies changed: * `Microsoft.CSharp.dll` is no longer referenced * `System.Data.dll` is now referenced. It appears that the primary cause of this change is that with `Newtonsoft.Json` 12.0.3, the .NET Standard 1.3-profile assemblies were included into the app, while with 13.0.1, the .NET Standard-2.0 profile assemblies are instead used.
Changes: JamesNK/Newtonsoft.Json@12.0.3...13.0.1 * JamesNK/Newtonsoft.Json@ae9fe44e: Remove compiler package and update sourcelink (dotnet#2498) * JamesNK/Newtonsoft.Json@8ef66218: Remove prerelease for 13.0.1 * JamesNK/Newtonsoft.Json@11331f50: Update SDK to 5.0.200 (dotnet#2495) * JamesNK/Newtonsoft.Json@c7e8abc0: Update to 13.0.1-beta2 * JamesNK/Newtonsoft.Json@1745d7c1: Fix JTokenWriter when writing comment to an object (dotnet#2493) * JamesNK/Newtonsoft.Json@583eb120: Fix missing error when deserializing JToken with a contract type mismatch (dotnet#2494) * JamesNK/Newtonsoft.Json@b6dc05be: Change MaxDepth default to 64 (dotnet#2473) * JamesNK/Newtonsoft.Json@15525f1c: Fix JsonWriter.WriteToken to allow null with string token (dotnet#2472) * JamesNK/Newtonsoft.Json@926d2f0f: Enable embed untracked sources (dotnet#2471) * JamesNK/Newtonsoft.Json@0a56633b: Fixes dotnet#2372 - variable typos (dotnet#2465) * JamesNK/Newtonsoft.Json@5a35c77d: Update version to 13.0.1 (dotnet#2463) * JamesNK/Newtonsoft.Json@7e77bbe1: Change JsonReader and JsonSerializer default max depth to 128 (dotnet#2462) * JamesNK/Newtonsoft.Json@42139ea6: Add JsonSelectSettings and regex timeout * JamesNK/Newtonsoft.Json@95a6eb3a: jpath regex timeout support added for a single regex expression, global umbrella for all regex calls, and support for allowing regex calls to get compiled if necessary * JamesNK/Newtonsoft.Json@1403f5d3: Fix serializing nullable struct dictionaries (dotnet#2452) * JamesNK/Newtonsoft.Json@60be32f4: Use naming strategy when deserializing dictionary enum keys (dotnet#2448) * JamesNK/Newtonsoft.Json@ff5ffb28: Copy annotations when cloning elements (dotnet#2442) * JamesNK/Newtonsoft.Json@0cf47a46: Missing nullability annotation (dotnet#2438) * JamesNK/Newtonsoft.Json@6795ca55: Fixed tests to work in Moscow, Russia UTC+3 timezone. (dotnet#2416) * JamesNK/Newtonsoft.Json@c918ca86: Code Typo Fix: Universial => Universal (dotnet#2383) * JamesNK/Newtonsoft.Json@c298f3d6: Fix typo in SerializeTypeNameHandling sample (dotnet#2428) * JamesNK/Newtonsoft.Json@a222c8b6: Update to net50 and fix warnings (dotnet#2424) * JamesNK/Newtonsoft.Json@666d9760: Fix wrong define is used in StringUtils.ToLower() (dotnet#2304) * JamesNK/Newtonsoft.Json@a31156e9: Update NullValueHandlingIgnore.aml (dotnet#2226) * JamesNK/Newtonsoft.Json@936acbf6: Update version to 13.0.1-beta and remove portable builds (dotnet#2228) * JamesNK/Newtonsoft.Json@9be95e0f: Do not treat ignored field as missing member when deserializing from overriden json constructor (dotnet#2224) The `PackagingTest.NetStandardReferenceTest()` test is updated, as the list of implicitly referenced assemblies changed: * `Microsoft.CSharp.dll` is no longer referenced * `System.Data.dll` is now referenced. It appears that the primary cause of this change is that with `Newtonsoft.Json` 12.0.3, the .NET Standard 1.3-profile assemblies were included into the app, while with 13.0.1, the .NET Standard-2.0 profile assemblies are instead used.
Changes: JamesNK/Newtonsoft.Json@12.0.3...13.0.1 * JamesNK/Newtonsoft.Json@ae9fe44e: Remove compiler package and update sourcelink (#2498) * JamesNK/Newtonsoft.Json@8ef66218: Remove prerelease for 13.0.1 * JamesNK/Newtonsoft.Json@11331f50: Update SDK to 5.0.200 (#2495) * JamesNK/Newtonsoft.Json@c7e8abc0: Update to 13.0.1-beta2 * JamesNK/Newtonsoft.Json@1745d7c1: Fix JTokenWriter when writing comment to an object (#2493) * JamesNK/Newtonsoft.Json@583eb120: Fix missing error when deserializing JToken with a contract type mismatch (#2494) * JamesNK/Newtonsoft.Json@b6dc05be: Change MaxDepth default to 64 (#2473) * JamesNK/Newtonsoft.Json@15525f1c: Fix JsonWriter.WriteToken to allow null with string token (#2472) * JamesNK/Newtonsoft.Json@926d2f0f: Enable embed untracked sources (#2471) * JamesNK/Newtonsoft.Json@0a56633b: Fixes #2372 - variable typos (#2465) * JamesNK/Newtonsoft.Json@5a35c77d: Update version to 13.0.1 (#2463) * JamesNK/Newtonsoft.Json@7e77bbe1: Change JsonReader and JsonSerializer default max depth to 128 (#2462) * JamesNK/Newtonsoft.Json@42139ea6: Add JsonSelectSettings and regex timeout * JamesNK/Newtonsoft.Json@95a6eb3a: jpath regex timeout support added for a single regex expression, global umbrella for all regex calls, and support for allowing regex calls to get compiled if necessary * JamesNK/Newtonsoft.Json@1403f5d3: Fix serializing nullable struct dictionaries (#2452) * JamesNK/Newtonsoft.Json@60be32f4: Use naming strategy when deserializing dictionary enum keys (#2448) * JamesNK/Newtonsoft.Json@ff5ffb28: Copy annotations when cloning elements (#2442) * JamesNK/Newtonsoft.Json@0cf47a46: Missing nullability annotation (#2438) * JamesNK/Newtonsoft.Json@6795ca55: Fixed tests to work in Moscow, Russia UTC+3 timezone. (#2416) * JamesNK/Newtonsoft.Json@c918ca86: Code Typo Fix: Universial => Universal (#2383) * JamesNK/Newtonsoft.Json@c298f3d6: Fix typo in SerializeTypeNameHandling sample (#2428) * JamesNK/Newtonsoft.Json@a222c8b6: Update to net50 and fix warnings (#2424) * JamesNK/Newtonsoft.Json@666d9760: Fix wrong define is used in StringUtils.ToLower() (#2304) * JamesNK/Newtonsoft.Json@a31156e9: Update NullValueHandlingIgnore.aml (#2226) * JamesNK/Newtonsoft.Json@936acbf6: Update version to 13.0.1-beta and remove portable builds (#2228) * JamesNK/Newtonsoft.Json@9be95e0f: Do not treat ignored field as missing member when deserializing from overriden json constructor (#2224) The `PackagingTest.NetStandardReferenceTest()` test is updated, as the list of implicitly referenced assemblies changed: * `Microsoft.CSharp.dll` is no longer referenced * `System.Data.dll` is now referenced. It appears that the primary cause of this change is that with `Newtonsoft.Json` 12.0.3, the .NET Standard 1.3-profile assemblies were included into the app, while with 13.0.1, the .NET Standard-2.0 profile assemblies are instead used.
What do we want? Faster unit test execution!
How do we do that? By running things in parallel!
Some of our existing tests are already run in parallel, such as the
src/Xamarin.Android.Build.Tasks/Tests
tests which use NUnit's[Parallelizable (ParallelScope.Children)]
, but there is currently noway to run the
Xamarin.Android.Build.Tasks
NUnit testsconcurrently with the on-device
.apk
tests concurrently with theJava.Interop unit tests concurrently with...
We think there might be a "win" here, as the
Xamarin.Android.Build.Tasks
unit tests are heavily I/O bound, whilethe
.apk
BCL tests are -- presumably -- CPU bound, so executingthese at the same time might net some nice time savings.
Spike the idea by updating the
RunAllTests
target to generate ashell script which executes
msbuild
to run the appropriate testtarget, in the background, then waiting for all jobs to finish.
The generated
bin/Test$(Configuration)/parallel-targets.sh
fileresembles: