Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
a913193
[profiler] Add counters for all event types.
Sep 9, 2016
ae0828f
[profiler] Fix the code that synthesizes thread end events.
Sep 9, 2016
d933617
[profiler] Don't emit a perf counters sample event if none are regist…
Sep 9, 2016
0db4281
[profiler] Simplify counters initialization.
Sep 9, 2016
03d6935
[profiler] Don't leak counter data structures on shutdown.
Sep 9, 2016
46b3f65
[profiler] Lift profiler limitation in mono_class_get_allocation_ftn ().
Sep 9, 2016
b6518ec
[profiler] Remove some indirection in setting up GC events.
Sep 9, 2016
b334afd
[profiler] Use the signal shutdown logic for the sampling thread for …
Sep 9, 2016
b9d7a08
[man] Update mprof-report.1 to indicate the correct default maxframes…
Sep 9, 2016
4199952
[profiler] Remove the countersonly option.
Sep 9, 2016
129560c
[profiler] Document and fix the onlycoverage option.
Sep 9, 2016
c4f5bc9
[profiler] Remove the long-obsolete hsmode option.
Sep 9, 2016
39080bf
[utils] Move MONO_DEPRECATED to mono-publib.h and make it imply MONO_…
Sep 9, 2016
e9a95b9
[sgen] Remove bogus mono_profiler_events assert.
Sep 9, 2016
77bf968
[ci] Bump the timeout of the profiler stress test suite to 24 hours.
Sep 10, 2016
a2f0612
[acceptance-tests] Improve the profiler-stress test runner.
Sep 10, 2016
f1c9485
[profiler] Remove utils.c/utils.h, move the code to proflog.c/decode.…
Sep 9, 2016
5640531
[profiler] Rename proflog.{c,h} to mono-profiler-log.{c,h} for consis…
Sep 10, 2016
bb1813c
[profiler] Rename decode.c to mprof-report.c.
Sep 10, 2016
4acc3df
[sgen] Always report object moves on the GC thread.
Sep 10, 2016
348688a
[profiler] Add an extra assert.
Sep 12, 2016
4533cd9
[profiler] Don't flush empty log buffers.
Sep 12, 2016
51a03a7
[profiler] Fix several race conditions in accessing MonoProfilerThrea…
Sep 12, 2016
f802cbb
[profiler] Add a missing deinit_thread () call to the helper thread.
Sep 12, 2016
99aa56a
[profiler] Encapsulate some common logic in the ENTER_LOG/EXIT_LOG ma…
Sep 12, 2016
d4374ae
[profiler] Always enable the helper thread.
Sep 12, 2016
2a45034
[profiler] assert () -> g_assert ().
Sep 12, 2016
9f7349c
[profiler] Remove some broken, commented-out code from register_metho…
Sep 12, 2016
b73e63c
[profiler] Remove mono_threads_attach_tools_thread () declaration.
Sep 12, 2016
82f2c9b
[profiler] Clean up the #include mess in mono-profiler-log.c.
Sep 12, 2016
f9ad9d9
[profiler] Remove the ign_res () hack.
Sep 12, 2016
96f9415
[profiler] Add messages to most assertions.
Sep 12, 2016
99af8b6
[profiler] Replace a check with an assert in coverage_filter ().
Sep 12, 2016
1e4e265
[profiler] Fix the way the profiler frees hazardous data on shutdown.
Sep 12, 2016
a22f577
[profiler] Remove the need to pass a MonoProfiler argument to some fu…
Sep 12, 2016
9127dfa
[profiler] Process requests in method_jitted ().
Sep 12, 2016
b5205f7
[profiler] Clean up and improve the helper thread code.
Sep 13, 2016
3e9a0d4
[profiler] Disable GC move events when allocation events are disabled.
Sep 13, 2016
a6f95ab
[utils/lfa] Add a missing #include to fix the profiler build.
Sep 13, 2016
e998d88
[profiler] Drop support for perf events on Linux.
Sep 14, 2016
36cb2ec
[profiler] Access in_shutdown atomically.
Sep 14, 2016
7883db9
[utils/threads] Export all native thread functions.
Sep 14, 2016
d78ba0e
[utils/threads] Add and export a mono_native_thread_join () function.
Sep 14, 2016
76c2b67
[profiler] Use the native thread wrapper functions to manage threads.
Sep 14, 2016
ffbf540
[profiler] Warn if we can't detect the CPU count.
Sep 14, 2016
d3ff7dc
[profiler] Use eglib alloc/free functions everywhere.
Sep 14, 2016
cf076eb
[profiler] Address a couple of FIXMEs in the counters sampling code.
Sep 14, 2016
61d6684
[profiler] Add a nocounters option.
Sep 14, 2016
c42acf8
[profiler] Don't emit enter/leave events in onlycoverage mode.
Sep 14, 2016
958919f
[profiler] Bump profiler version to v1.1.
Sep 14, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion acceptance-tests/profiler-stress.mk
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ SYS_REFS = \
System.Data.dll \
System.Runtime.Serialization.dll \
System.Xml.dll \
System.Xml.Linq.dll
System.Xml.Linq.dll \
Mono.Posix.dll

