2014-09-20 89 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

相關問題