public static void IoTest(GenericPerformanceTestRequest request) { DiskPerformanceResult result; using (var tester = AbstractDiskPerformanceTester.ForRequest(request, Console.WriteLine)) { tester.DescribeTestParameters(); tester.TestDiskIO(); result = tester.Result; } var hasReads = request.OperationType == OperationType.Read || request.OperationType == OperationType.Mix; var hasWrites = request.OperationType == OperationType.Write || request.OperationType == OperationType.Mix; if (hasReads) { var sb = new StringBuilder(); sb.AppendLine(string.Format("Total read: {0}", SizeHelper.Humane(result.TotalRead))); sb.AppendLine(string.Format("Average read: {0}/s", SizeHelper.Humane(result.TotalRead / request.TimeToRunInSeconds))); sb.AppendLine("Read latency"); sb.AppendLine(string.Format("\tMin: {0:#,#.##;;0}", result.ReadLatency.Min)); sb.AppendLine(string.Format("\tMean: {0:#,#.##;;0}", result.ReadLatency.Mean)); sb.AppendLine(string.Format("\tMax: {0:#,#.##;;0}", result.ReadLatency.Max)); sb.AppendLine(string.Format("\tStdev: {0:#,#.##;;0}", result.ReadLatency.Stdev)); sb.AppendLine("Read latency percentiles"); foreach (var percentile in result.ReadLatency.Percentiles) { sb.AppendLine(string.Format("\t{0}: {1:#,#.##;;0}", percentile.Key, percentile.Value)); } sb.AppendLine(); Console.WriteLine(sb.ToString()); } if (hasWrites) { var sb = new StringBuilder(); sb.AppendLine(string.Format("Total write: {0}", SizeHelper.Humane(result.TotalWrite))); sb.AppendLine(string.Format("Average write: {0}/s", SizeHelper.Humane(result.TotalWrite / request.TimeToRunInSeconds))); sb.AppendLine("Write latency"); sb.AppendLine(string.Format("\tMin: {0:#,#.##;;0}", result.WriteLatency.Min)); sb.AppendLine(string.Format("\tMean: {0:#,#.##;;0}", result.WriteLatency.Mean)); sb.AppendLine(string.Format("\tMax: {0:#,#.##;;0}", result.WriteLatency.Max)); sb.AppendLine(string.Format("\tStdev: {0:#,#.##;;0}", result.WriteLatency.Stdev)); sb.AppendLine("Write latency percentiles"); foreach (var percentile in result.WriteLatency.Percentiles) { sb.AppendLine(string.Format("\t{0}: {1:#,#.##;;0}", percentile.Key, percentile.Value)); } sb.AppendLine(); Console.WriteLine(sb.ToString()); } }
public void TestBatchPerformanceTest() { var performanceRequest = new BatchPerformanceTestRequest { FileSize = (long)1024 * 1024 * 1024, NumberOfDocuments = 1000000, NumberOfDocumentsInBatch = 200, Path = Path.GetTempPath(), SizeOfDocuments = 756, WaitBetweenBatches = 5 }; var tester = AbstractDiskPerformanceTester.ForRequest(performanceRequest, s => { }); tester.TestDiskIO(); var result = tester.Result; Assert.True(result.TotalWrite > 0); Assert.Equal(0, result.TotalRead); }
public void TestRandomRead() { var performanceRequest = new GenericPerformanceTestRequest { FileSize = (long)128 * 1024, OperationType = OperationType.Read, Path = Path.GetTempPath(), Sequential = false, ThreadCount = 4, TimeToRunInSeconds = 5, ChunkSize = 4 * 1024 }; var tester = AbstractDiskPerformanceTester.ForRequest(performanceRequest, s => { }); tester.TestDiskIO(); var result = tester.Result; Assert.Equal(0, result.TotalWrite); Assert.True(result.TotalRead > 0); }
public void TestCanCancelPerformanceTest() { var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); var performanceRequest = new GenericPerformanceTestRequest { FileSize = (long)128 * 1024, OperationType = OperationType.Mix, Path = Path.GetTempPath(), Sequential = false, ThreadCount = 4, TimeToRunInSeconds = 30, ChunkSize = 4 * 1024 }; var tester = AbstractDiskPerformanceTester.ForRequest(performanceRequest, s => { }, cts.Token); Assert.Throws <OperationCanceledException>(() => tester.TestDiskIO()); }
public async Task <HttpResponseMessage> IoTest() { if (EnsureSystemDatabase() == false) { return(GetMessageWithString("IO Test is only possible from the system database", HttpStatusCode.BadRequest)); } var json = await ReadJsonAsync(); var testType = json.Value <string>("TestType"); AbstractPerformanceTestRequest ioTestRequest; switch (testType) { case GenericPerformanceTestRequest.Mode: ioTestRequest = json.JsonDeserialization <GenericPerformanceTestRequest>(); break; case BatchPerformanceTestRequest.Mode: ioTestRequest = json.JsonDeserialization <BatchPerformanceTestRequest>(); break; default: return(GetMessageWithObject(new { Error = "test type is invalid: " + testType }, HttpStatusCode.BadRequest)); } if (Directory.Exists(ioTestRequest.Path) == false) { return(GetMessageWithString(string.Format("Directory {0} doesn't exist.", ioTestRequest.Path), HttpStatusCode.BadRequest)); } Database.Documents.Delete(AbstractDiskPerformanceTester.PerformanceResultDocumentKey, null, null); var killTaskCts = new CancellationTokenSource(); var task = Task.Factory.StartNew(() => { var debugInfo = new List <string>(); using (var diskIo = AbstractDiskPerformanceTester.ForRequest(ioTestRequest, debugInfo.Add, killTaskCts.Token)) { diskIo.TestDiskIO(); var diskIoRequestAndResponse = new { Request = ioTestRequest, Result = diskIo.Result, DebugMsgs = debugInfo }; Database.Documents.Put(AbstractDiskPerformanceTester.PerformanceResultDocumentKey, null, RavenJObject.FromObject(diskIoRequestAndResponse), new RavenJObject(), null); } }); long id; Database.Tasks.AddTask(task, new TaskBasedOperationState(task), new TaskActions.PendingTaskDescription { StartTime = SystemTime.UtcNow, TaskType = TaskActions.PendingTaskType.IoTest, Payload = "Disk performance test" }, out id, killTaskCts); return(GetMessageWithObject(new { OperationId = id })); }