Skip to main content

13 posts tagged with "C#"

View All Tags

Two methods to resolve StackExchange.Redis.RedisTimeoutException in C#

· 2 min read
StackExchange.Redis.RedisTimeoutException: Timeout performing SETEX (5000ms), next: SETEX AutoOps:PodLauncher:2109:LWSY:75:85001:IsMainServerRunning, inst: 0, qu: 0, qs: 1, aw: False, rs: ReadAsync, ws: Idle, in: 0, in-pipe: 0, out-pipe: 0, serverEndpoint: r-bp1je5yrr7ctdzwhmk.redis.rds.aliyuncs.com:6379, mc: 1/1/0, mgr: 10 of 10 available, clientName: 2109-85001-0, IOCP: (Busy=1,Free=999,Min=4,Max=1000), WORKER: (Busy=2,Free=32765,Min=32,Max=32767), v: 2.1.28.64774 (Please take a look at this article for some common client-side issues that can cause timeouts: https://stackexchange.github.io/StackExchange.Redis/Timeouts)
at StackExchange.Redis.ConnectionMultiplexer.ExecuteSyncImpl[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in /_/src/StackExchange.Redis/ConnectionMultiplexer.cs:line 2616
at StackExchange.Redis.RedisBase.ExecuteSync[T](Message message, ResultProcessor`1 processor, ServerEndPoint server) in /_/src/StackExchange.Redis/RedisBase.cs:line 54
at StackExchange.Redis.RedisDatabase.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags) in /_/src/StackExchange.Redis/RedisDatabase.cs:line 2500
at Q1.Foundation.RepoLibs.RedisLib.StringSet(RedisKey key, RedisValue value, Nullable`1 expiry, When when, CommandFlags flags)
at GameSvrLauncher.Lib.RedisCache.<>c__DisplayClass27_0.<set_IsMainServerRunning>b__0(ILogger logger)
at GameSvrLauncher.Lib.Utils.RetryAction(Action`1 func, String actionDesc, ILogger logger, Int32 executeTimes, Int32 sleepTimes, Action`2 warnCallback, Action`2 faultCallback)

Method #1:

Set minimal worker threads:

Way #1: By environment variables

Before .net 6:

COMPlus_ThreadPool_ForceMinWorkerThreads

.net 6

DOTNET_ThreadPool_ForceMinWorkerThreads

NOTES: The value is in hexadecimal format

ref docs: https://docs.microsoft.com/en-us/dotnet/core/run-time-config/threading https://github.com/dotnet/runtime/issues/11774

Way #2:By System.Threading.ThreadPool.SetMinThreads methods

Method #2:

Set sync timeout for redis connection.

"172.16.127.229:6379,defaultDatabase=1,syncTimeout=10000"

the default sync timeout is 5000 ms. ref docs: https://stackexchange.github.io/StackExchange.Redis/Configuration.html

[.net core template project]Console Application

· One min read
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>

<ItemGroup>
<Content Include="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="2.2.4" />
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Hosting" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Console" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="2.2.0" />
<PackageReference Include="Serilog.Extensions.Logging" Version="2.0.4" />
<PackageReference Include="Serilog.Settings.Configuration" Version="3.1.0" />
<PackageReference Include="Serilog.Sinks.Elasticsearch" Version="7.1.0" />
</ItemGroup>

</Project>
{
"Logging": {
"LogLevel": {
"Default": "Information",
"System": "Error",
"Microsoft": "Error"
}
},
"Serilog": {
"MinimumLevel": "Warning",
"WriteTo": [
{
"Name": "Elasticsearch",
"Args": {
"nodeUris": "http://127.0.0.1:9200",
"indexFormat": "consoleapp-{0:yyyy.MM.dd}",
"autoRegisterTemplate": true
}
}
]
},
"ConnectionStrings": {
"Redis": "127.0.0.1:6379"
}
}
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Serilog;
using System;
using System.IO;
using System.Threading;

namespace Example
{
/// <summary>
/// Main program
/// </summary>
class Program
{
/// <summary>
/// Main entry
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
var environmentName = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddEnvironmentVariables("ASPNETCORE_")
.AddJsonFile("appsettings.json", true)
.AddJsonFile($"appsettings.{ environmentName}.json", true)
.AddEnvironmentVariables()
.Build();

Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();

var services = new ServiceCollection()
.AddLogging((loggingBuilder) =>
{
loggingBuilder.AddConfiguration(configuration);
loggingBuilder.AddSerilog();

if (environmentName == EnvironmentName.Development)
{
loggingBuilder.AddDebug();
}

loggingBuilder.AddConsole();
});

//Register ConnectionStrings section
services.Configure<ConnectionStrings>(configuration.GetSection("ConnectionStrings"));
services.AddSingleton<IRedisLib, RedisLib>();

services.AddSingleton<Synchronizer>();

var serviceProvider = services.BuildServiceProvider();
serviceProvider.GetService<Synchronizer>().Sync(environmentName).Wait(Timeout.Infinite);
}
}
}
ClustrMaps