我的客户有一个非常大的基于Joomla的网站,托管在Amazon EC2上,内存为1.5GB。服务器托管Apache和MySQL。目前,数据库大小约为250MB,网站每日流量约为5000.网站上看起来存在严重的内存泄漏,因为有时MySQL使用大约99%的CPU内存然后崩溃。我尝试过优化数据库表,修改我的.cnf
,但仍然没有改进。
Joomla智能搜索使用的查找表占用超过100MB的db大小。我已禁用智能搜索,但问题仍然存在。
朋友们,请提出一些解决此问题的建议。
感谢。
以下是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
答案 0 :(得分:0)
我的赌注是你被一个流氓机器人击中 - 这是一个众多的搜索引擎优化蜘蛛之一,或像80legs这样的工具让人们编程机器人网络来执行任务 - 通常他们的编程中有错误导致轰炸。
我永远不会记得哪个MySQL设置占用内存一次,哪些是每个连接 - 但是当你设置允许多达5000个同时连接而一些缓冲区是2和8 MB时我会打赌总数重载下的内存使用量很容易超过可用的总RAM。
您当前的设置将允许您同时点击所有日常流量。我将其降低到一百或更低的设置,看看是否能提供更多的稳定性。
有各种MySQL调谐器脚本可以帮助您发现分配了太多内存的位置。
如果您有崩溃/高负载时的访问日志,我会检查恶意机器人 - 我们在我们监控/控制的一些网站上经常与他们进行斗争。
您还可以检查thread_concurrency值 - 具体取决于您可用的CPU数量。