我正在运行MySql 5.6,我注意到当我对服务器进行基准测试时,CPU利用率在m1.large aws实例上从未超过50%(在一段时间内并行执行了几百个查询)。
我已将thread_cache变量设置为50并将max_connections设置为500.当我从shell执行以下命令时,
mysqladmin -u root -ppassword -r -i 1 ext | grep Threads_created
我注意到创建的线程从未穿过3
mysqladmin -u root -ppassword -r -i 1 ext | grep Threads_running
我注意到线程运行永远不会超过3,有时会变为-1。
显示状态; (从MySql控制台执行此操作)
我注意到尽管thread_cache_size为50,但Threads_Cached为0。
我正在运行一个前端服务器来连接转发请求到mysql。我正在使用大小为50的连接池。在这里,threads_created不应该更改为50吗?我的理解是对吗?
更新:
我将我的前端服务器从下载更新为Jetty。我现在使用c3p0来进行连接池。我已配置打开50个连接,现在我能够注意到threads_running和threads_running最多可达50个。
但是,对于我的mysql进程,我的CPU利用率仍然不超过60%。
机器详细信息:AWS m1.large实例,2个内核(4个vCPU),7.5GB RAM MySQL版本:5.6 引擎:MyISAM 行数:8500万 查询类型:只读 查询:SELECT a,b,c FROM表WHERE text =?和日期> =?和日期< =?; 我有关于文本,日期字段的复合索引,当我在此查询上运行EXPLAIN时,我能够看到正在使用索引。
谢谢, V
答案 0 :(得分:2)
多少个核心?当您看到50%时,主动做多少个连接?我猜你有两个核心,你有一个活动连接。由于MySQL每个连接不使用多个核心,因此50%。
"线程"你提到的价值还可以。详细...
" Thread_cache"是一个令人困惑的概念。这里发生了什么:当一个新客户端尝试连接时,mysqld(服务器)查找其"线程缓存"看看那里有没有。如果没有,它将创建一个新的操作系统'过程'为了那个连接。这是一个适度耗时的任务,因此需要缓存。
当连接断开连接(并且没有"连接池")时,进程将被放入线程缓存中。但线程缓存的上限为thread_cache_size
。对于Windows,此VARIABLE
的值应为0,对于unix,该值通常为10。但价值并不重要。
max_connections
控制可以同时连接的客户端数量。通常他们忙于做其他事情,所以SHOW PROCESSLIST
说"睡眠"。 wait_timeout
将强制断开睡眠时间超过该设置的人(如果他们尚未自愿断开连接)。
STATUS
值Threads_created
表示自MySQL启动以来发生了多少新连接。 Threads_running
表示当前连接的数量有多少,但不是“睡眠”。 (-1似乎'错误'。)Threads_cached
= 0可能意味着,例如,3个客户端已连接且它们仍然连接,而且您从未连接过3个以上。
由于你有一个"连接池",连接往往永远不会死。
你没有达到50,因为你没有足够的客户需要50。
连接池和Thread_cache提供相同的缓存目的,但方式不同。拥有两者都没关系,但是通过两者都不会获得太多收益。