MySQL连接管理器线程负责处理服务器侦听的网络接口上的客户端连接请求。连接管理器线程将每个客户端连接与专用于它的线程相关联,以处理该连接的身份验证和请求处理。
连接管理线程在必要时创建一个新线程,但是会先尝试避免这样做,首先查看线程缓存,看它是否包含可用于连接的线程。当连接结束时,如果缓存未满,则其线程返回到线程缓存中,用于下次使用。
在这种连接线程模型中,存在与当前连接的客户端一样多的线程,这在服务器工作负载必须扩展以处理大量连接时具有一些缺点。例如,线程创建和处理变得昂贵。此外,每个线程都需要服务器和内核资源,如堆栈空间。为了适应大量的并发连接,每个线程的堆栈大小必须保持较小,导致它太小或服务器消耗大量内存的情况。也可能耗尽其他资源,调度开销也会变得很大。
为了控制和监视服务器如何管理客户端连接的线程,有几个系统和状态变量可以查看。
线程缓存由thread_cache_size系统变量确定其大小,默认值为0(无缓存),这将导致为每个新连接设置一个线程,并在连接终止时进行处理。设置thread_cache_size为N,启用N个非活动连接线程被缓存。thread_cache_size可以在服务器启动时设置或在服务器运行时更改,连接线程在与其关联的客户端连接终止时变为不活动。
通过MySQL状态变量Threads_cached和Threads_created可以监控高速缓存中的线程数,和已经创建了多少个线程。另外你也可以通过max_connections变量控制可以同时连接的最大客户端数。
当线程堆栈太小时,会限制了服务器可以处理的SQL语句的复杂性,存储过程的递归深度和其他内存消耗的操作。要为N每个线程设置堆栈大小 ,可以设置thread_stack=N变量。