增加对mysql的同时请求数

时间:2011-03-28 10:42:31

标签: mysql ruby-on-rails performance

最近我们将rails网站的app服务器从mongrel更改为乘客[使用REE和Rails 2.3.8]。生产设置有6台机器指向一个mysql服务器和一个memcache服务器。在每台机器有5个mongrel实例之前。现在我们有45个乘客实例,因为每台机器的RAM是16GB,有2个,4个核心cpu。一旦我们部署了此乘客在生产中设置。网站变得如此缓慢。并且所有请求都开始排队。最终我们不得不回滚。

现在我们怀疑原因应该是增加了Mysql服务器的负载。像以前那里只有30个mysql连接,现在我们有275个连接。 mysql服务器具有与我们的网站机器类似的设置。 bbt所有的配置都留给了默认限制。尽管我们有16GB内存,buffer_pool_size只有8 MB。并发线程数为8.

这会增加与mysql的同时连接会导致mysql响应速度比我们只有30个连接时慢吗?如果是这样,我们怎样才能使275同时连接到位时使mysql表现更好。

任何建议都非常感谢。

更新:

有关mysql服务器的更多信息:

RAM:16GB CPU:两个处理器,每个处理器有4个核心

表是innoDB。只有默认的innodb配置值。

由于

2 个答案:

答案 0 :(得分:4)

空闲的MySQL连接占用服务器上的堆栈和网络缓冲区。这值得大约200 KB的内存和零CPU。

在仅使用InnoDB的数据库中,您应编辑/etc/sysctl.conf以包含vm.swappiness = 0以尽可能延迟交换进程。然后,假设有专用的数据库服务器计算机,则应将innodb_buffer_pool_size增加到系统内存的大约80%。确保该框不交换,即VSIZE不应超过系统RAM。

innodb_thread_concurrency可以设置为0(无限制)或32到64,如果你有点偏执,假设MySQL 5.5。限制在5.1中较低,在MySQL 5.0中约为4-8。不建议在具有8或16个内核的机器中使用这种过时的MySQL版本,在使用InnoDB 1.1的MySQL 5.5中,并发性有很大的改进。

变量thread_concurrency在当前Linux中没有任何意义。它用于在Linux中调用pthread_setconcurrency(),它什么都不做。它曾经在较旧的Solaris / SunOS中具有功能。

如果没有进一步的信息,您的性能问题的原因无法通过任何安全性来确定,但上述一般建议可能有所帮助。有关Ruby的有限经验的更多一般性建议可以在http://mysqldump.azundris.com/archives/72-Rubyisms.html中找到。该文章是我曾经为一个非常受欢迎的Facebook应用程序的早期版本所做的咨询工作的摘要。

<强>更新

根据http://pastebin.com/pT3r6A9q,您运行的是5.0.45-community-log,它非常陈旧,在并发加载下性能不佳。使用当前的5.5版本,它应该比你拥有的更好地执行方式

另外,修复innodb_buffer_pool_size。你在这里只有8M的游泳池。

当你在它时,innodb_file_per_table应该是ON。

如果不了解这意味着什么,请不要打开innodb_flush_log_at_trx_commit = 2,但它可能会暂时帮助您,具体取决于您的持久性要求。但是,它不是以任何方式永久解决您的问题。

如果您正在进行任何实质性的写入,您还需要查看innodb_log_file_size和innodb_log_buffer_size。

如果该装置赚钱,你需要专业的帮助。我不再是一个职业,但我可以推荐人。如果您愿意,请在Stack Overflow之外与我联系。

<强>更新

根据您的进程列表,您在状态Sending data中有很多查询。当执行查询时,MySQL处于这种状态,即主内部Join Loop / Query Execution循环繁忙。 SHOW ENGINE INNODB STATUS\G会向您显示类似

的内容
...
--------------
ROW OPERATIONS
--------------
3 queries inside InnoDB, 0 queries in queue
...

如果该数字大于4-8(在InnoDB内),5.0.x将会遇到麻烦。 5.5.x在这里会表现得更好。

关于my.cnf:请参阅我之前对InnoDB的评论。另请参阅我对thread_concurrency的评论(没有innodb_前缀):

 # On Linux, this does exactly nothing.
 thread_concurrency = 8

你完全没有所有的innodb配置。假设您正在使用innodb表,无论您做什么,都表现不佳。

答案 1 :(得分:0)

据我所知,仅维持/打开连接不太可能是问题所在。即使网站闲置,您是否看到此问题?

我会尝试http://www.quest.com/spotlight-on-mysql/或类似的,看看它是否真的是你的数据库,这是瓶颈。

在过去,我看到基本的网络疯狂导致行为类似于你描述的行为 - 有人用不正确的子掩码设置了新机器。

您是否查看过数据库服务器上的任何机器统计信息?内存/ CPU /磁盘IO统计?数据库服务器是否在苦苦挣扎?