MySQL服务器未充分利用; threads_running小于2

时间:2015-04-12 08:02:18

标签: mysql database database-performance sqlperformance

我正在运行MySql 5.6,我注意到当我对服务器进行基准测试时,CPU利用率在m1.large aws实例上从未超过50%(在一段时间内并行执行了几百个查询)。

我已将thread_cache变量设置为50并将max_connections设置为500.当我从shell执行以下命令时,

  1. mysqladmin -u root -ppassword -r -i 1 ext | grep Threads_created

    我注意到创建的线程从未穿过3

  2. mysqladmin -u root -ppassword -r -i 1 ext | grep Threads_running

    我注意到线程运行永远不会超过3,有时会变为-1。

  3. 显示状态; (从MySql控制台执行此操作)

    我注意到尽管thread_cache_size为50,但Threads_Cached为0。

  4. 我正在运行一个前端服务器来连接转发请求到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

1 个答案:

答案 0 :(得分:2)

多少个核心?当您看到50%时,主动做多少个连接?我猜你有两个核心,你有一个活动连接。由于MySQL每个连接不使用多个核心,因此50%。

"线程"你提到的价值还可以。详细...

" Thread_cache"是一个令人困惑的概念。这里发生了什么:当一个新客户端尝试连接时,mysqld(服务器)查找其"线程缓存"看看那里有没有。如果没有,它将创建一个新的操作系统'过程'为了那个连接。这是一个适度耗时的任务,因此需要缓存。

当连接断开连接(并且没有"连接池")时,进程将被放入线程缓存中。但线程缓存的上限为thread_cache_size。对于Windows,此VARIABLE的值应为0,对于unix,该值通常为10。但价值并不重要。

max_connections控制可以同时连接的客户端数量。通常他们忙于做其他事情,所以SHOW PROCESSLIST说"睡眠"。 wait_timeout将强制断开睡眠时间超过该设置的人(如果他们尚未自愿断开连接)。

STATUSThreads_created表示自MySQL启动以来发生了多少新连接。 Threads_running表示当前连接的数量有多少,但不是“睡眠”。 (-1似乎'错误'。)Threads_cached = 0可能意味着,例如,3个客户端已连接且它们仍然连接,而且您从未连接过3个以上。

由于你有一个"连接池",连接往往永远不会死。

你没有达到50,因为你没有足够的客户需要50。

连接池和Thread_cache提供相同的缓存目的,但方式不同。拥有两者都没关系,但是通过两者都不会获得太多收益。