Пример #1
0
        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());
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
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());
        }
Пример #5
0
        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
            }));
        }