我有一台专用服务器,配置非常好,比如 16 GB 的 RAM 等,但我面临着来自 mysql 的沉重负载,我正在运行一个音乐网站,然而只有一个数据库在运行,只有 5-10 个页面在运行。当我点击 whm 显示进程列表时,它只显示 2-3 个进程
但是 whm load 总是小于 1,但是当我点击 whm load 时,它显示 mysql 占用了 20% 的 CPU,过了一段时间后,它开始说无法连接到 mysql。mysql 服务器已经消失了
1691 (Trace) (Kill) mysql 0 19.2 2.7 /usr/sbin/mysqld --basedir=/ --datadir=/var/lib/mysql --user=mysql --log- error=/var/lib/mysql/server.xyz.com.err --pid-file=/var/lib/mysql/server.xyz.com.pid
我已经测试过静态页面,它们的速度非常快,但所有使用 mysql 的动态页面的速度都非常慢,需要几年才能打开。
my.conf 文件是
[mysqld]
key_buffer = 1536M
max_allowed_packet = 1M
max_connections = 250
max_user_connections = 15
wait_timeout=40
connect_timeout=10
table_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
server-id = 14
old-passwords = 1
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[myisamchk]
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
我检查了日志错误文件,它什么都没说。我将最大连接数也增加到了 1000,但问题仍然存在。如果我断开那个数据库,只需更改数据库的名称,我就可以发现在半小时内服务器和 mysql 的负载就会下降到可以忽略不计。我已经测试了所有内容,如果有一些查询会导致服务器负载过重,您能否列出哪种类型的查询会导致服务器负载过重,那么对于 5-10 页来说,它永远不会造成那么重的负载。我见过有 500 个网站的服务器,但运行良好。
答案1
您的数据库有多大?您使用哪种存储引擎?主要有两种:myIsam(默认)和InnoDB。myIsam 不能很好地处理并发写入,并且在插入/更新行时可能会出现延迟。
如果您使用 myIsam,您也可以尝试 myisamchk,如下所述:http://dev.mysql.com/doc/refman/5.5/en/myisamchk.html
您可能希望在运行 OPTIMIZE 语句之前使用 -d 选项来收集有关表的信息。
数据库文件也可能托管在网络路径上,或托管在虚假驱动器上。如果是后一种情况,请检查系统日志中是否存在驱动器错误。
答案2
在这种情况下,如果对数据库有两个并发访问(选择和更新),则可能会出现死锁。
在这种情况下,我强烈建议使用 innoDB 引擎。您必须设置一个 innoDB 文件存储(在 my.cnf 中,参见“innodb_data_file_path”),然后使用
ALTER TABLE 'YOURTABLENAME' ENGINE=InnoDB;
请注意,innoDB 比 MyIsam 占用更多的空间。1GB 的表可能会占用 2GB 的 InnoDB 数据空间。
InnoDB 在读取请求时速度较慢,但它可以完美处理并发更新/选择。
编辑:如果您的 innoDB 中已经有“innodb_data_file_path”行,则更改它可能会破坏您的 innoDB 数据空间。如果您的任何表都没有使用该存储,则可以从头开始创建新文件,否则,您可能不需要更新此行,而依赖于自动扩展,或者您可以添加文件,如下所示:
innodb_data_file_path=ibdata1:10M;ibdata2:2000M:autoextend
这将添加一个初始文件大小为 2GB 的文件,该文件可能会增大)