1

我的客户有一个非常大的基于 Joomla 的网站,托管在 Amazon EC2 上,内存为 1.5GB。该服务器同时托管 Apache 和 MySQL。目前数据库大小约为 250MB,网站每天的访问量约为 5000。看起来网站上存在严重的内存泄漏,因为有时 MySQL 使用了大约 99% 的 CPU 内存然后崩溃。我已经尝试优化数据库表,修改我的.cnf,但仍然没有任何改进。

Joomla 智能搜索使用的查找器表占用超过 100MB 的数据库大小。我禁用了智能搜索,但问题仍然存在。

朋友,请提出一些解决此问题的建议。

谢谢。

下面是 my.cnf 文件

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

symbolic-links=0
bind-address            = 127.0.0.1

default-storage-engine=innodb
transaction-isolation    =   REPEATABLE-READ
character-set-server    =   UTF8
collation-server      =   UTF8_general_ci

max_connections         = 5000
wait_timeout            = 30
connect_timeout         = 60
#interactive_timeout     = 600
#max_connect_errors      = 1000000
#max_allowed_packet      = 10M


skip-external-locking
key_buffer_size = 384M
max_allowed_packet = 1M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 64M
thread_cache_size = 8
query_cache_size = 32M
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 8

slow_query_log
long_query_time = 2

[mysqld_safe]
log-error=/var/log/mysqld.log
myisam_sort_buffer_size = 64M
4

1 回答 1

0

我敢打赌,你被一个流氓机器人击中了——那里有许多 SEO 蜘蛛之一,或者像 80legs 这样的工具,它可以让人们对机器人网络进行编程以执行任务——通常在他们的编程中出现错误,导致猛烈轰炸。

我永远不记得哪些 MySQL 设置占用内存一次,哪些是每个连接 - 但由于您设置为允许最多 5000 个同时连接并且一些缓冲区为 2 MB 和 8 MB,我敢打赌总内存使用量低于重负载很容易超过可用的总 ram。

您当前的设置将允许您的所有日常流量同时命中。我会把它降低到一百或更少的设置,看看是否能提供更多的稳定性。

有各种 MySQL 调谐器脚本可以帮助您发现分配过多内存的位置。

如果您在崩溃/高负载时访问日志,我会检查恶意机器人 - 我们在我们监控/控制的某些网站上一直在进行一场持续的战斗来控制它们。

您还可以检查 thread_concurrency 值 - 取决于您有多少 CPU 可用。

于 2013-02-05T23:48:21.783 回答