Làm cách nào để tối ưu hóa việc sử dụng bộ nhớ trong MySQL?

Tôi đang chạy Dịch vụ cơ sở dữ liệu quan hệ Amazon [Amazon RDS] cho phiên bản MySQL. Tôi thấy rằng bộ nhớ khả dụng của tôi thấp, cơ sở dữ liệu của tôi hết bộ nhớ hoặc bộ nhớ thấp đang gây ra sự cố về độ trễ trong ứng dụng của tôi. Làm cách nào để xác định nguồn sử dụng bộ nhớ và làm cách nào để khắc phục sự cố bộ nhớ có dung lượng trống thấp?

Mô tả ngắn

Trong Amazon RDS for MySQL, bạn có thể theo dõi bốn trạng thái bộ nhớ

  • Tích cực. Bộ nhớ đang được sử dụng tích cực bởi các quy trình hoặc luồng cơ sở dữ liệu
  • Đệm. Bộ đệm là một không gian tạm thời trong bộ nhớ được sử dụng để chứa một khối dữ liệu
  • Giải phóng bộ nhớ. Bộ nhớ có sẵn để sử dụng
  • Bộ nhớ cache. Bộ nhớ đệm là một kỹ thuật trong đó dữ liệu được lưu trữ tạm thời trong bộ nhớ, cho phép truy xuất dữ liệu nhanh chóng

Theo mặc định, khi bạn tạo phiên bản Amazon RDS cho MySQL, bộ đệm và bộ nhớ đệm được phân bổ để cải thiện hoạt động của cơ sở dữ liệu. Amazon RDS for MySQL cũng có một thành phần bộ nhớ trong [chẳng hạn như key_buffers_size hoặc query_cache_size] giúp tạo các bảng tạm thời bên trong để thực hiện một số thao tác nhất định

Khi bạn đang sử dụng Amazon RDS cho MySQL, hãy đảm bảo hiểu cách MySQL sử dụng và phân bổ bộ nhớ. Sau khi bạn xác định các thành phần đang sử dụng bộ nhớ, bạn có thể tìm kiếm các nút cổ chai ở cấp độ phiên bản và cơ sở dữ liệu. Sau đó, theo dõi các số liệu cụ thể đó và định cấu hình các phiên của bạn để có hiệu suất tối ưu

Nghị quyết

Cách MySQL sử dụng bộ nhớ

Trong Amazon RDS for MySQL, 80% đến 90% bộ nhớ khả dụng trên một phiên bản được phân bổ với các tham số mặc định. Việc phân bổ này là tối ưu cho hiệu suất, nhưng nếu bạn đặt các tham số sử dụng nhiều bộ nhớ hơn, thì hãy sửa đổi các tham số khác để sử dụng ít bộ nhớ hơn để bù lại

Bạn có thể tính toán mức sử dụng bộ nhớ gần đúng cho phiên bản RDS cho cơ sở dữ liệu MySQL của mình như sau

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + [[read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size] X max_connections]

Bể đệm

Bộ đệm và bộ đệm chung bao gồm các thành phần như Innodb_buffer_pool_size, Innodb_log_buffer_size, key_buffer_size và query_cache_size. Tham số innodb_buffer_pool_size là vùng bộ nhớ dành cho RAM nơi innodb lưu trữ các bảng cơ sở dữ liệu và dữ liệu liên quan đến chỉ mục. Vùng đệm lớn hơn yêu cầu thao tác I/O ít hơn được chuyển hướng trở lại đĩa. Theo mặc định, innodb_buffer_pool_size sử dụng tối đa 75% bộ nhớ khả dụng được phân bổ cho phiên bản Amazon RDS DB

innodb_buffer_pool_size = {DBInstanceClassMemory*3/4}

Đảm bảo xem lại tham số này trước để xác định nguồn sử dụng bộ nhớ. Sau đó, hãy cân nhắc giảm giá trị cho innodb_buffer_pool_size bằng cách sửa đổi giá trị thông số trong nhóm thông số tùy chỉnh của bạn

