banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục  XML
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 07:39:46 (+0700) | #1 | 267071
mr.tee
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 01:18:07
Messages: 58
Offline
[Profile] [PM]
Em ( mình ) mới được sếp giao nhiệm vụ quản lý một con server linux, chạy apache + php + mysql, có cài thêm memcached.
Do source code của website là tự code, nên có thể có nhiều slow query mà không xử lý hết được, dẫn đến có một vài table của database thường xuyên bị overhead, dẫn đến treo luôn cả sql server.
Mỗi khi sql server bị treo thì ssh đến server cũng bị treo luôn ở step "Starting first key Exchange" nên không thể ssh đến để repair table hay stop service. Giải pháp duy nhất mỗi lần bị thế này là gọi sang Data Center bảo họ restart server, rồi lại vào start lại các service và repair Database.


Xin mọi người hướng dẫn cho em ( mình ) cách khắc phục hoặc hướng giải quyết khác ( nếu có ).
Après la pluie, le beau temps
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 07:42:07 (+0700) | #2 | 267072
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

mr.tee wrote:
Em ( mình ) mới được sếp giao nhiệm vụ quản lý một con server linux, chạy apache + php + mysql, có cài thêm memcached.
Do source code của website là tự code, nên có thể có nhiều slow query mà không xử lý hết được, dẫn đến có một vài table của database thường xuyên bị overhead, dẫn đến treo luôn cả sql server.
Mỗi khi sql server bị treo thì ssh đến server cũng bị treo luôn ở step "Starting first key Exchange" nên không thể ssh đến để repair table hay stop service. Giải pháp duy nhất mỗi lần bị thế này là gọi sang Data Center bảo họ restart server, rồi lại vào start lại các service và repair Database.


Xin mọi người hướng dẫn cho em ( mình ) cách khắc phục hoặc hướng giải quyết khác ( nếu có ).  


---> đã tìm ra nguyên nhân thì cứ theo đó mà giải quyết chớ cách khắc phục là gì nữa?
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 07:51:58 (+0700) | #3 | 267073
mr.tee
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 01:18:07
Messages: 58
Offline
[Profile] [PM]
Anh ơi, những slow query đấy chính ông coder bên em cũng không xử lý hết được. Khi hỏi đến thì chỉ bảo là định kỳ repair table, nhưng nó thường chết bất đắc kỳ tử, tối qua vừa repair xong sáng nay lại lăn ra treo.
Ý em muốn hỏi là có giải pháp nào để cấu hình server, sao cho khi mysql chết thì ssh vẫn hoạt động, dạng như giới hạn resource của mysql, không để ảnh hưởng đến các service khác.
Après la pluie, le beau temps
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 08:28:14 (+0700) | #4 | 267074
[Avatar]
.lht.
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 10:06:38
Messages: 75
Location: Inside you
Offline
[Profile] [PM]
Giải pháp tạm thời là viết 1 đoạn script tự động restart mysql theo định kì (sử dụng cron job).

Sau đó bảo ông Coder kia xem và sửa lại source cho tốt.

@Bạn có thể đưa thêm thông tin về cấu hình máy chủ và lượng truy cập vào website của bạn được không ? Có thể do máy chủ cấu hình hạn chế hoặc không đủ đáp ứng chăng ?
Trash from trash is the place for new good things ~
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 08:30:09 (+0700) | #5 | 267075
[Avatar]
conmale
Administrator

Joined: 07/05/2004 23:43:15
Messages: 9353
Location: down under
Offline
[Profile] [PM]

mr.tee wrote:
Anh ơi, những slow query đấy chính ông coder bên em cũng không xử lý hết được. Khi hỏi đến thì chỉ bảo là định kỳ repair table, nhưng nó thường chết bất đắc kỳ tử, tối qua vừa repair xong sáng nay lại lăn ra treo.
Ý em muốn hỏi là có giải pháp nào để cấu hình server, sao cho khi mysql chết thì ssh vẫn hoạt động, dạng như giới hạn resource của mysql, không để ảnh hưởng đến các service khác. 


