mysql - 即使有大量可用连接,响应速度也很慢

时间:2014-09-20 03:14:07

标签: mysql sql performance

我正在运行此服务器以进行数据挖掘。它并行运行多个计算密集型数据挖掘应用程序,并同时访问MySQL服务器。

以下是配置。

服务器配置:8核Intel Xeon,16GB RAM,500 GB SAS驱动器

MySQL my.cnf

[client]
#password   = [your_password]
port        = 3306
socket      = /var/lib/mysql/mysql.sock

[mysqld]
# generic configuration options
port                          = 3306
socket                        = /var/lib/mysql/mysql.sock
datadir                       = /database/mysql
log_bin                       = OFF
expire-logs-days              = 3
pid-file                      = /database/mysql/localhost.localdomain.pid
back_log                      = 50
max_connections               = 3000
max_connect_errors            = 100
table_open_cache              = 2048
max_allowed_packet            = 16M
binlog_cache_size             = 1M
max_heap_table_size           = 64M
read_buffer_size              = 128M
read_rnd_buffer_size          = 32M
sort_buffer_size              = 32M
join_buffer_size              = 8M
thread_cache_size             = 8
thread_concurrency            = 4
query_cache_size              = 64M
query_cache_limit             = 2M
ft_min_word_len               = 4
default-storage-engine        = innodb
thread_stack                  = 192K
transaction_isolation         = REPEATABLE-READ
tmp_table_size                = 64M
log-bin                       = mysql-bin
binlog_format                 = mixed
server-id                     = 1
key_buffer_size               = 32M
bulk_insert_buffer_size       = 64M
myisam_sort_buffer_size       = 128M
myisam_max_sort_file_size     = 10G
myisam_repair_threads         = 1
myisam_recover
innodb_additional_mem_pool_size = 32M
innodb_buffer_pool_size       = 4G
innodb_data_file_path         = ibdata1:10M:autoextend
#innodb_data_home_dir         = <directory>
innodb_write_io_threads       = 8
innodb_read_io_threads        = 8
#innodb_force_recovery        = 6
innodb_thread_concurrency     = 0
innodb_flush_log_at_trx_commit= 2
#innodb_fast_shutdown
innodb_log_buffer_size        = 8M
innodb_log_file_size          = 1G
innodb_log_files_in_group     = 3
#innodb_log_group_home_dir
innodb_max_dirty_pages_pct    = 90
#innodb_flush_method          = O_DSYNC
innodb_lock_wait_timeout      = 120

[mysqldump
quick
max_allowed_packet            = 16M

[mysql]
auto-rehash

[myisamchk]
key_buffer_size               = 512M
sort_buffer_size              = 512M
read_buffer                   = 8M
write_buffer                  = 8M

[mysqlhotcopy]
interactive-timeout

[mysqld_safe]
open-files-limit              = 8192

只有2位用户访问此服务器,其中包括我。在高峰时段,我得到了这个

mysql > show processlist
...
120 rows in set

这表明在峰值计算时间内,与mysql服务器建立了大约120个连接。 MySQL消耗大约9.5GB的内存,并使用98-99%的CPU,我仍然可以使用它。但是在这段时间内使用php / javascript构建的前端站点需要大约1-2分钟来加载,这是因为mysql在这些时间内响应非常慢。虽然通常需要大约890毫秒到4秒。

我想知道如何进一步优化mysql服务器配置。目前从发布的my.cnf可以看出,缓冲池为4GB,最大连接数设置为3000。所有的表都是具有适当索引的Innodb,但在我的情况下,事务安全不是主要问题,唯一的问题是性能。数据挖掘应用程序使用MySQL C API Connector,每个都有大约24个并行线程运行,相当于24个与MySQL同时连接

如何进一步优化mysql服务器配置,以便我可以获得大约10-15秒的合理响应时间,以便进行前端访问。如果有任何方法可以进一步优化,请告诉我。

1 个答案:

答案 0 :(得分:2)

你真的应该专门用于数据挖掘的另一台服务器,并在MySQL服务器之间设置复制。数据挖掘应用程序应使用事务将多个小查询合并为块。这样,您的站点就不会等待执行其他查询,并且会在后台进行同步而不会出现明显的延迟。

另一个选择是尽可能地缓存,并希望用户在繁重的工作时间内不会请求不在缓存中的数据。

但我更愿意做这两件事,这样你才能获得100%可靠的服务。