我的客户在亚马逊EC2上拥有一个相当大的基于Joomla的网站,其中有1.5GB的RAM。服务器同时托管Apache和MySQL。目前,数据库大小约为250MB,网站的每日流量约为5000。似乎在网站上有严重的内存泄漏,因为有时MySQL使用CPU内存的99%,然后崩溃。我尝试优化数据库表,修改我的.cnf
,但仍然没有改进。
Joomla Smart Search使用的Finder表占DB大小的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
我的赌注是您被一家流氓机器人击中 - 那里的众多SEO蜘蛛之一,或者像80legs这样的工具让人们编程了一个机器人网络来执行任务 - 通常在编程中出现错误会导致轰炸。
我永远都不记得哪个mySQL设置每次连接一次记忆 - 但是当您设置的时,最多可以同时连接5000个,而某些缓冲区则是2和8 MB沉重负载下的内存使用很容易超过可用的RAM。
您当前的设置将允许您的所有日常流量同时触及。我将其敲到一百或更少的设置,看看是否会带来更大的稳定性。
有各种MySQL调谐器脚本可以帮助您发现分配过多的内存的地方。
如果您从撞车事故/高负载左右开始有访问日志,但是我会检查恶意机器人 - 我们一直在进行一场持续的战斗以在我们监视/控制的某些站点上统治它们。
您还可以检查thread_concurrency值 - 取决于可用的CPU。