Làm sao mà không xử lý hết được? Một ứng dụng có bao nhiêu SQL statement, câu SQL statement nào phi lý, không hiệu suất thì liệt kê ra mà fix chớ làm sao mà "không xử lý hết" là sao?

Tạm thời coi lại cấu hình my.cnf, điều chỉnh lại phần cache size, buffer size và nhét: nice = -5 vô trong [mysqld_safe]. Phải tính cho thật kỹ máy chủ có được bao nhiêu ram rồi mới tính ra số lượng memory sử dụng cho mysql một cách khoa học và hợp lý chớ đừng có nhét bậy, nhét bạ các giá tri trong đó. Tình trạng treo luôn, không ssh vô được là vì mysql nuốt hết memory và nhảy sang dùng swap mà ra.

Có làm gì đi chăng nữa thì cũng tạm bợ đối phó mà thôi. Muốn fix tận cùng thì cứ lôi cái ông coder ra mà bắt ông ấy fix cái đống mysql gây sự cố.
What bringing us together is stronger than what pulling us apart.
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 10:06:44 (+0700) | #6 | 267085
cino
Member

[Minus]    0    [Plus]
Joined: 29/11/2010 00:50:44
Messages: 37
Offline
[Profile] [PM]
Bác thử giảm giá trị của các thông số liên quan tới memory cấp phát cho connection (query, table (head) size, timeout...), nếu ít RAM thì giảm luôn giá trị query_cache xuống (lựa chọn giảm từng mức độ rồi monitor nó).

Lý do MySQL đơ và SSH không hoạt động vì bộ nhớ cho MySQL bị cấp phát quá lớn so với RAM, swap full -> đơ cả hệ thống.
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 13:56:20 (+0700) | #7 | 267098
mr.tee
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 01:18:07
Messages: 58
Offline
[Profile] [PM]

.lht. wrote:
Giải pháp tạm thời là viết 1 đoạn script tự động restart mysql theo định kì (sử dụng cron job).

Sau đó bảo ông Coder kia xem và sửa lại source cho tốt.

@Bạn có thể đưa thêm thông tin về cấu hình máy chủ và lượng truy cập vào website của bạn được không ? Có thể do máy chủ cấu hình hạn chế hoặc không đủ đáp ứng chăng ? 


Code:
Server model name : Intel (R) Xeon (R) CPU X3210 @2.13Ghz
CPU cores : 4 

Memory : 
Total : 4149456
Used : 1806328
Free : 2343128


Traffic vào website 1 ngày khoảng 28-30k visit, có 1 site phụ khoảng 2-3k visit.
Après la pluie, le beau temps
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 14:08:35 (+0700) | #8 | 267100
mr.tee
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 01:18:07
Messages: 58
Offline
[Profile] [PM]

conmale wrote:
Làm sao mà không xử lý hết được? Một ứng dụng có bao nhiêu SQL statement, câu SQL statement nào phi lý, không hiệu suất thì liệt kê ra mà fix chớ làm sao mà "không xử lý hết" là sao?

Tạm thời coi lại cấu hình my.cnf, điều chỉnh lại phần cache size, buffer size và nhét: nice = -5 vô trong [mysqld_safe]. Phải tính cho thật kỹ máy chủ có được bao nhiêu ram rồi mới tính ra số lượng memory sử dụng cho mysql một cách khoa học và hợp lý chớ đừng có nhét bậy, nhét bạ các giá tri trong đó. Tình trạng treo luôn, không ssh vô được là vì mysql nuốt hết memory và nhảy sang dùng swap mà ra.

Có làm gì đi chăng nữa thì cũng tạm bợ đối phó mà thôi. Muốn fix tận cùng thì cứ lôi cái ông coder ra mà bắt ông ấy fix cái đống mysql gây sự cố. 


