Không thể sử dụng tối đa CPU và sử dụng bộ nhớ cho MySQL


7

Ngày tốt.

Tôi biết điều này có thể là một bản sao của các câu hỏi khác tuy nhiên tôi đã áp dụng tất cả các đề xuất trong nhiều chủ đề, nhưng tôi vẫn gặp vấn đề tương tự.

Tôi có một thủ tục lưu trữ duy nhất làm việc với max 3 tables. Khi tôi chạy thủ tục, chỉ 30% of my CPUđược sử dụng và về 25% of RAM.

Tôi đang ngồi với a CPU with 4 cores and 16GB RAM.

my.ini trông như sau:

[client]
port        = 3306
socket      = /tmp/mysql.sock

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 512M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 2M
read_buffer_size = 2M
read_rnd_buffer_size = 8M
myisam_sort_buffer_size = 128M
thread_cache_size = 16
query_cache_size= 32M
thread_concurrency = 0

log-bin=mysql-bin

binlog_format=mixed

server-id   = 1

innodb_buffer_pool_size = 12G
innodb_log_buffer_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_read_io_threads = 64
innodb_write_io_threads = 64

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
no-auto-rehash

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

Đây có phải là bản chất của thủ tục được gọi là nguyên nhân khiến mysql sử dụng phần cứng không hay là cấu hình của tôi?

Tôi đang chạy XAMPPnhưng sau đó nhận ra nó là 32 bit nên tôi chuyển sang phiên bản 64 bit WAMP. Tôi sử dụng 32-bit MySQLWorkbenchđể chạy truy vấn.

Tôi đang sử dụng InnoDB engine.

Sử dụng MySQL Ver 14.14 Distrib 5.5.24 Win64 (x86).


IO của bạn trông như thế nào?
Derek Downey

Nó nhảy từ 2 đến 11%, nhưng không quá 11%
Stephen H

Phiên bản nào của MySQL? (Chạy SELECT VERSION();)
RolandoMySQLDBA

Ver 14,14 Phân phối 5.5.24 Win64 (x86)
Stephen H

Chúng tôi không biết thủ tục làm gì, vì vậy chúng tôi không thể biết liệu bản chất của thủ tục có phải là vấn đề hay không. Thủ tục mất bao lâu để thực hiện? Nếu nhanh, bạn có thể không nhận được kết quả sử dụng CPU chính xác.
G-Nugget

Câu trả lời:


5

Các tác giả của MySQL hiệu suất cao mô tả một phần vấn đề của bạn khá ngắn gọn (trang 233):

MySQL không thể thực hiện một truy vấn song song trên nhiều CPU. Đây là một tính năng được cung cấp bởi một số máy chủ cơ sở dữ liệu khác, nhưng không phải MySQL.

Chạy một thủ tục được lưu trữ sẽ sử dụng không quá 1 lõi CPU của bạn để thực hiện các truy vấn, với một chút bổ sung cho các lõi khác được sử dụng bởi các luồng công việc và nền khác nhau, chẳng hạn như các I / O thực hiện. MySQL sẽ chỉ thực sự sử dụng toàn bộ sức mạnh của hệ thống đa lõi hoặc đa bộ xử lý khi có nhiều truy vấn chạy cùng một lúc.

Nếu bạn đang thấy 30% của 1 lõi được sử dụng, điều đó cho thấy có vấn đề tiềm ẩn, nhưng 1,2 lõi trong số 4 cho một truy vấn là điều khá bình thường.


3

Ngay cả với tất cả những thay đổi bạn đã thực hiện my.ini, tôi chỉ muốn đề xuất thêm một:

Tôi nhận thấy bạn không đặt innodb_buffer_pool_instances .

Theo Tài liệu MySQL, đây là những gì innodb_buffer_pool_instances dành cho:

Số vùng mà nhóm bộ đệm InnoDB được chia thành. Đối với các hệ thống có nhóm bộ đệm trong phạm vi nhiều gigabyte, việc chia nhóm bộ đệm thành các trường hợp riêng biệt có thể cải thiện sự tương tranh, bằng cách giảm sự tranh chấp khi các luồng khác nhau đọc và ghi vào các trang được lưu trong bộ nhớ cache. Mỗi trang được lưu trữ trong hoặc đọc từ nhóm bộ đệm được gán ngẫu nhiên cho một trong các trường hợp nhóm bộ đệm, sử dụng chức năng băm. Mỗi nhóm bộ đệm quản lý danh sách miễn phí của riêng mình, danh sách xóa, LRU và tất cả các cấu trúc dữ liệu khác được kết nối với nhóm bộ đệm và được bảo vệ bởi mutex nhóm bộ đệm riêng.

Tùy chọn này chỉ có hiệu lực khi bạn đặt innodb_buffer_pool_size thành kích thước từ 1 gigabyte trở lên. Tổng kích thước bạn chỉ định được chia cho tất cả các vùng đệm. Để có hiệu quả tốt nhất, hãy chỉ định kết hợp innodb_buffer_pool_instances và innodb_buffer_pool_size để mỗi phiên bản nhóm bộ đệm có ít nhất 1 gigabyte.

Mặc định là 1. Cho rằng bạn có 4 lõi, tôi sẽ đặt nó 4. Vui lòng thêm biến đó vào my.ini:

[mysqld]
innodb_buffer_pool_instances = 4

Vì đây không phải là biến động, bạn phải chạy khởi động lại mysql như sau

C:\> net stop mysql
C:\> net start mysql

Hãy thử một lần !!!

CẬP NHẬT 2013-05-24 12:16 EDT

Nhìn lại my.ini, bạn có thêm một số khuyến nghị về việc sử dụng bộ nhớ:


Hi tôi đã thử nó nhưng nó vẫn còn hạn chế. Nhìn vào nhật ký, nó nói:The InnoDB memory heap is disabled InnoDB: Not using CPU crc32 instructions InnoDB: Initializing buffer pool, size = 12.0G
Stephen H
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.