TaurusDB建立连接慢导致客户端超时
场景描述
业务在高峰期时,客户端经常出现向MySQL建立连接超时,导致系统登录需要十几秒。
原因分析
- 查看TaurusDB的错误日志,观察是否有如下信息:connection xxx is established slowly。示例:
有上述日志,说明存在某些连接超过一定时间仍未被MySQL处理,客户端的超时时间大于该时间,就会报错。
- 进一步查看线程池配置(默认开启),可以在控制台查看。
可以看出,threadpool_size为1,threadpool_stall_limit为500ms,threadpool_oversubscribe为3,线程池处理连接等待的时间主要与上述3个参数相关:
- 当线程池所有线程在忙碌,线程池中的调度线程会每隔500ms(threadpool_stall_limit)创建一个新线程,所以此时,每个线程组平均每500ms才能处理一个新的连接。如果队列太长,很可能导致客户端超时;
- 所有线程都在忙碌是指,工作线程达到线程池总线程数,在大量建立连接时,总线程数计算方法:threadpool_size*(threadpool_oversubscribe+1))
解决方案
对于存在大量新建连接,建议调大threadpool_oversubscribe增加线程总数。
减少线程重复创建与销毁部分的开销,提高性能,同时它也限制了MySQL的runing线程数,关键时刻可以保护系统,防止雪崩。
正常情况下,线程池适用于大量短连接的场景,如果客户是长连接,并且连接数量不多(客户端使用了连接池等情况),线程池的作用不大,此时调整threadpool_size和threadpool_oversubscribe两个参数扩大线程总数,或者直接关闭线程池。