Cũng khó anh ạ, toàn bộ nhân sự bên em chỉ có 1 coder, còn lại thì trình độ không tốt... Đã nhiều lần đè ông kia ra bắt fix, dùng đủ thể loại memcacher, tối ưu query, kết quả vẫn vậy, thi thoảng lại overhead, phải restart + repair mới chạy tiếp được.

Em đang đọc một số hướng dẫn về hạn chế memory của mysql để khi treo vẫn ssh được vào, tạm thời thì vẫn phải sống chung với lũ.
Après la pluie, le beau temps
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 19/07/2012 14:09:22 (+0700) | #9 | 267101
cino
Member

[Minus]    0    [Plus]
Joined: 29/11/2010 00:50:44
Messages: 37
Offline
[Profile] [PM]
Restart MySQL theo định kì không giải quyết được vấn đề gì hết. Chỉ cần connections tăng lên tầm vài phút mà cấu hình không phù hợp thì MySQL lại bứt phá phạm vi sử dụng RAM thì system halt là chuyện bình thường.
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 27/07/2012 21:06:36 (+0700) | #10 | 267587
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Bạn thảy lên một vài câu slow queries xem. Đã thử dùng EXPLAIN chưa? `my.cnf` đang cấu hình thế nào?
Let's build on a great foundation!
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 30/07/2012 07:15:58 (+0700) | #11 | 267680
[Avatar]
ngaongan
Member

[Minus]    0    [Plus]
Joined: 09/07/2008 08:47:38
Messages: 50
Offline
[Profile] [PM]
Kinh nghiệm của mình là dùng một số công cụ theo dõi tình trạng MySQL bao gồm các biến, các query tốn thời gian nhất, từ đó đưa ra các thay đổi hợp lý từ phía coder và quản trị viên cơ sở dữ liệu.
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 07/08/2012 09:58:34 (+0700) | #12 | 268158
mr.tee
Member

[Minus]    0    [Plus]
Joined: 20/10/2009 01:18:07
Messages: 58
Offline
[Profile] [PM]

quanta wrote:
Bạn thảy lên một vài câu slow queries xem. Đã thử dùng EXPLAIN chưa? `my.cnf` đang cấu hình thế nào? 


Hiện tại thì phần trang chủ tự code bên mình đã tối ưu bằng cách sử dụng memcached, không còn bị tình trạng này, nhưng giải quyết xong thì lại lòi ra phần forum đang chạy SMF. Lần này thì không hiểu nguyên nhân gì mà SQL 2-3 ngày lại tự động treo một lần, cũng không thể ssh vào server luôn. Sau khi reboot server để vào ssh, truncate table smf_log_errors và optimizer một số table như smf_session ( overhead ~6-10mb ) thì lại chạy bình thường, nhưng chỉ duy trì được 1-2 ngày rồi lại tiếp tục bị như thế.

đây là cấu hình mysql
Code:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# skip-networking
skip-name-resolve
skip-external-locking
# Disabling symbolic-links is recommended to prevent assorted security risks
# symbolic-links=0

max_connections=1000
max_user_connections =0

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2

query_cache_size = 16M
join_buffer_size = 8M
tmp_table_size = 512M
max_heap_table_size = 256M

query-cache-type = 1
key_buffer = 128M
key_buffer_size = 128M
max_allowed_packet = 32M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache = 16
query_cache_type = 1
query_cache_limit=32M 
thread_cache_size=143
table_cache = 4096
table_definition_cache=1024
thread_concurrency = 6

wait_timeout=30



