Sử dụng bộ nhớ tối đa MySQL


111

Tôi muốn biết cách có thể đặt giới hạn trên về dung lượng bộ nhớ mà MySQL sử dụng trên máy chủ Linux.

Ngay bây giờ, MySQL sẽ tiếp tục chiếm bộ nhớ với mọi truy vấn mới được yêu cầu để cuối cùng nó hết bộ nhớ. Có cách nào để đặt một giới hạn để MySQL không sử dụng nhiều hơn số lượng đó không?


4
MySQL không "chiếm dụng bộ nhớ cho mọi truy vấn mới và cuối cùng sẽ hết". Việc sử dụng bộ nhớ phức tạp hơn thế nhiều.
Rick James,

Câu trả lời:


183

Việc sử dụng bộ nhớ tối đa của MySQL phụ thuộc rất nhiều vào phần cứng, cài đặt của bạn chính cơ sở dữ liệu.

Phần cứng

Phần cứng là phần hiển nhiên. Càng nhiều RAM càng vui, ổ đĩa nhanh hơn ftw . Tuy nhiên, đừng tin những bức thư tin tức hàng tháng hoặc hàng tuần. MySQL không mở rộng quy mô tuyến tính - ngay cả trên phần cứng Oracle. Nó phức tạp hơn một chút.

Điểm mấu chốt là: không có quy tắc chung cho những gì được khuyến nghị cho thiết lập MySQL của bạn . Tất cả phụ thuộc vào việc sử dụng hiện tại hoặc dự đoán.

Cài đặt & cơ sở dữ liệu

