我使用sysbench测试了一个mysql集群,以找出设置最大线程数的最佳点。
--线程=N
我还在Mysql线程池操作中发现了thread_pool_size。
thread_pool_size:线程池中线程组的数量。这是控制线程池性能的最重要的参数。
所以困扰我的问题是,sysbench的线程是否与mysql的thread_pool_size相似?
下面是我使用的一个命令示例。sysbench oltp_read_write.lua --threads=26 --time=30 --mysql-user='root' --mysql-password='password' --table-size=10000 --mysql-host=10.100.100.64 --mysql-port=6033 run
这是一张显示我当前配置的图像:CNF文件
OUCH!
CCD_ 2是";线程";坚持住。这是一个头脑简单的池。它是一个数字而不是字节!!10
是一个合理的数字。任何超过max_connections
的内容都是不必要的。
CCD_ 5是指";并发的";连接,而不是随时间推移的总数。151
的默认值对大多数系统来说都很好。CCD_ 7是";高";但是对于某些系统是有保证的;10公里太高了。
检查这些:
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW GLOBAL STATUS LIKE 'Threads_running';
前者是一个高水位线(自启动以来)。如果它接近max_connections
,则可能最大连接数应该增加。
后者表示当前有多少连接实际上在做任何事情。如果它超过100,那么连接就会相互绊倒。我们需要更多的细节来讨论下一步该怎么做。(1
很常见;一个"繁忙"的系统可能说不超过10
,并且变化很快。)
Sysbench是MySQL的客户端。它可以启动多个线程,每个连接一个。
在MySQL Server中不使用线程池时,每个客户端连接都会启动自己的线程。因此,sysbench线程和MySQL Server线程之间存在一对一的对应关系。
客户端连接通常不会每秒运行一个查询。通常,客户端应用程序在等待查询之间运行其他代码。因此,在MySQL服务器端,存在一些线程,但它们什么都不做。这表现为";睡眠;在进程列表中。
打开数百个客户端连接是很常见的,但在任何给定的时刻,只有一两打这样的连接进行任何查询。其他人都在睡觉。
作为一个比喻,我会把它比作银行里的客户,他们走近出纳员的窗口进行交易。客户阻止其他人使用同一个柜员,即使客户正在签署表格或其他不是直接与柜员交谈的东西。
当使用线程池时,MySQL Server中的线程处理方式不同。线程池功能的存在使得MySQL Server中较少数量的线程可以由更多数量的客户端连接共享。MySQL Server中的线程不再与客户端连接一一对应。当客户端连接请求执行SQL查询时,它们会切换。这样做是为了在客户端打开大量连接时减少资源使用。
这里的一个比喻是一家餐厅,一个服务员可以处理整个区域的顾客。客户只需要不时地关注,因此服务器可以跟踪多个客户表。
在sysbench的情况下,这可能不是一个典型的工作负载。客户端线程比典型的应用程序更快地运行SQL查询。如果在这种情况下尝试使用线程池,那么客户端请求的数量可能会超过线程池中的线程数,并且在这种情况中,客户端请求可能会排队。
在餐厅的比喻中,这将是罕见的情况下,不止一张桌子同时想要一些东西。然后,除了一个表之外,所有的表都必须等待,但希望不会等待太久,因为大多数客户的请求都很简短。
在使用sysbench进行测试时,使用MySQL Server中的线程池可能不是衡量查询最大吞吐量的最佳方法。