2011-03-28 16 views
0

最近我们将我们的rails网站的应用服务器从杂种改为乘客[使用REE和Rails 2.3.8]。生产设置有6台机器指向一个mysql服务器和一个memcache服务器。在每台机器有5个杂种实例之前。现在我们有45个乘客实例,因为每台机器的RAM是16GB,带有2,4核心cpu。一旦我们部署这个乘客在生产中建立。该网站变得如此缓慢。并且所有请求开始排队。最终我们必须回滚。增加同步请求的数量到mysql

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

这会增加与mysql的同时连接会导致mysql比我们只有30个连接时响应慢吗?如果是这样,那么我们如何使用275同时连接来实现mysql更好的性能。

任何建议非常感谢。

UPDATE:MySQL服务器上

的更多信息:

RAM:16GB CPU:两个处理器均具有4个内核

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

感谢

+0

这是一个系统管理员问题,而不是开发人员问题。在stackoverflow上可能是错误的。另外,您不提供my.cnf值,也不提供足够的机器信息,也不提供允许确定机器中争用点的信息。 – Isotopp 2011-03-28 11:27:46

回答

4

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

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

如果你有点偏执,假设MySQL 5.5,innodb_thread_concurrency可以设置为0(无限)或32到64。 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应用程序的早期版本所做的一份咨询工作的总结。

UPDATE:

http://pastebin.com/pT3r6A9q,你正在运行5.0.45社区日志,这是非常老的并发负载下不能很好地执行。使用目前的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之外与我联系。

UPDATE:

根据你的processlist,你有状态Sending data很多疑问。当查询正在执行时,MySQL处于这种状态,即主要内部加入循环/查询执行循环繁忙。 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表格,无论你做什么,你都表现不佳。

+0

我增加了更多的信息,我可以得到。让我知道你是否想要更多信息。我猜测,当线程数从30增加到275时,同样的内存有限,mysql变得非常缓慢。我们未能在部署前设置生产测试。在部署时,每台45台乘客进程的6台机器都被指向mysql。整个网站变得非常缓慢。我应该适当增加msyql参数。我担心的是,只有在运行线程中增加这个问题才是我们面临的问题的真正原因。 – anusuya 2011-03-28 12:18:48

+0

如果可以,请添加SHOW GLOBAL STATUS和SHOW PROCESSLIST。 – Isotopp 2011-03-28 12:23:42

+0

当我们试图用3台机器指向单个mysql服务器来模拟问题时,添加了进程列表 – anusuya 2011-03-28 12:38:48

0

据我知道,这是不可能的,仅仅保持/打开的连接将是问题。即使网站闲置,您是否也看到了这个问题?

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

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

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

+0

其非空闲连接。每个连接都会查询数据库。我认为会有更多的线程等待执行比我们以前的30个连接设置 – anusuya 2011-03-28 13:07:16