c#-低负载下与数据库的连接问题(dotnet核心)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c#-低负载下与数据库的连接问题(dotnet核心),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3676字,纯文字阅读大概需要6分钟。
内容图文
![c#-低负载下与数据库的连接问题(dotnet核心)](/upload/InfoBanner/zyjiaocheng/883/2ce367c5dec44f90a0ae7f169efaf0fd.jpg)
我正在尝试对基本API进行负载测试,已经开始从数据库连接中遇到一些奇怪的问题.
现在,我将其范围缩小到SQL连接本身. (我使用SELECT 1仅测试连接)
在极低的负载(每秒15个呼叫)下,所有功能均按预期工作.
在低负载(每秒25个呼叫)下,前4-5个呼叫以正常速度返回,然后迅速降低速度.由于池中没有连接,许多呼叫超时.
在中等负载(每秒50个呼叫)下,所有内容完全锁定,什么也没回来.我开始感到奇怪,例如在建立与SQL Server的连接时发生了与网络相关或特定于实例的错误.接下来.无法再次从池中获得连接.
服务器上的exec sp_who2也不显示来自dotnet的连接.
更糟的是,从中恢复的唯一方法是弹跳整个服务.
我已经排除了服务器本身,因为这发生在功能强大的本地SQL服务器,azureSql数据库以及在docker上运行的本地服务上.
int selected = 0;
var timer = Stopwatch.StartNew();
using (SqlConnection connection = CreateNewConnection())
{
try
{
connection.Open();
selected = connection.QueryFirst<int>("SELECT 1");
timer.Stop();
}
catch (Exception e)
{
Console.WriteLine("Failed connection");
Console.WriteLine("fatal " + e.Message);
responseBuilder.AddErrors(e);
}
finally
{
connection.Close();
}
}
responseBuilder.WithResult(new {selected, ms = timer.ElapsedMilliseconds});
我什至尝试处理,并强制手动关闭连接以了解发生了什么.
这正在运行dotnet core和dapper(即使没有dapper,我也会遇到相同的问题)
我还尝试将最大连接池限制提高到1000之类的荒谬数字,但没有任何效果.
编辑
经过更多尝试后,我决定尝试使用Postgres.完美地以每秒超过1k的呼叫速度运行.
我在sql server本身上缺少什么吗?或在连接上?
需要指出的是,这些是shot弹枪.因此,批处理将尽快解雇,然后等待每个请求返回.
这也正在使用linux(环境是docker k8s)
有人想知道如何建立连接
private IDbConnection CreateNewConnection()
{
var builder = new SqlConnectionStringBuilder()
{
UserID = "sa",
Password = "012Password!",
InitialCatalog = "test",
DataSource = "localhost",
MultipleActiveResultSets = true,
MaxPoolSize = 1000
};
return new SqlConnection(builder.ConnectionString);
}
另一个注意
不花钱(等待上一个呼叫完成,然后再发送另一个)似乎具有足够的吞吐量.似乎同时处理了太多请求
版本信息
dotnet 2.1.401
SqlClient 4.5.1
解决方法:
我可以确认发生了一些可疑的情况,但可能没有汇总.我创建了一个控制台应用程序,并从Windows控制台和WSL控制台在同一框中运行它.这样,我可以从相同的客户端但在不同的OS /运行时上运行相同的代码.
在Windows上,即使使用了荒谬的500 DOP,每个连接也花费了不到一毫秒的时间:
985 : 00:00:00.0002307
969 : 00:00:00.0002107
987 : 00:00:00.0002270
989 : 00:00:00.0002392
即使DOP为20,WSL中的相同代码也将花费8秒或更长时间! DOP值较大会导致超时. 10将产生类似于Windows的结果.
一旦我禁用了MARS,尽管性能恢复正常:
983 : 00:00:00.0083687
985 : 00:00:00.0083759
987 : 00:00:00.0083971
989 : 00:00:00.0083938
992 : 00:00:00.0084922
991 : 00:00:00.0045206
994 : 00:00:00.0044566
与直接在Windows上运行相比,这仍然慢了20倍,但是直到您并排检查数字时才注意到.
这是我在两种情况下使用的代码:
static void Main(string[] args)
{
Console.WriteLine("Starting");
var options=new ParallelOptions { MaxDegreeOfParallelism = 500 };
var watch=Stopwatch.StartNew();
Parallel.For(0,1000,options,Call);
Console.WriteLine($"Finished in {watch.Elapsed}");
}
public static void Call(int i)
{
var watch = Stopwatch.StartNew();
using (SqlConnection connection = CreateNewConnection())
{
try
{
connection.Open();
var cmd=new SqlCommand($"SELECT {i}",connection);
var selected =cmd.ExecuteScalar();
Console.WriteLine($"{selected} : {watch.Elapsed}");
}
catch (Exception e)
{
Console.WriteLine($"Ooops!: {e}");
}
}
}
private static SqlConnection CreateNewConnection()
{
var builder = new SqlConnectionStringBuilder()
{
UserID = "someUser",
Password = "somPassword",
InitialCatalog = "tempdb",
DataSource = @"localhost",
MultipleActiveResultSets = true,
Pooling=true //true by default
//MaxPoolSize is 100 by default
};
return new SqlConnection(builder.ConnectionString);
}
}
内容总结
以上是互联网集市为您收集整理的c#-低负载下与数据库的连接问题(dotnet核心)全部内容,希望文章能够帮你解决c#-低负载下与数据库的连接问题(dotnet核心)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。