MySQL cung cấp vô số biến và thiết bị chuyển mạch để tối ưu hóa hành vi của nó. Nếu bạn gặp sự cố, bạn thực sự cần phải ngồi xuống và đọc hướng dẫn sử dụng (f'ing).

Đối với cơ sở dữ liệu - một vài ràng buộc quan trọng:

  • động cơ bảng ( InnoDB, MyISAM, ...)
  • kích thước
  • chỉ số
  • sử dụng

Hầu hết các thủ thuật MySQL trên stackoverflow sẽ cho bạn biết khoảng 5-8 cái gọi là cài đặt quan trọng. Trước hết, không phải tất cả chúng đều quan trọng - ví dụ: phân bổ nhiều tài nguyên cho InnoDB và không sử dụng InnoDB không có ý nghĩa nhiều vì những tài nguyên đó bị lãng phí.

Hoặc - nhiều người đề nghị nâng cấp max_connectionbiến - à , họ ít biết điều đó cũng ngụ ý rằng MySQL sẽ phân bổ nhiều tài nguyên hơn để phục vụ những biến đó max_connections- nếu cần. Giải pháp rõ ràng hơn có thể là đóng kết nối cơ sở dữ liệu trong DBAL của bạn hoặc hạ thấp wait_timeoutđể giải phóng các luồng đó.

Nếu bạn nắm bắt được hướng đi của tôi - thực sự có rất nhiều thứ để đọc và học hỏi.

Động cơ

Công cụ bảng là một quyết định khá quan trọng, nhiều người quên mất những điều đó sớm và sau đó đột nhiên thấy mình phải chiến đấu với một MyISAMbảng có kích thước 30 GB khóa và chặn toàn bộ ứng dụng của họ.

Tôi không có ý nói MyISAM tệ , nhưng InnoDBcó thể được tinh chỉnh để phản hồi gần như hoặc gần như nhanh nhất MyISAMvà cung cấp tính năng như khóa hàng UPDATEtrong khi MyISAMkhóa toàn bộ bảng khi nó được ghi vào.

Nếu bạn có thể tự do chạy MySQL trên cơ sở hạ tầng của riêng mình, bạn cũng có thể muốn kiểm tra máy chủ percona bởi vì trong số đó có rất nhiều đóng góp từ các công ty như Facebook và Google (họ biết nhanh), nó cũng bao gồm bản thả của riêng Percona- thay thế cho InnoDB, được gọi là XtraDB.

Xem ý chính của tôi về thiết lập percona-server (và -client) (trên Ubuntu): http://gist.github.com/637669

Kích thước

Kích thước cơ sở dữ liệu là rất, rất quan trọng - bạn tin hay không thì tùy, hầu hết mọi người trên Intarwebs chưa bao giờ xử lý một thiết lập MySQL lớn và dữ dội nhưng chúng thực sự tồn tại. Một số người sẽ troll và nói điều gì đó như, "Sử dụng PostgreSQL !!! 111", nhưng hãy bỏ qua chúng ngay bây giờ.

Điểm mấu chốt là: đánh giá từ kích thước, quyết định về phần cứng sẽ được thực hiện. Bạn thực sự không thể làm cho cơ sở dữ liệu 80 GB chạy nhanh trên 1 GB RAM.

Chỉ số

Nó không phải: càng nhiều, càng vui. Chỉ các chỉ số cần thiết được thiết lập và việc sử dụng phải được kiểm tra với EXPLAIN. Thêm vào đó là MySQL EXPLAINthực sự rất hạn chế, nhưng đó là một bước khởi đầu.

Các cấu hình được đề xuất

Về những thứ này my-large.cnfmy-medium.cnfcác tập tin - tôi thậm chí không biết chúng được viết cho ai. Cuộn của riêng bạn.

Điều chỉnh lớp sơn lót

Một khởi đầu tuyệt vời là mồi điều chỉnh . Đó là một tập lệnh bash (gợi ý: bạn sẽ cần linux) lấy đầu ra SHOW VARIABLESSHOW STATUSvà kết thúc nó thành một đề xuất hữu ích. Nếu máy chủ của bạn đã chạy một thời gian, đề xuất sẽ tốt hơn vì sẽ có dữ liệu để làm cơ sở cho chúng.

Tuy nhiên, mồi điều chỉnh không phải là một loại nước sốt thần kỳ. Bạn vẫn nên đọc tất cả các biến mà nó đề xuất để thay đổi.

đọc hiểu

Tôi thực sự muốn giới thiệu mysqlperformanceblog . Đó là một tài nguyên tuyệt vời cho tất cả các loại mẹo liên quan đến MySQL. Và không chỉ MySQL, họ còn biết rất nhiều về phần cứng phù hợp hoặc đề xuất thiết lập cho AWS, v.v. Những người này có nhiều năm kinh nghiệm.

Tất nhiên, một nguồn tài nguyên tuyệt vời khác là Planet-mysql .


Tôi không biết về tuning primer, làm thế nào nó so sánh với mysqltuner?
greg0ire

38

Chúng tôi sử dụng các cài đặt này:

etc/my.cnf
innodb_buffer_pool_size = 384M
key_buffer = 256M
query_cache_size = 1M
query_cache_limit = 128M
thread_cache_size = 8
max_connections = 400
innodb_lock_wait_timeout = 100

cho một máy chủ có các thông số kỹ thuật sau:

Dell Server
CPU cores: Two
Processor(s): 1x Dual Xeon
Clock Speed: >= 2.33GHz
RAM: 2 GBytes
Disks: 1×250 GB SATA

16
Tôi nghĩ rằng bạn (và tác giả mà bạn liên kết đến) có query_cache_size và query_cache_limit sai cách. Bạn đang nói với MySQL: phân bổ bộ nhớ cache 1MB nhưng không đặt bất kỳ truy vấn nào lớn hơn 128MB vào đó. dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html
agtb

Tôi sẽ giảm max_connections. Tôi sẽ quyết định sử dụng động cơ nào và không phân bổ nhiều không gian cho cả hai.
Rick James,

19

Sử dụng bộ nhớ cơ sở dữ liệu là một chủ đề phức tạp. Các Hiệu suất MySQL Blog làm một công việc tốt bao gồm câu hỏi của bạn, và danh sách nhiều lý do tại sao nó là vô cùng thực tế để "dự trữ" bộ nhớ.

Nếu bạn thực sự muốn áp đặt giới hạn cứng, bạn có thể làm như vậy, nhưng bạn phải thực hiện ở cấp hệ điều hành vì không có cài đặt tích hợp sẵn. Trong linux, bạn có thể sử dụng ulimit , nhưng bạn có thể phải sửa đổi cách MySQL khởi động để áp dụng điều này.


Giải pháp tốt nhất là điều chỉnh máy chủ của bạn, để sự kết hợp của các cài đặt bộ nhớ MySQL thông thường sẽ dẫn đến việc sử dụng bộ nhớ nói chung do cài đặt MySQL của bạn thấp hơn. Điều này tất nhiên sẽ có tác động tiêu cực đến hiệu suất của cơ sở dữ liệu của bạn, nhưng một số cài đặt bạn có thể tinh chỉnh my.inilà:

key_buffer_size
query_cache_size
query_cache_limit
table_cache
max_connections
tmp_table_size
innodb_buffer_pool_size

Tôi sẽ bắt đầu từ đó và xem liệu bạn có thể đạt được kết quả như mong muốn không. Có rất nhiều bài báo trên mạng về việc điều chỉnh cài đặt bộ nhớ MySQL.


Biên tập:

Lưu ý rằng một số tên biến đã thay đổi trong các bản phát hành 5.1.x mới hơn của MySQL .

Ví dụ:

table_cache

Hiện tại là:

table_open_cache

2
Chào! Cảm ơn câu trả lời của bạn. Tôi nhận thấy rằng phương trình mà mọi người trích dẫn như sau: key_buffer_size + (read_buffer_size + sort_buffer_size) * max_connections = Tổng bộ nhớ. Tôi đã đặt như sau: key_buffer_size = 128M, read_buffer_size = 1M, sort_buffer_size = 2M, max_connections = 120 và tổng bộ nhớ trên máy chủ là 512M. Tuy nhiên, sau nhiều lần truy vấn, bộ nhớ trống đã xuống mức 12M và có thể sẽ tiếp tục giảm khi sử dụng thêm. Có một lý do tại sao điều này là như vậy và nó có thể được ngăn chặn? Cảm ơn!

Hoặc có thể tôi cần phải xem xét không phải tổng bộ nhớ trên máy chủ (512M) mà là bộ nhớ trống (tức là bộ nhớ có sẵn sau khi tải tất cả các chương trình liên quan đến hệ điều hành và các chương trình khác)?

1
Nếu bạn đang đi để sửa đổi tmp_table_size với ý định tăng kích thước của bảng tạm thời có thể được lưu trữ trong RAM, nhớ cũng tăng max_heap_table_size - như MySQL sử dụng tối thiểu là hai ...
Dave Rix

1
@TimothyMilsud - Không có công thức nào như vậy thực sự hiệu quả. Và hầu hết các máy chủ chạy khá ổn khi một công thức cho rằng có quá nhiều RAM đang được sử dụng.
Rick James,

19

mysqld.exe đang sử dụng 480 mb trong RAM. Tôi thấy rằng tôi đã thêm thông số này vào my.ini

table_definition_cache = 400

làm giảm mức sử dụng bộ nhớ từ 400,000+ kb xuống 105,000kb


Phần này nằm trong phần nào? Tôi đã thêm nó vào của tôi và dịch vụ từ chối bắt đầu.
Lỗi cú pháp vào

Đừng bận tâm, tôi đã di chuyển nó dưới [wampmysqld] và nó hoạt động tốt và giảm đáng kể bộ nhớ tôi đang sử dụng. Tôi nghĩ rằng nó có thể đã tăng tốc các trang localhost của tôi trong quá trình này, chúng có vẻ nhanh hơn bây giờ.
Lỗi cú pháp vào

Mặc dù mặc định và tối thiểu là 400, điều gì đã khiến nó cao hơn 400 trong trường hợp của bạn?
Wadih M.

5

trong /etc/my.cnf:

[mysqld]
...

performance_schema = 0

table_cache = 0
table_definition_cache = 0
max-connect-errors = 10000

query_cache_size = 0
query_cache_limit = 0

...

Hoạt động tốt trên máy chủ với Bộ nhớ 256MB.


Tại sao lại là table_definition_cache= 0? Một số lời giải thích sẽ được tốt đẹp. Và bạn đang về cơ bản không nhớ đệm truy vấn ... cùng hiệu quả nếu bạn query_cache_type = 0:)
Khom Nazid

0

Nếu bạn đang tìm cách tối ưu hóa vùng chứa mysql docker của mình thì lệnh dưới đây có thể hữu ích. Tôi đã có thể chạy vùng chứa mysql docker từ 480mb mặc định đến chỉ 100 mbs

docker run -d -p 3306: 3306 -e MYSQL_DATABASE = test -e MYSQL_ROOT_PASSWORD = tooor -e MYSQL_USER = test -e MYSQL_PASSWORD = test -v / mysql: / var / lib / mysql --name mysqldb mysql --table_definition_cache = 100 --performance_schema = 0 --default -hentic-plugin = mysql_native_password

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.