2015-04-12 54 views
2

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

我已在thread_cache变量设置为50和max_connections 500当我执行从壳下面的命令,

  1. 中mysqladmin -u根-ppassword -r -i 1个分机| grep的由Threads_created

    我注意到,创建的线程不穿过3

  2. 中mysqladmin -u根-ppassword -r -i 1个分机| grep Threads_running

    我注意到,运行的线程永远不会穿越3,有时会变成-1。

  3. SHOW STATUS; (从MySQL控制台运行此)

    我注意到Threads_Cached是0,尽管thread_cache_size的是50

我运行前端服务器的连接请求转发到MySQL。我正在使用大小为50的连接池。不应该把threads_created更改为50吗?我理解这个权利吗?

更新:

我更新了我的前端服务器从承运人到Jetty。我现在使用c3p0来完成连接池。我配置了50个连接,现在我可以注意到threads_running和threads_running上升到50.

但是,我的CPU利用率仍然没有超过60%为我的MySQL进程。

机的详细信息:AWS m1.large例如,2个内核(4个vCPU),7.5GB RAM 的MySQL版本:5.6 引擎:MyISAM数据 行:85个百万 查询类型:只读 查询:选择一个, b,c从表格WHERE文本=? AND date> =?和日期< =?; 我对文本,日期字段有一个复合索引,当我在这个查询上运行EXPLAIN时,我能够看到正在使用索引。

感谢, V

+0

这是我第一次发帖,我很想知道我的错在哪里,以便我纠正自己,而不是仅仅得到否定的投票。 – Venkey

+0

如果您是基准测试,那么您是如何运行并行mysql线程或查询的?你是否禁用了query_cache? 最大的线程是上限,不需要总是运行 – georgecj11

+0

您好cjg, 我正在使用JMeter ...现在我有一个自定义程序,产生'n'指定的线程。每个线程运行'k'指定查询次数.. 我还没有禁用查询缓存!我可以做? – Venkey

回答

1

多少核心? 积极当你看到50%时做的事情有多少个连接?我猜你有2个内核,并且你有一个活动连接。由于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所服务的同一缓存的目的,但以不同的方式。两者都可以,但是两者都没有多大的收益。

+0

感谢里克的明确解释! 我有一个2核心机器(4虚拟化的vCPUS,AWS,Xen)。我将前端服务器从Undertow更改为Jetty,并将c3p0用于连接池。我现在能够看到更多threads_running。此外,当连接的客户端断开.. threads_cached上升! 但是,对于mysql进程,CPU利用率仍然不会超过60%。 – Venkey