我遇到我的LAMP服务器的一些问题。 最近,一切都变得非常缓慢,尽pipe访客在我网站上的指数并没有太大变化。 当我运行top命令的时候,mysql进程占用了CPU的150-200%。 怎么可能,我一直认为100%是最大的?
我正在运行1.5 GB RAM的Ubuntu 9.04服务器版本
my.cnf设置:
key_buffer = 64M max_allowed_packet = 16M thread_stack = 192K thread_cache_size = 8 myisam-recover = BACKUP max_connections = 200 table_cache = 512 table_definition_cache = 512 thread_concurrency = 2 read_buffer_size = 1M sort_buffer_size = 4M join_buffer_size = 1M query_cache_limit = 1M # the maximum size of individual query results query_cache_size = 128M
这里是MySQLTuner的输出:

top命令:

造成这个问题的原因是什么? 我可以更改my.cnf以防止服务器挂起吗?
其他推荐的混合选项:
一段时间后检查日志文件。
你有一个拥有多个核心的处理器,或者你有多个处理器。 如果你有两个核心,一个进程使用两个核心的100%,它将显示为最高200%。
同样,这可能按预期工作 – 没有什么是你的configuration错误。 如果您遇到频繁的挂起问题,那么您可能需要考虑为表格添加适当的索引(或优化查询)。
运行top -H查看所有正在运行的线程,而不仅仅是整个进程。 另外,如果您在顶部按1键,它将显示单个CPU /内核的CPU使用情况。
Mysql有多个独立工作的进程(线程),例如,一个负责将数据从内存写入磁盘。 在CPU(和/或多个CPU)中具有多个内核的情况下,多于一个的线程正在工作,因此它可以运行单个内核的100%以上 – 简单地说,两个内核中的每个内核可能有75% ,给150%。
我注意到一个问题,与CPU无关。 如果您在同一台服务器上使用apache和MySQL,则当您的apache活动增加时,您可能会遇到不好的情况( RAM )。
MySQLTunner告诉你,使用200个可用的连接(你的最大连接设置),你将填充内存。 假设你将apache限制在150个进程中,当MySQL和apache尝试使用150个连接时,你肯定不会有足够的内存(就像Apache一样,这也是一个好的RAM内存)。
所以这是关于内存,你可能还没有被打中:-)顶部的命令只显示15个Apache进程(但是你在16/3/16装载平均,这意味着风暴是15分钟前,现在离开)。
关于CPU问题,为了补充shakalandy的好的反应,这可能是因为一个单一的查询。 它可以在一个巨大的桌子上,或做很多重新索引任务,或使用大量的临时文件,索引缺失(删除?)等。检测它的唯一方法是激活慢查询日志 (也许像8s一样高的thresold)。 然后使用mysqlsla工具来分析这个缓慢的查询日志,并对已识别的查询运行一些解释。