Skip to content

Commit

Permalink
Adding new stress test example
Browse files Browse the repository at this point in the history
  • Loading branch information
mbdavid committed Mar 18, 2020
1 parent a04394a commit c8f1e17
Show file tree
Hide file tree
Showing 5 changed files with 84 additions and 57 deletions.
28 changes: 15 additions & 13 deletions LiteDB.Stress/Examples/test-01.xml
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
<test timeout="60s" filename="test-01.db" delete="true">
<!--<setup>CREATE INDEX idx_01 ON col1($.name);</setup>-->
<insert tasks="5" collection="col1" autoId="objectId" docs="1000~1000" sleep="10ms">
<fullName type="name" />
<age type="int" range="8~75" />
<ticket type="guid" />
<active type="bool" />
<createDate type="now" />
<updateDate type="date" range="1960-01-01~2018-12-31" />
<jsonData>{ myItem: 'abc', array: [1, 2, 3] }</jsonData>
</insert>
<task name="CHECKPOINT" sleep="10s">CHECKPOINT</task>
<task name="COUNT" sleep="1s">SELECT COUNT(*._id) FROM col1</task>
<task name="SIZE" sleep="1s">SELECT { data: FORMAT(dataFileSize, 'n0'), log: FORMAT(logFileSize, 'n0') } FROM $database</task>
<!--<setup>CREATE INDEX idx_01 ON col1($.name);</setup>-->
<insert tasks="5" collection="col1" autoId="objectId" docs="100~500" sleep="10ms">
<fullName type="name" />
<age type="int" range="8~75" />
<ticket type="guid" />
<active type="bool" />
<createDate type="now" />
<updateDate type="date" range="1960-01-01~2018-12-31" />
<jsonData>{ myItem: 'abc', array: [1, 2, 3] }</jsonData>
</insert>
<task name="UPDATE" sleep="8s">UPDATE col1 SET name = UPPER(name), large=LPAD(name, RANDOM(50, 3000), 'x')</task>
<task name="DELETE" sleep="45s">DELETE col1 WHERE 1 = 1</task>
<task name="CHECKPOINT" sleep="10s">CHECKPOINT</task>
<task name="COUNT" sleep="1s">SELECT COUNT(*) FROM col1</task>
<task name="SIZE" sleep="1s">SELECT { data: FORMAT(dataFileSize, 'n0'), log: FORMAT(logFileSize, 'n0') } FROM $database</task>
</test>
22 changes: 22 additions & 0 deletions LiteDB.Stress/Examples/test-02.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<test timeout="60s" filename="test-01.db" delete="true">
<insert collection="col1" autoId="objectId" docs="100~500" sleep="0ms">
<fullName type="name" />
<age type="int" range="8~75" />
</insert>
<insert collection="col2" autoId="objectId" docs="100~500" sleep="0ms">
<fullName type="name" />
<age type="int" range="8~75" />
</insert>
<insert collection="col3" autoId="objectId" docs="100~500" sleep="0ms">
<fullName type="name" />
<age type="int" range="8~75" />
</insert>
<insert collection="col4" autoId="objectId" docs="100~500" sleep="0ms">
<fullName type="name" />
<age type="int" range="8~75" />
</insert>
<insert collection="col5" autoId="objectId" docs="100~500" sleep="0ms">
<fullName type="name" />
<age type="int" range="8~75" />
</insert>
</test>
8 changes: 0 additions & 8 deletions LiteDB.Stress/LiteDB.Stress.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,4 @@
<ProjectReference Include="..\LiteDB\LiteDB.csproj" />
</ItemGroup>

<ItemGroup>
<Folder Include="Examples\" />
</ItemGroup>

<ItemGroup>
<PackageReference Include="System.Diagnostics.PerformanceCounter" Version="4.7.0" />
</ItemGroup>

</Project>
2 changes: 1 addition & 1 deletion LiteDB.Stress/Properties/launchSettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"profiles": {
"LiteDB.Stress": {
"commandName": "Project",
"commandLineArgs": "../../../Examples/test-01.xml"
"commandLineArgs": "../../../Examples/test-02.xml"
}
}
}
81 changes: 46 additions & 35 deletions LiteDB.Stress/Test/TestExecution.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public class TestExecution
private readonly TestFile _file;
private LiteDatabase _db;
private bool _running = true;
private int[] _cgCount = new int[3];
private long _maxRam = 0;
private readonly ConcurrentDictionary<int, ThreadInfo> _threads = new ConcurrentDictionary<int, ThreadInfo>();

