一个空闲的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表格,无论你做什么,你都表现不佳。
这是一个系统管理员问题,而不是开发人员问题。在stackoverflow上可能是错误的。另外,您不提供my.cnf值,也不提供足够的机器信息,也不提供允许确定机器中争用点的信息。 – Isotopp 2011-03-28 11:27:46