Ví dụ: DBInstanceClassMemory*3/4 mặc định có thể được giảm xuống *5/8 hoặc *1/2. Đảm bảo rằng giá trị BufferCacheHitRatio của phiên bản không quá thấp. Nếu giá trị BufferCacheHitRatio thấp, bạn có thể cần phải tăng kích thước phiên bản để có thêm RAM. Để biết thêm thông tin, hãy xem Các phương pháp hay nhất để định cấu hình tham số cho Amazon RDS for MySQL, phần 1. Các thông số liên quan đến hiệu suất

Chủ đề MySQL

Bộ nhớ cũng được phân bổ cho từng chuỗi MySQL được kết nối với một phiên bản MySQL DB. Các chủ đề sau yêu cầu bộ nhớ được phân bổ

  • thread_stack
  • net_buffer_length
  • read_buffer_size
  • sort_buffer_size
  • tham gia_buffer_size
  • max_heap_table_size
  • tmp_table_size

Ngoài ra, MySQL tạo các bảng tạm thời bên trong để thực hiện một số thao tác. Các bảng này ban đầu được tạo dưới dạng bảng dựa trên bộ nhớ. Khi các bảng đạt đến kích thước được chỉ định bởi tmp_table_size hoặc max_heap_table_size [bất kỳ giá trị nào có giá trị thấp nhất], thì bảng sẽ được chuyển đổi thành bảng dựa trên đĩa. Khi nhiều phiên tạo bảng tạm thời bên trong, bạn có thể thấy mức sử dụng bộ nhớ tăng lên. Để giảm sử dụng bộ nhớ, hãy tránh sử dụng bảng tạm thời trong truy vấn của bạn

Ghi chú. Khi bạn tăng giới hạn tmp_table_size và max_heap_table_size, các bảng tạm thời lớn hơn có thể tồn tại trong bộ nhớ. Để xác nhận xem một bảng tạm thời ẩn đã được tạo hay chưa, hãy sử dụng biến created_tmp_tables. Để biết thêm thông tin về biến này, xem trên trang web MySQL

THAM GIA và SẮP XẾP hoạt động

Mức sử dụng bộ nhớ sẽ tăng lên nếu nhiều bộ đệm cùng loại, chẳng hạn như join_buffer_size hoặc sort_buffer_size, được cấp phát trong thao tác THAM GIA hoặc SẮP XẾP. Ví dụ: MySQL phân bổ một bộ đệm THAM GIA để thực hiện THAM GIA giữa hai bảng. Nếu một truy vấn liên quan đến THAM GIA nhiều bảng và tất cả các truy vấn yêu cầu bộ đệm THAM GIA, thì MySQL sẽ phân bổ một bộ đệm THAM GIA ít hơn tổng số bảng. Định cấu hình biến phiên của bạn với giá trị quá cao có thể gây ra sự cố nếu truy vấn không được tối ưu hóa. Bạn có thể phân bổ bộ nhớ tối thiểu cho các biến cấp phiên, chẳng hạn như join_buffer_size và join_buffer_size andsort_buffer_size. Để biết thêm thông tin, hãy xem Làm việc với các nhóm tham số DB

Nếu bạn thực hiện thao tác chèn hàng loạt vào bảng MYISAM, thì các byte bộ nhớ Bulk_insert_buffer_size sẽ được sử dụng. Để biết thêm thông tin, xem

Lược đồ hiệu suất

Bộ nhớ có thể được sử dụng bởi Lược đồ hiệu suất nếu bạn. Khi Lược đồ hiệu suất được bật, thì MySQL sẽ phân bổ bộ đệm bên trong khi phiên bản được khởi động và trong quá trình hoạt động của máy chủ. Để biết thêm thông tin về cách Lược đồ hiệu suất sử dụng bộ nhớ, hãy xem Tài liệu MySQL về mô hình phân bổ bộ nhớ Lược đồ hiệu suất

Cùng với các bảng Lược đồ hiệu suất, bạn cũng có thể sử dụng lược đồ hệ thống MySQL. Ví dụ: bạn có thể sử dụng sự kiện performance_schema để hiển thị lượng bộ nhớ được phân bổ cho các bộ đệm bên trong được sử dụng bởi Lược đồ hiệu suất. Hoặc, bạn có thể chạy một truy vấn như thế này để xem dung lượng bộ nhớ được phân bổ

SELECT * FROM performance_schema.memory_summary_global_by_event_name WHERE EVENT_NAME LIKE 'memory/performance_schema/%';