public TestExecution(string filename, TimeSpan duration)
Expand Down Expand Up @@ -124,44 +124,19 @@ private void ReportThread()
{
Thread.Sleep(Math.Min(1000, (int)this.Duration.Subtract(this.Timer.Elapsed).TotalMilliseconds));

output.Clear();

for (var i = 0; i < 3; i++)
_cgCount[i] = GC.CollectionCount(i);

output.AppendLine($"LiteDB Multithreaded: {_threads.Count}, running for {this.Timer.Elapsed}");
output.AppendLine($"Garbage Collector: gen0: {_cgCount[0]}, gen1: {_cgCount[1]}, gen2: {_cgCount[2]}");
output.AppendLine();

foreach (var thread in _threads)
{
var howLong = DateTime.Now - thread.Value.LastRun;

var id = thread.Key.ToString("00");
var name = (thread.Value.Task.Name + (thread.Value.Running ? "*" : "")).PadRight(15, ' ');
var counter = thread.Value.Counter.ToString().PadRight(5, ' ');
var timer = howLong.TotalSeconds > 60 ?
((int)howLong.TotalMinutes).ToString().PadLeft(2, ' ') + " minutes" :
((int)howLong.TotalSeconds).ToString().PadLeft(2, ' ') + " seconds";
var result = thread.Value.Result != null ? $"[{thread.Value.Result.ToString()}]" : "";
var running = thread.Value.Elapsed.Elapsed.TotalSeconds > 1 ?
$"<LAST RUN {(int)thread.Value.Elapsed.Elapsed.TotalSeconds}s> " :
"";
var ex = thread.Value.Exception != null ?
" ERROR: " + thread.Value.Exception.Message :
"";

output.AppendLine($"{id}. {name} :: {counter} >> {timer} {running}{result}{ex}");
}
this.ReportPrint(output);

Console.Clear();
Console.WriteLine(output.ToString());
}

this.StopRunning();

this.Timer.Stop();

_db.Dispose();

this.ReportPrint(output);
this.ReportSummary(output);

Console.Clear();
Expand All @@ -170,6 +145,43 @@ private void ReportThread()
File.AppendAllText(_file.Output, output.ToString());
}

private void ReportPrint(StringBuilder output)
{
output.Clear();

var process = Process.GetCurrentProcess();

var ram = process.WorkingSet64 / 1024 / 1024;

_maxRam = Math.Max(_maxRam, ram);

output.AppendLine($"LiteDB Multithreaded: {_threads.Count}, running for {this.Timer.Elapsed}");
output.AppendLine($"Garbage Collector: gen0: {GC.CollectionCount(0)}, gen1: {GC.CollectionCount(1)}, gen2: {GC.CollectionCount(2)}");
output.AppendLine($"Memory usage: {ram.ToString("n0")} Mb (max: {_maxRam.ToString("n0")} Mb)");
output.AppendLine();

foreach (var thread in _threads)
{
var howLong = DateTime.Now - thread.Value.LastRun;

var id = thread.Key.ToString("00");
var name = (thread.Value.Task.Name + (thread.Value.Running ? "*" : "")).PadRight(15, ' ');
var counter = thread.Value.Counter.ToString().PadRight(5, ' ');
var timer = howLong.TotalSeconds > 60 ?
((int)howLong.TotalMinutes).ToString().PadLeft(2, ' ') + " minutes" :
((int)howLong.TotalSeconds).ToString().PadLeft(2, ' ') + " seconds";
var result = thread.Value.Result != null ? $"[{thread.Value.Result.ToString()}]" : "";
var running = thread.Value.Elapsed.Elapsed.TotalSeconds > 1 ?
$"<LAST RUN {(int)thread.Value.Elapsed.Elapsed.TotalSeconds}s> " :
"";
var ex = thread.Value.Exception != null ?
" ERROR: " + thread.Value.Exception.Message :
"";

output.AppendLine($"{id}. {name} :: {counter} >> {timer} {running}{result}{ex}");
}
}

private void ReportSummary(StringBuilder output)
{
output.AppendLine("\n=====\n");
Expand All @@ -182,13 +194,12 @@ private void ReportSummary(StringBuilder output)
var count = _threads.Values.Where(x => x.Task == task).Sum(x => (long)x.Counter).ToString().PadLeft(5, ' ');
var sum = _threads.Values.Where(x => x.Task == task).Sum(x => x.ResultSum);
var ssum = sum == 0 ? "" : $"[{sum.ToString("n0")}] - ";
var totalRun = _threads.Values.Where(x => x.Task == task).Sum(x => x.TotalRun.TotalSeconds);
var reqSec = _threads.Values
var meanRuntime = TimeSpan.FromMilliseconds(_threads.Values
.Where(x => x.Task == task)
.Select(x => (x.ResultSum == 0 ? x.Counter : x.ResultSum) / x.TotalRun.TotalSeconds)
.Sum();
.Select(x => x.TotalRun.TotalMilliseconds)
.Average());

output.AppendLine($"{name} :: {count} executions >> {ssum}Req/Sec: {reqSec.ToString("n3")}");
output.AppendLine($"{name} :: {count} executions >> {ssum}Runtime: {meanRuntime}");
}
}

Expand Down

0 comments on commit c8f1e17

Please sign in to comment.