Input:;Message:Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached.
Input:;Message:Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. || Unknown error 258
这两种错误,请大神解读
This may have occurred because all pooled connections were in use and max pool size was reached.
是 may
,这是一个容易误导人的错误信息,如果因为网络问题或者数据库性能问题造成连接数据库超时,也是这个错误信息。
可能是数据库查询慢引起的,建议排查相关的 SQL 语句。
我压力测试线程数量是500个,压100轮,k8s上的实例就挂了,挂了的原因是因为健康检测请求不到,实例重启,我如果是线程数量改成100,就没有问题,我数据库连接串max pool size 是512,还又用的dapper,
@gaojiandong: 可能是线程池中的线程不够用,建议试试 如何让 ASP.NET Core 应用启动时线程池满血 中的预热方法。
@dudu: 刚开始我是通过
int processorCount = Environment.ProcessorCount;
ThreadPool.SetMinThreads(processorCount * 10, processorCount * 100); 这样设置的,看了你们的评论,貌似这种方法不管用啊,你是 if (ThreadPool.SetMinThreads(50, 50))
{
Parallel.For(0, 50, a => Thread.Sleep(1000));
} 用的这种方法吗
@gaojiandong: 是这种方法,代码放在 Startup 中
@dudu: 是sqlclient的原因,sqlclient 4.7以下版本在linux环境下,高并发下线程池只会创建十几个线程,后面直接卡死,报线程池不足不可以,换高版本后,可以解决
@gaojiandong: 谢谢分享最终的解决方法。