MySQL: Làm cách nào để tôi có thể sử dụng bộ nhớ tối đa có thể sử dụng bộ nhớ tối đa của tôi?


15

Gần đây tôi đã gặp vấn đề với việc đập vì kết quả là hết bộ nhớ. (VPS của tôi có tổng cộng 256M)

Tôi đang cố gắng điều chỉnh MySQL bằng mysqltuner.pl và nhận được các kết quả sau:

-------- Thống kê chung ---------------------------------------- ----------
[-] Bỏ qua kiểm tra phiên bản cho tập lệnh MySQLTuner
[OK] Hiện đang chạy phiên bản MySQL được hỗ trợ 5.0.51a-3ubfox5.4-log
[OK] Hoạt động trên kiến ​​trúc 64 bit

-------- Thống kê công cụ lưu trữ --------------------------------------- ----
[-] Trạng thái: + Lưu trữ -BDB -Federated -InnoDB -ISAM -NDBCluster 
[-] Dữ liệu trong các bảng MyISAM: 114M (Bảng: 454)
[!!] Tổng số bảng phân mảnh: 34

-------- Số liệu hiệu suất ---------------------------------------- ---------
[-] Lên đến: 40 giây (570 q [14.250 qps], 23 liên kết, TX: 154K, RX: 23K)
[-] Đọc / Viết: 100% / 0%
[-] Tổng số bộ đệm: 338.0M toàn cầu + 2.7M mỗi luồng (20 luồng tối đa)
[!!] Sử dụng bộ nhớ tối đa có thể: 392,9M (153% RAM đã cài đặt)
[OK] Truy vấn chậm: 0% (5/570)
[OK] Sử dụng cao nhất các kết nối khả dụng: 15% (3/20)
[!!] Kích thước bộ đệm chính / tổng chỉ số MyISAM: 8,0M / 9,4M
[!!] Tốc độ nhấn bộ đệm chính: 57,1% (7 bộ nhớ cache / 3 lần đọc)
[OK] Hiệu quả bộ đệm truy vấn: 21,9% (7 bộ nhớ cache / 32 lựa chọn)
[OK] Truy vấn mận bộ nhớ cache mỗi ngày: 0
[OK] Sắp xếp yêu cầu các bảng tạm thời: 0% (0 sắp xếp tạm thời / 1 sắp xếp)
[OK] Các bảng tạm thời được tạo trên đĩa: 0% (0 trên đĩa / tổng 32)
[OK] Tốc độ nhấn bộ đệm của luồng: 86% (3 kết nối được tạo / 23)
[OK] Tỷ lệ nhấn bộ đệm bảng: 26% (128 mở / 484 đã mở)
[OK] Mở giới hạn tệp được sử dụng: 25% (259 / 1K)
[OK] Khóa bảng thu được ngay lập tức: 100% (492 ngay lập tức / 492 khóa)

-------- Khuyến nghị ----------------------------------------- ------------
Khuyến nghị chung:
    Chạy BẢNG TỐI ƯU để bảng chống phân mảnh để có hiệu suất tốt hơn
    MySQL bắt đầu trong vòng 24 giờ qua - các khuyến nghị có thể không chính xác
    Giảm dung lượng bộ nhớ MySQL tổng thể của bạn để ổn định hệ thống
Các biến để điều chỉnh:
  *** Sử dụng bộ nhớ tối đa của MySQL rất cao ***
  *** Thêm RAM trước khi tăng biến bộ đệm MySQL ***
    key_buffer_size (> 9,4M)

Nhưng tôi hơi bối rối về cách giảm mức sử dụng bộ nhớ tối đa? Nó dường như được dựa trên key_buffer và max_connections, nhưng cũng phải có cái gì khác liên quan?

my.cnf:

key_buffer = 8M
max_allowed_packet = 12M
thread_stack = 128K
thread_cache_size = 8
max_connections = 20
bảng_cache = 128
tmp_table_size = 256M
max_heap_table_size = 256M
tham gia_buffer_size = 256K
truy vấn_cache_limit = 8M
truy vấn_cache_size = 64M

Tôi đã cố gắng đọc qua các bài viết điều chỉnh MySQL, nhưng chúng dường như hướng đến những người đã biết họ đang làm gì! Bất kỳ trợ giúp sẽ được đánh giá cao. Cảm ơn!


1
Tôi đã làm theo lời khuyên của người bình luận và đưa nó xuống một mức hợp lý - nhưng tôi vẫn tò mò về những quả bóng lành mạnh có thể là gì cho những giá trị đó? Một số bài viết trực tuyến sử dụng 64K và những bài khác đề xuất 512M cho cùng một giá trị!
Nick

