8000 Improve StressTest · cnblogs/EnyimMemcachedCore@e984948 · GitHub
[go: up one dir, main page]

Skip to content

Commit e984948

Browse files
committed
Improve StressTest
1 parent fa872c6 commit e984948

File tree

3 files changed

+96
-64
lines changed

3 files changed

+96
-64
lines changed

Enyim.StressTest/Enyim.StressTest.csproj

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,17 @@
66
<LangVersion>latest</LangVersion>
77
</PropertyGroup>
88

9+
<ItemGroup>
10+
<None Remove="appsettings.json" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<Content Include="appsettings.json">
15+
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
16+
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
17+
</Content>
18+
</ItemGroup>
19+
920
<ItemGroup>
1021
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
1122
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />

Enyim.StressTest/Program.cs

Lines changed: 56 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Enyim.Caching;
22
using Microsoft.Extensions.Configuration;
33
using Microsoft.Extensions.DependencyInjection;
4+
using Microsoft.Extensions.Hosting;
45
using Microsoft.Extensions.Logging;
56
using System;
67
using System.Diagnostics;
@@ -10,125 +11,116 @@
1011

1112
namespace Enyim.StressTest
1213
{
14+
1315
class Foo
1416
{
1517
public int[] Numbers { get; set; }
16-
public DateTime DateTime { get; set; }
18+
public DateTime DateTime { get; set; } = DateTime.Now;
1719
}
1820

1921
//From https://github.com/ZeekoZhu/memcachedcore-stress
2022
class Program
2123
{
24+
private static IMemcachedClient _memcachedClient;
25+
private static int _runTimes = 100000;
26+
private static readonly string _cacheKey = "enyim-stress-test";
27+
private static ILogger _logger;
28+
2229
static async Task Main(string[] args)
2330
{
24-
var services = new ServiceCollection();
25-
services.AddEnyimMemcached(options => options.AddServer("memcached", 11211));
26-
services.AddLogging(x => x.AddConsole().SetMinimumLevel(LogLevel.Debug));
27-
await Run(services.BuildServiceProvider());
31+
var host = new HostBuilder()
32+
.ConfigureHostConfiguration(_ => _.AddJsonFile("appsettings.json", true))
33+
.ConfigureLogging(_ => _.AddConsole())
34+
.ConfigureServices(_ => _.AddEnyimMemcached())
35+
.Build();
36+
37+
_memcachedClient = host.Services.GetRequiredService<IMemcachedClient>();
38+
_logger = host.Services.GetRequiredService<ILogger<Program>>();
39+
var runTimes = host.Services.GetRequiredService<IConfiguration>().GetValue<int?>("RunTimes");
40+
_runTimes = runTimes.HasValue ? runTimes.Value : _runTimes;
41+
42+
await Run();
2843
}
2944

30-
static async Task TrySingle(IServiceProvider sp)
45+
static async Task TrySingle()
3146
{
32-
using (var scope = sp.CreateScope())
33-
{
34-
var memcached = scope.ServiceProvider.GetService<IMemcachedClient>();
35-
memcached.Add("test", new Foo(), Int32.MaxValue);
36-
var test = await memcached.GetValueAsync<Foo>("test");
37-
Console.WriteLine("Single Run: {0}", test.DateTime);
38-
}
47+
await _memcachedClient.SetAsync(_cacheKey, new Foo(), 36000);
48+
var test = await _memcachedClient.GetValueAsync<Foo>(_cacheKey);
49+
Console.WriteLine("Single Run: {0}", test.DateTime);
3950
}
4051

41-
static async Task RunSync(int cnt, IServiceProvider sp)
52+
static async Task RunSync(int cnt)
4253
{
4354
Console.WriteLine("Use Get");
44-
await TrySingle(sp);
55+
await TrySingle();
4556
var sw = Stopwatch.StartNew();
46-
var obj = new object();
4757
var errCnt = 0;
48-
var tasks =
49-
Enumerable.Range(0, cnt)
58+
var tasks = Enumerable.Range(0, cnt)
5059
.Select(i => Task.Run(() =>
5160
{
52-
using (var scope = sp.CreateScope())
61+
62+
try
5363
{
54-
var provider = scope.ServiceProvider;
55-
var memcached = provider.GetService<IMemcachedClient>();
56-
try
57-
{
58-
var foo = memcached.Get<Foo>("test");
59-
if (foo == null)
60-
{
61-
throw new Exception();
62-
}
63-
}
64-
catch (Exception e)
64+
var foo = _memcachedClient.Get<Foo>(_cacheKey);
65+
if (foo == null)
6566
{
66-
lock (obj)
67-
{
68-
errCnt += 1;
69-
}
70-
71-
// Console.WriteLine("Task: {0} Exception: {1}", i, e.GetType().FullName);
67+
Interlocked.Increment(ref errCnt);
7268
}
7369
}
70+
catch (Exception e)
71+
{
72+
Interlocked.Increment(ref errCnt);
73+
}
7474
}));
7575
await Task.WhenAll(tasks);
7676
sw.Stop();
77+
7778
Thread.Sleep(TimeSpan.FromSeconds(3));
78-
await TrySingle(sp);
79+
await TrySingle();
7980
Console.WriteLine($"Time: {sw.ElapsedMilliseconds}ms");
8081
Console.WriteLine($"Error Cnt: {errCnt}");
8182
Console.WriteLine($"Avg: {Convert.ToDouble(sw.ElapsedMilliseconds) / Convert.ToDouble(cnt)}ms");
8283
}
8384

84-
static async Task RunAsync(int cnt, IServiceProvider sp)
85+
static async Task RunAsync(int cnt)
8586
{
8687
Console.WriteLine("Use GetValueAsync");
87-
await TrySingle(sp);
88+
await TrySingle();
8889
var sw = Stopwatch.StartNew();
8990
var obj = new object();
9091
var errCnt = 0;
91-
var tasks =
92-
Enumerable.Range(0, cnt)
92+
var tasks = Enumerable.Range(0, cnt)
9393
.Select(i => Task.Run(async () =>
9494
{
95-
using (var scope = sp.CreateScope())
95+
try
9696
{
97-
var provider = scope.ServiceProvider;
98-
var memcached = provider.GetService<IMemcachedClient>();
99-
try
100-
{
101-
var foo = await memcached.GetValueAsync<Foo>("test");
102-
if (foo == null)
103-
{
104-
throw new Exception();
105-
}
106-
}
107-
catch (Exception e)
97+
var foo = await _memcachedClient.GetValueAsync<Foo>(_cacheKey);
98+
if (foo == null)
10899
{
109-
lock (obj)
110-
{
111-
errCnt += 1;
112-
}
113-
114-
//Console.WriteLine("Task: {0} Exception: {1}", i, e.GetType().FullName);
100+
_logger.LogError("GetValueAsync return null");
101+
Interlocked.Increment(ref errCnt);
115102
}
116103
}
104+
catch (Exception ex)
105+
{
106+
_logger.LogError(ex, $"Exception on GetValueAsync");
107+
Interlocked.Increment(ref errCnt);
108+
}
117109
}));
118110
await Task.WhenAll(tasks);
119111
sw.Stop();
120112
Thread.Sleep(TimeSpan.FromSeconds(3));
121-
await TrySingle(sp);
113+
await TrySingle();
122114
Console.WriteLine($"Time: {sw.ElapsedMilliseconds}ms");
123115
Console.WriteLine($"Error Cnt: {errCnt}");
124116
Console.WriteLine($"Avg: {Convert.ToDouble(sw.ElapsedMilliseconds) / Convert.ToDouble(cnt)}ms");
125117
}
126118

127-
static async Task Run(IServiceProvider sp)
119+
static async Task Run()
128120
{
129-
var cnt = 1000000;
130-
await RunAsync(cnt, sp);
131-
await RunSync(cnt, sp);
121+
var cnt = _runTimes;
122+
await RunAsync(cnt);
123+
//await RunSync(cnt);
132124
}
133125
}
134126
}

Enyim.StressTest/appsettings.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
{
2+
"requestTimes": "100000",
3+
"enyimMemcached": {
4+
"Servers": [
5+
{
6+
"Address": "memcached",
7+
"Port": 11211
8+
}
9+
],
10+
"socketPool": {
11+
"minPoolSize": "5",
12+
"maxPoolSize": "25",
13+
"connectionTimeout": "00:00:15",
14+
"receiveTimeout": "00:00:15",
15+
"deadTimeout": "00:00:15",
16+
"queueTimeout": "00:00:00.150"
17+
}
18+
},
19+
20+
"Logging": {
21+
"IncludeScopes": false,
22+
"LogLevel": {
23+
"Default": "Debug",
24+
"System": "Debug",
25+
"Microsoft": "Debug",
26+
"Enyim": "Debug"
27+
}
28+
}
29+
}

0 commit comments

Comments
 (0)
0