check-profiler-stress:
@$(MAKE) validate-benchmarker RESET_VERSIONS=1
Expand Down
204 changes: 187 additions & 17 deletions acceptance-tests/profiler-stress/runner.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using System.Xml;
using Mono.Unix.Native;
using Newtonsoft.Json;

// Shut up CLS compliance warnings from Json.NET.
Expand All @@ -10,7 +17,8 @@
namespace Mono.Profiling.Tests.Stress {

// https://github.com/xamarin/benchmarker/blob/master/tools/libdbmodel/Benchmark.cs
class Benchmark {
sealed class Benchmark {

public string Name { get; set; }
public string TestDirectory { get; set; }
public bool OnlyExplicit { get; set; }
Expand All @@ -24,8 +32,24 @@ public static Benchmark Load (string file)
}
}

sealed class TestResult {

public Benchmark Benchmark { get; set; }
public ProcessStartInfo StartInfo { get; set; }
public Stopwatch Stopwatch { get; set; } = new Stopwatch ();
public int? ExitCode { get; set; }
public StringBuilder StandardOutput { get; set; } = new StringBuilder ();
public StringBuilder StandardError { get; set; } = new StringBuilder ();
}

static class Program {

static readonly TimeSpan _timeout = TimeSpan.FromHours (6);

static string FilterInvalidXmlChars (string text) {
return Regex.Replace (text, @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]", string.Empty);
}

static int Main ()
{
var depDir = Path.Combine ("..", "external", "benchmarker");
Expand All @@ -44,8 +68,7 @@ static int Main ()
var rand = new Random ();
var cpus = Environment.ProcessorCount;

var successes = 0;
var failures = 0;
var results = new List<TestResult> (benchmarks.Length);

var sw = Stopwatch.StartNew ();

Expand All @@ -66,6 +89,8 @@ static int Main ()
WorkingDirectory = Path.Combine (testDir, bench.TestDirectory),
FileName = monoPath,
Arguments = $"--debug --profile=log:{profOptions} " + string.Join (" ", bench.CommandLine),
RedirectStandardOutput = true,
RedirectStandardError = true,
};

info.EnvironmentVariables.Clear ();
Expand All @@ -77,32 +102,177 @@ static int Main ()
Console.WriteLine ($"[{sw.Elapsed.ToString ("G")}] {progress} Running {bench.Name} with profiler options: {profOptions}");
Console.ResetColor ();

var sw2 = Stopwatch.StartNew ();
var result = new TestResult {
Benchmark = bench,
StartInfo = info,
};

using (var proc = new Process ()) {
proc.StartInfo = info;

proc.OutputDataReceived += (sender, args) => {
if (args.Data != null)
result.StandardOutput.AppendLine (args.Data);
};

proc.ErrorDataReceived += (sender, args) => {
if (args.Data != null)
result.StandardError.AppendLine (args.Data);
};

result.Stopwatch.Start ();

using (var proc = Process.Start (info)) {
proc.WaitForExit ();
sw2.Stop ();
proc.Start ();

Console.WriteLine ();
proc.BeginOutputReadLine ();
proc.BeginErrorReadLine ();

if (proc.ExitCode != 0)
failures++;
else
successes++;
if (!proc.WaitForExit ((int) _timeout.TotalMilliseconds)) {
// Force a thread dump.
Syscall.kill (proc.Id, Signum.SIGQUIT);
Thread.Sleep (1000);

Console.ForegroundColor = proc.ExitCode != 0 ? ConsoleColor.Red : ConsoleColor.Green;
Console.WriteLine ($"[{sw.Elapsed.ToString ("G")}] {progress} {bench.Name} took {sw2.Elapsed.ToString ("G")} and exited with code: {proc.ExitCode}");
try {
proc.Kill ();
} catch (Exception) {
}
} else
result.ExitCode = proc.ExitCode;

result.Stopwatch.Stop ();
}

var resultStr = result.ExitCode == null ? "timed out" : $"exited with code: {result.ExitCode}";

Console.ForegroundColor = result.ExitCode != 0 ? ConsoleColor.Red : ConsoleColor.Green;
Console.WriteLine ($"[{sw.Elapsed.ToString ("G")}] {progress} {bench.Name} took {result.Stopwatch.Elapsed.ToString ("G")} and {resultStr}");
Console.ResetColor ();

if (result.ExitCode != 0) {
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine ("===== stdout =====");
Console.ResetColor ();

Console.WriteLine (result.StandardOutput.ToString ());

Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine ("===== stderr =====");
Console.ResetColor ();

Console.WriteLine (result.StandardError.ToString ());
}

results.Add (result);
}

sw.Stop ();

Console.ForegroundColor = failures != 0 ? ConsoleColor.Red : ConsoleColor.Green;
Console.WriteLine ($"[{sw.Elapsed.ToString ("G")}] Finished with {successes}/{benchmarks.Length} passing tests");
var successes = results.Count (r => r.ExitCode == 0);
var failures = results.Count (r => r.ExitCode != null && r.ExitCode != 0);
var timeouts = results.Count (r => r.ExitCode == null);

var settings = new XmlWriterSettings {
NewLineOnAttributes = true,
Indent = true,
};

using (var writer = XmlWriter.Create ("TestResult-profiler-stress.xml", settings)) {
writer.WriteStartDocument ();
writer.WriteComment ("This file represents the results of running a test suite");

writer.WriteStartElement ("test-results");
writer.WriteAttributeString ("name", "profiler-stress-tests.dummy");
writer.WriteAttributeString ("total", results.Count.ToString ());
writer.WriteAttributeString ("failures", failures.ToString ());
writer.WriteAttributeString ("not-run", "0");
writer.WriteAttributeString ("date", DateTime.Now.ToString ("yyyy-MM-dd"));
writer.WriteAttributeString ("time", DateTime.Now.ToString ("HH:mm:ss"));

writer.WriteStartElement ("environment");
writer.WriteAttributeString ("nunit-version", "2.4.8.0");
writer.WriteAttributeString ("clr-version", Environment.Version.ToString ());
writer.WriteAttributeString ("os-version", Environment.OSVersion.ToString ());
writer.WriteAttributeString ("platform", Environment.OSVersion.Platform.ToString ());
writer.WriteAttributeString ("cwd", Environment.CurrentDirectory);
writer.WriteAttributeString ("machine-name", Environment.MachineName);
writer.WriteAttributeString ("user", Environment.UserName);
writer.WriteAttributeString ("user-domain", Environment.UserDomainName);
writer.WriteEndElement ();

writer.WriteStartElement ("culture-info");
writer.WriteAttributeString ("current-culture", CultureInfo.CurrentCulture.Name);
writer.WriteAttributeString ("current-uiculture", CultureInfo.CurrentUICulture.Name);
writer.WriteEndElement ();

writer.WriteStartElement ("test-suite");
writer.WriteAttributeString ("name", "profiler-stress-tests.dummy");
writer.WriteAttributeString ("success", (failures + timeouts == 0).ToString ());
writer.WriteAttributeString ("time", ((int) sw.Elapsed.TotalSeconds).ToString ());
writer.WriteAttributeString ("asserts", (failures + timeouts).ToString ());
writer.WriteStartElement ("results");

writer.WriteStartElement ("test-suite");
writer.WriteAttributeString ("name", "MonoTests");
writer.WriteAttributeString ("success", (failures + timeouts == 0).ToString ());
writer.WriteAttributeString ("time", ((int) sw.Elapsed.TotalSeconds).ToString ());
writer.WriteAttributeString ("asserts", (failures + timeouts).ToString ());
writer.WriteStartElement ("results");

writer.WriteStartElement ("test-suite");
writer.WriteAttributeString ("name", "profiler-stress");
writer.WriteAttributeString ("success", (failures + timeouts == 0).ToString ());
writer.WriteAttributeString ("time", ((int) sw.Elapsed.TotalSeconds).ToString ());
writer.WriteAttributeString ("asserts", (failures + timeouts).ToString ());
writer.WriteStartElement ("results");

foreach (var result in results) {
var timeoutStr = result.ExitCode == null ? "_timeout" : string.Empty;

writer.WriteStartElement ("test-case");
writer.WriteAttributeString ("name", $"MonoTests.profiler-stress.{result.Benchmark.Name}{timeoutStr}");
writer.WriteAttributeString ("executed", "True");
writer.WriteAttributeString ("success", (result.ExitCode == 0).ToString ());
writer.WriteAttributeString ("time", ((int) result.Stopwatch.Elapsed.TotalSeconds).ToString ());
writer.WriteAttributeString ("asserts", result.ExitCode == 0 ? "0" : "1");

if (result.ExitCode != 0) {
writer.WriteStartElement ("failure");

writer.WriteStartElement ("message");
writer.WriteCData (FilterInvalidXmlChars (result.StandardOutput.ToString ()));
writer.WriteEndElement ();

writer.WriteStartElement ("stack-trace");
writer.WriteCData (FilterInvalidXmlChars (result.StandardError.ToString ()));
writer.WriteEndElement ();

writer.WriteEndElement ();
}

writer.WriteEndElement ();
}

writer.WriteEndElement ();
writer.WriteEndElement ();

writer.WriteEndElement ();
writer.WriteEndElement ();

writer.WriteEndElement ();
writer.WriteEndElement ();

writer.WriteEndElement ();

writer.WriteEndDocument ();
}

var failureStr = failures + timeouts != 0 ? $" ({failures} failures, {timeouts} timeouts)" : string.Empty;

Console.ForegroundColor = failures + timeouts != 0 ? ConsoleColor.Red : ConsoleColor.Green;
Console.WriteLine ($"[{sw.Elapsed.ToString ("G")}] Finished with {successes}/{results.Count} passing tests{failureStr}");
Console.ResetColor ();

return failures;
return failures + timeouts;
}
}
}
20 changes: 0 additions & 20 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -1162,20 +1162,6 @@ AC_COMPILE_IFELSE([
AC_MSG_RESULT(no)
])

