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

MySQL server not fully utilized; threads_running is lesser than 2

我正在 运行ning 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

    我注意到 Threads 运行ning 永远不会超过 3,有时会变成 -1。

  3. 显示状态; (运行 来自 MySql 控制台)

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

我正在 运行 连接前端服务器以将请求转发到 mysql。我正在使用大小为 50 的连接池。threads_created 不应该在这里更改为 50 吗?我的理解对吗?

更新:

我将前端服务器从 undertow 更新为 Jetty。我现在使用 c3p0 来做连接池。我已配置为打开 50 个连接,现在我可以注意到 threads_running 和 threads_running 增加到 50 个。

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

机器详细信息:AWS m1.large 实例,2 核(4 vCPUs),7.5GB RAM MySQL版本:5.6 引擎:MyISAM 行数:8500 万 查询类型:只读 查询:SELECT a,b,c FROM table WHERE text = ?和日期>=? AND 日期 <= ?; 我在文本、日期字段上有一个复合索引,当我对此查询进行 运行 EXPLAIN 时,我能够看到正在使用该索引。

谢谢, V

多少核?当您看到 50% 时,有多少连接正在 主动 做事?我猜你有 2 个核心,并且有一个连接处于活动状态。由于 MySQL 每个连接使用的核心不超过一个,因此为 50%。

您提到的 "Thread" 值是可以的。详情...

"Thread_cache" 是一个令人困惑的概念。事情是这样的:当一个新的客户端尝试连接时,mysqld(服务器)在它的 "thread cache" 中查找是否有。如果不是,它将为该连接创建一个新的操作系统 'process'。这是一个中等耗时的任务,因此需要缓存。

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

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

STATUSThreads_created 表示自 MySQL 启动以来发生了多少新连接。 Threads_running 表示当前连接了多少,而不是 'Sleep'。 (-1 似乎 'wrong'。) Threads_cached = 0 可能意味着,例如,3 个客户端已连接并且它们仍然连接,而且您从未连接过超过 3 个。

因为你有 "connection pool",连接将永远不会消失。

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

连接池和Thread_cache服务于相同的缓存目的,但方式不同。两者兼有也无妨,但两者并无多大收获。