Câu trả lời:


10

Bạn có một máy chủ với 256M, nhưng bạn không thể sử dụng tất cả những thứ đó - hãy nhớ rằng có một số chi phí hệ điều hành. Thêm vào đó với thực tế là bạn đã cam kết như những người khác đã đề cập và bạn chắc chắn sẽ thích thú ở đây. 256M chỉ đủ cho một DB nhỏ, 20 kết nối là rất nhiều với những gì bạn đã cấu hình.

1) giảm kết nối tối đa của bạn xuống 4 (bạn đang sử dụng 3 trên 20)

2) tối ưu hóa bộ đệm truy vấn của bạn tốt hơn; 8M thực sự rất lớn và tổng 64M là rất nhiều dựa trên lượt truy cập / mận của bạn; Hãy thử một combo 4/32 và xem nó diễn ra như thế nào. Thực sự tôi nghĩ rằng một kết hợp 2/24 sẽ làm việc cho bạn.

3) bạn không có các loại yêu cầu bảng tạm thời, tại sao động từ max_heap_table_size lại ở đó? Nhận xét rằng, sử dụng mặc định

4) bạn có thực sự có 128 bảng không? Hãy thử cắt bảng_cache đó thành một nửa thành 64 hoặc 48

5) giảm thread_cache_size xuống 4

6) tối ưu hóa các bảng để giảm phân mảnh

Đó là một số điều để bắt đầu. Có vẻ như bạn đã ném một loạt các số trong một cấu hình mà không có bất kỳ hồ sơ thực tế nào để biết những gì bạn cần và đã tạo ra một mớ hỗn độn; nếu vẫn thất bại, hãy quay lại mặc định và thoát khỏi cài đặt tùy chỉnh của bạn và bắt đầu lại bằng cách sử dụng một số hướng dẫn điều chỉnh hiệu suất mà bạn có thể tìm thấy trên Google. Nhận đầu ra của SHOW VARIABLES và SHOW STATUS, tìm bất kỳ một trong những hướng dẫn điều chỉnh bajillion và cắm các số thực, số thực của bạn vào phương trình của chúng và sẽ cho bạn biết các số chính xác mà bạn cần đặt trong tệp cấu hình của mình.


3
Đây là một câu trả lời cũ cho một câu hỏi cũ, nhưng tôi muốn chỉ ra rằng trong kết quả mysqltuner được đăng bởi người hỏi, máy chủ chỉ mới hoạt động được 40 giây, không đủ thời gian để đánh giá chính xác các tải mà máy chủ sẽ thấy . Lý tưởng nhất là bạn sẽ chạy mysqltuner một vài lần trong suốt một ngày hoặc hơn, sau đó phân tích kết quả. Khác hơn là đề xuất của bạn là âm thanh.
instanceofTom

7

Tôi không phải là một chuyên gia về MySQL và tôi không thể chẩn đoán vấn đề với thông tin này, nhưng tôi đã thử tìm kiếm công thức trong mã nguồn. Đây là:

server_buffers + total_per_thread_buffers * max_connections

Ở đâu:

server_buffers = key_buffer_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size + query_cache_size

và:

total_per_thread_buffers = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Bây giờ bạn phải kiểm tra từng giá trị này và tìm ra cái nào chịu trách nhiệm cho con số khổng lồ này. Và đừng tin tưởng vào kịch bản này - tôi đã thử chạy nó trên một trong các máy chủ DB của mình và nó tính toán rằng bộ nhớ tối đa là 140% tổng bộ nhớ vật lý, nhưng hệ thống đã chạy trong nhiều năm mà không gặp vấn đề ổn định nào.

Chúc may mắn!


0

Nếu tôi nhớ chính xác, MySQL Tuner sử dụng công thức sau để ước tính mức sử dụng tối đa:

read_buffer_size + read_rnd_buffer_size + sort_buffer_size + thread_stack + join_buffer_size

Hãy nhớ rằng điều này không chính xác 100% và trên thực tế chỉ là ước tính, vì các cài đặt nhất định trong MySQL không có giới hạn xác định.

Bạn có thể bắt đầu giảm bớt một số cài đặt trong tệp cấu hình của mình và chạy lại bộ chỉnh tần số, nhưng tôi khuyên bạn nên nhờ trợ giúp của chuyên gia nếu bạn không có thời gian để thay đổi my.cnf, khởi động lại và chạy bộ chỉnh tần số.


0

Sử dụng phần mềm mysqlcalculator.com có ​​thể giúp bạn tiết kiệm nhiều giờ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.