AC_MSG_CHECKING(for deprecated __attribute__)
AC_TRY_COMPILE([
int doit (void) __attribute__ ((deprecated));
int doit (void) { return 0; }
], [
return 0;
], [
have_deprecated=yes
AC_MSG_RESULT(yes)
], [
have_deprecated=no
AC_MSG_RESULT(no)
])

dnl
dnl Boehm GC configuration
dnl
Expand Down Expand Up @@ -2672,12 +2658,6 @@ fi

AC_ARG_ENABLE(bcl-opt, [ --disable-bcl-opt BCL is compiled with no optimizations (allows accurate BCL debugging)], test_bcl_opt=$enableval, test_bcl_opt=yes)

AC_ARG_ENABLE(perf-events, [ --enable-perf-events Enable using `perf` for profiling on Linux], test_perf_events=$enableval, test_perf_events=no)
if test "x$test_perf_events" = "xyes"; then
AC_DEFINE(ENABLE_PERF_EVENTS, 1, [Enable using `perf` for profiling on Linux])
AC_SUBST(ENABLE_PERF_EVENTS)
fi

AC_MSG_CHECKING([if big-arrays are to be enabled])
AC_ARG_ENABLE(big-arrays, [ --enable-big-arrays Enable the allocation and indexing of arrays greater than Int32.MaxValue], enable_big_arrays=$enableval, enable_big_arrays=no)
if test "x$enable_big_arrays" = "xyes" ; then
Expand Down
Loading