diff options
Diffstat (limited to 'tests/src/GC/Scenarios/ServerModel/server.cs')
-rw-r--r-- | tests/src/GC/Scenarios/ServerModel/server.cs | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/tests/src/GC/Scenarios/ServerModel/server.cs b/tests/src/GC/Scenarios/ServerModel/server.cs new file mode 100644 index 0000000000..fedd5afd03 --- /dev/null +++ b/tests/src/GC/Scenarios/ServerModel/server.cs @@ -0,0 +1,109 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +using System; + +namespace ServerSimulator +{ + /// <summary> + /// This class simulates the server, which allocates static data for its lifetime, + /// fills the cache, creates and retires requests + /// </summary> + internal sealed class Server + { + private Object[] static_data; + + public Server() + { + int volume = 0; + + // static_data size in Mb + static_data = new Object[1 + ServerSimulator.Params.StaticDataVolume * 1000]; + + for (int i = 0; volume < static_data.Length; i++) + { + int alloc_surv = ServerSimulator.Rand.Next(1000, 20000 + 2 * i); + static_data[i] = new byte[alloc_surv]; + volume += alloc_surv / 1000; + } + + } + + // creates requests until we reach the steady state with a full cache + public void OnePass() + { + int inst_requests = 0; + int total_reqs = 0; + int nreqs_to_steady = 0; + Request[] requests = new Request[ServerSimulator.Params.NumRequests]; + Cache cache = new Cache(ServerSimulator.Params.FifoCache); + int start = Environment.TickCount; + int split = start; + + while (true) + { + total_reqs++; + + int i = ServerSimulator.Rand.Next(0, ServerSimulator.Params.NumRequests); + if (requests[i] != null) + { + requests[i].Retire(); + } + else + { + inst_requests++; + } + + // make every nth request finalizable + if (total_reqs % (1 / ServerSimulator.Params.FinalizableRate) == 0) + { + requests[i] = new FinalizableRequest(); + } + else + { + requests[i] = new Request(); + } + + cache.Encache(); + + int stop = Environment.TickCount; + + if ((stop - split) > 4000) + { + Console.WriteLine("{0} reqs/sec", (total_reqs * 1000) / (stop - start)); + split = stop; + } + + if (cache.IsFull && (inst_requests == ServerSimulator.Params.NumRequests)) + { + if (nreqs_to_steady == 0) + { + nreqs_to_steady = total_reqs; + Console.WriteLine("took {0} iteration to reach steady state", nreqs_to_steady); + } + else if (total_reqs == ServerSimulator.Params.SteadyStateFactor * nreqs_to_steady) + { + break; + } + } + } + + for (int i = 0; i < requests.Length; i++) + { + if (requests[i] != null) + { + requests[i].Retire(); + } + } + + int fstop = Environment.TickCount; + Console.WriteLine("{0} reqs/sec", (total_reqs * 1000) / (fstop - start)); + + //cleanup + static_data = null; + cache.Clear(); + + } + } +} |