Công cụ bộ nhớ được liệt kê trong bảng setup_instruments, theo định dạng "bộ nhớ/mã_khu vực/tên_công cụ". Để bật công cụ bộ nhớ, hãy cập nhật cột ĐÃ BẬT của các công cụ có liên quan trong bảng setup_instruments

UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME LIKE 'memory/%';

Theo dõi mức sử dụng bộ nhớ trên phiên bản của bạn

Số liệu của Amazon CloudWatch

cho Kết nối cơ sở dữ liệu, CPUUtilization, ReadIOPS và WriteIOPS khi bộ nhớ khả dụng thấp

Đối với Kết nối cơ sở dữ liệu, điều quan trọng cần lưu ý là mỗi kết nối được thực hiện với cơ sở dữ liệu cần một lượng bộ nhớ được phân bổ cho nó. Do đó, sự gia tăng đột biến trong các kết nối cơ sở dữ liệu có thể làm giảm bộ nhớ trống. Trong Amazon RDS, giới hạn mềm cho max_connections được tính như sau

{DBInstanceClassMemory/12582880}

Theo dõi xem bạn có đang vượt quá giới hạn mềm này hay không bằng cách kiểm tra chỉ số DatabaseConnections trong Amazon CloudWatch

Ngoài ra, hãy kiểm tra áp suất bộ nhớ bằng cách theo dõi chỉ số CloudWatch cho SwapUsage ngoài FreeableMemory. Nếu bạn thấy rằng một lượng lớn hoán đổi được sử dụng và bạn có FreeableMemory thấp, thì phiên bản của bạn có thể đang chịu áp lực bộ nhớ cao. Áp lực bộ nhớ cao ảnh hưởng đến hiệu suất cơ sở dữ liệu. Đó là cách tốt nhất để giữ mức áp suất bộ nhớ dưới 95%. Để biết thêm thông tin, hãy xem Tại sao phiên bản Amazon RDS của tôi sử dụng bộ nhớ hoán đổi khi tôi có đủ bộ nhớ?

Tăng cường giám sát

Để giám sát việc sử dụng tài nguyên trên phiên bản CSDL, hãy bật Giám sát nâng cao. Sau đó, đặt độ chi tiết là một hoặc năm giây [mặc định là 60 giây]. Với Giám sát nâng cao, bạn có thể theo dõi bộ nhớ hoạt động và có thể giải phóng trong thời gian thực

Bạn cũng có thể giám sát các luồng đang tiêu thụ CPU và bộ nhớ tối đa bằng cách liệt kê các luồng cho phiên bản CSDL của bạn

Tại sao việc sử dụng bộ nhớ MySQL tiếp tục tăng?

Có thể bạn đang đo bộ nhớ được phân trang, thay vì bộ nhớ được cấp phát nhưng chưa được sử dụng . Một phần lớn của nhóm bộ đệm innodb sẽ phù hợp với danh mục này. Khi dữ liệu mới được đọc, nhóm bộ đệm innodb sẽ lấp đầy từ từ vì dữ liệu mới không có trong bộ đệm hiện có của nó được sử dụng.

Làm cách nào để tối ưu hóa hiệu suất cơ sở dữ liệu trong MySQL?

Điều chỉnh hiệu suất máy chủ MySQL bằng mẹo để tối ưu hóa hiệu quả .
Kiểm tra phần cứng và phần mềm được đề xuất. .
Tối ưu hóa việc sử dụng bộ nhớ, đĩa và CPU. .
Công cụ điều chỉnh hiệu suất phần mềm. .
Sử dụng chỉ mục MySQL cho hiệu suất. .
Cải thiện hiệu suất với InnoDB. .
Tối ưu hóa truy vấn MySQL. .
Điều chỉnh các tùy chọn máy chủ để tăng hiệu suất

Làm cách nào để kiểm tra việc sử dụng bộ nhớ trong MySQL?

Giả sử bạn chỉ muốn sử dụng bộ nhớ của chương trình máy chủ mysql. Trên linux, bạn có thể sử dụng lệnh trên cùng. Sau đó, sử dụng "top -p {pid}" trong đó {pid} là pid của quy trình mysql

Chủ Đề