[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
nice = -5
Après la pluie, le beau temps
[Up] [Print Copy]
  [Question]   Mysql hay bị treo + overhead các table, xin hướng dẫn khắc phục 12/11/2012 22:20:52 (+0700) | #13 | 270920
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

mr.tee wrote:
Em ( mình ) mới được sếp giao nhiệm vụ quản lý một con server linux, chạy apache + php + mysql, có cài thêm memcached.
 

Lúc cao điểm, Apache dùng hết khoảng bao nhiêu RAM? memcached đang để max memory (-m) là bao nhiêu? Rồi còn RAM cho OS nữa. Server 4G thì chắc cũng chỉ dành được ~ 2G cho MySQL thôi.

mr.tee wrote:

Do source code của website là tự code, nên có thể có nhiều slow query mà không xử lý hết được, dẫn đến có một vài table của database thường xuyên bị overhead, dẫn đến treo luôn cả sql server.
 

Percona có 2 công cụ rất hữu hiệu để phân tích slow query: pt-query-digest và pt-query-advisor.

mr.tee wrote:

Mỗi khi sql server bị treo thì ssh đến server cũng bị treo luôn ở step "Starting first key Exchange" nên không thể ssh đến để repair table hay stop service. Giải pháp duy nhất mỗi lần bị thế này là gọi sang Data Center bảo họ restart server, rồi lại vào start lại các service và repair Database.
 

Việc đầu tiên cần làm là thiết lập một hệ thống giám sát. Khi memory usage vượt ngưỡng nào đó là phải alert ngay.

mr.tee wrote:
Anh ơi, những slow query đấy chính ông coder bên em cũng không xử lý hết được. Khi hỏi đến thì chỉ bảo là định kỳ repair table, nhưng nó thường chết bất đắc kỳ tử, tối qua vừa repair xong sáng nay lại lăn ra treo.
 

Những slow query này gây crash table (MyISAM?) à hay sao mà phải repair? Mỗi khi MySQL chết, trong `/var/log/mysqld.log` có gì?

mr.tee wrote:

Ý em muốn hỏi là có giải pháp nào để cấu hình server, sao cho khi mysql chết thì ssh vẫn hoạt động, dạng như giới hạn resource của mysql, không để ảnh hưởng đến các service khác. 

Giảm lượng memory mà MySQL có thể dùng xuống.

Có một công thức thế này:
Code:
memory = global buffers + per-thread buffers * max_connections

global buffers = key_buffer_size 
               + innodb_buffer_pool_size 
               + innodb_additional_memory_pool_size
               + innodb_log_buffer_size
               + max_tmp_tables * min(tmp_table_size, max_heap_table_size)
               + query_cache_size
               + 3 * myisam_sort_buffer_size

per-thread buffers = read_buffer_size 
                   + join_buffer_size 
                   + read_rnd_buffer_size 
                   + thread_stack 
                   + (2 * max_packet_size)


Tham khảo:
- http://www.mysqlperformanceblog.com/2006/05/17/mysql-server-memory-usage/
- http://www.pythian.com/news/1455/mysql-memory-consumption/

Với config. của bạn:
Code:
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# skip-networking
skip-name-resolve
skip-external-locking
# Disabling symbolic-links is recommended to prevent assorted security risks
# symbolic-links=0

max_connections=1000
max_user_connections =0

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2

query_cache_size = 16M
join_buffer_size = 8M
tmp_table_size = 512M
max_heap_table_size = 256M

query-cache-type = 1
key_buffer = 128M
key_buffer_size = 128M
max_allowed_packet = 32M
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache = 16
query_cache_type = 1
query_cache_limit=32M 
thread_cache_size=143
table_cache = 4096
table_definition_cache=1024
thread_concurrency = 6

wait_timeout=30



[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
nice = -5

thì:

Code:
global buffers = 128M + 256M (tạm tính chỉ có 1 temp table) + 16M + 3 * 128M = 784M
per-thread buffers = 2M + 8M + 8M = 18M
memory = 784M + 18M * 1000 ~ 19G


Giải pháp trước mắt:

- giảm read_rnd_buffer_size, join_buffer_size xuống (2M chẳng hạn)
- giảm max_connections xuống
- bảng nào convert được thì nên chuyển sang InnoDB

4G ~ 784M + 6M *500 (cũng phải dành một lượng RAM cho hệ điều hành và các thứ khác nữa chứ)

Giải pháp lâu dài:
- Đọc: http://www.amazon.com/gp/product/1449314287/
Let's build on a great foundation!
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|