2014-09-20 90 views
0

我正在运行此服务器以进行数据挖掘。它并行运行多个计算密集型数据挖掘应用程序,并同时访问MySQL服务器。mysql - 即使有大量可用连接,响应速度也非常慢

这里是配置。

服务器配置:8核英特尔至强处理器,16GB内存,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 

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

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

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

回答

2

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

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

但我更喜欢做这两件事情,所以你会有100%可靠的服务。

+0

是的,我正在使用的这台服务器完全专用于此数据挖掘目的。前端仅显示在简单用户界面中从数据库中检索的表格。只有2个用户访问前端,包括我,并且不再有用户作为其私人服务器。但是,请您详细说明或提供显示如何“使用事务将多个小查询合并为块”的任何链接。目前数据完整性的优先级低于计算性能和MySQL性能,尤其是SELECT和INSERT。 – Maxx 2014-09-21 02:56:04

+0

Btw发送到服务器的98%的查询都是简单的SELECT和INSERT。一些最常用的查询使用1级嵌套SELECTS,而使用JOINS的查询每个循环只执行一次,所以它像JOIN每5000次查询只执行一次。 – Maxx 2014-09-21 02:57:58

+0

我还应该提到的另一件事是,有大约12个数据库。其中9人拥有超过500万张桌子。每个表格都是针对由数据库分类的特定产品功能。 – Maxx 2014-09-21 03:02:12