首页 新闻 会员 周边

.net core 3.1 数据库访问报错,线程池不足

1
悬赏园豆:10 [已解决问题] 解决于 2020-01-19 09:58

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

这两种错误,请大神解读

gaojiandong的主页 gaojiandong | 初学一级 | 园豆:194
提问于:2020-01-17 14:23
< >
分享
最佳答案
0

This may have occurred because all pooled connections were in use and max pool size was reached.

may ,这是一个容易误导人的错误信息,如果因为网络问题或者数据库性能问题造成连接数据库超时,也是这个错误信息。

可能是数据库查询慢引起的,建议排查相关的 SQL 语句。

收获园豆:10
dudu | 高人七级 |园豆:31007 | 2020-01-17 14:39

我压力测试线程数量是500个,压100轮,k8s上的实例就挂了,挂了的原因是因为健康检测请求不到,实例重启,我如果是线程数量改成100,就没有问题,我数据库连接串max pool size 是512,还又用的dapper,

gaojiandong | 园豆:194 (初学一级) | 2020-01-17 14:42

@gaojiandong: 可能是线程池中的线程不够用,建议试试 如何让 ASP.NET Core 应用启动时线程池满血 中的预热方法。

dudu | 园豆:31007 (高人七级) | 2020-01-17 14:47

@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 | 园豆:194 (初学一级) | 2020-01-17 15:13

@gaojiandong: 是这种方法,代码放在 Startup 中

dudu | 园豆:31007 (高人七级) | 2020-01-17 15:21

@dudu: 是sqlclient的原因,sqlclient 4.7以下版本在linux环境下,高并发下线程池只会创建十几个线程,后面直接卡死,报线程池不足不可以,换高版本后,可以解决

gaojiandong | 园豆:194 (初学一级) | 2020-01-19 09:58

@gaojiandong: 谢谢分享最终的解决方法。

dudu | 园豆:31007 (高人七级) | 2020-01-19 10:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册