MySQL tạo các bảng tạm thời trên đĩa. Làm thế nào để tôi dừng nó?


27

Chúng tôi đang chạy một trang web (Moodle) mà người dùng hiện đang thấy chậm. Tôi nghĩ rằng tôi đã theo dõi vấn đề để MySQL tạo các bảng tạm thời trên đĩa. Tôi xem biến created_tmp_disk_tablestrong quản trị máy chủ Mysql Workbench và số lượng tăng lên với khoảng 50 bảng / s. Sau một ngày sử dụng, created_tmp_disk_tableslà> 100k. Ngoài ra, bộ nhớ dường như không được phát hành. Việc sử dụng tiếp tục tăng cho đến khi hệ thống trở nên không sử dụng được nhiều và chúng tôi phải khởi động lại MySQL. Tôi cần phải khởi động lại nó gần như mỗi ngày và nó bắt đầu bằng việc sử dụng khoảng 30 - 35% bộ nhớ khả dụng và kết thúc ngày với 80%.

Tôi không có các đốm màu trong cơ sở dữ liệu và cũng không kiểm soát các truy vấn vì vậy tôi không thể cố gắng tối ưu hóa chúng. Tôi cũng đã sử dụng Trình hướng dẫn xác nhận Percona để tạo tệp cấu hình nhưng my.ini cũng không giải quyết được vấn đề của tôi.

Câu hỏi

  1. Tôi nên thay đổi gì để ngăn MySQL tạo các bảng tạm thời trên đĩa? Có cài đặt nào tôi cần thay đổi không? Tôi có nên ném thêm bộ nhớ vào nó?

  2. Làm thế nào tôi có thể ngăn MySQL ăn hết bộ nhớ của tôi?

Chỉnh sửa

Tôi đã kích hoạt slow_queriesnhật ký và phát hiện ra rằng truy vấn SELECT GET_LOCK()được ghi là chậm. Một tìm kiếm nhanh cho thấy rằng tôi đã cho phép các kết nối liên tục trong cấu hình PHP ( mysqli.allow_persistent = ON). Tôi tắt cái này đi Điều này làm giảm tốc độ mà MySQL tiêu thụ bộ nhớ. Nó vẫn đang tạo các bảng tạm thời.

Tôi cũng kiểm tra rằng nó key_buffer sizeđủ lớn. Tôi nhìn vào biến key_writes. Điều này nên bằng không. Nếu không, hãy tăng. key_buffer_sizeTôi có 0 key_readsvà 0 key_writesvì vậy tôi cho rằng nó key_buffer_sizeđủ lớn.

Tôi đã tăng tmp_table_sizemax-heap-table-sizelên 1024M vì sự gia tăng của created_tmp_disk_tables có thể chỉ ra rằng các bảng không thể vừa trong bộ nhớ. Điều này đã không giải quyết nó.

Tham chiếu: http://www.mysqlperformanceblog.com/2007/08/16/how-much-overhead-is-caused-by-on-disk-t tạm-tables /

Chỉnh sửa 2

Nếu bạn thấy nhiều sort_merge_passesmỗi giây trong đầu ra SHOW GLOBAL STATUS, bạn có thể xem xét tăng sort_buffer_sizegiá trị. Tôi đã có 2 sort_merge_passestrong một giờ vì vậy tôi coi sort_buffer_sizelà đủ lớn.

Tham khảo: Hướng dẫn sử dụng Mysql trên sort_buffer_size

Chỉnh sửa 3

Tôi đã sửa đổi sắp xếp và tham gia bộ đệm theo đề xuất của @RolandoMySQLDBA. Kết quả được hiển thị trong bảng dưới đây nhưng tôi nghĩ rằng created_tmp_tables_on_diskvẫn còn cao. Tôi đã khởi động lại máy chủ mysql sau khi tôi thay đổi giá trị và kiểm tra created_tmp_tables_on_disksau một ngày (8h) và tính trung bình. Bất cứ một đề nghị nào khác? Dường như với tôi rằng có một cái gì đó không phù hợp bên trong một số loại container nhưng tôi không thể tìm ra nó là gì.

+---------------------+-------------+-------------+--------------------+
| Tmp_table_size,     | Sort_buffer | Join_buffer | No of created      |
| max_heap_table_size |             |             | tmp_tables on disk |
+---------------------+-------------+-------------+--------------------+
| 125M                | 256K        | 256K        |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 512K        | 512K        |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 1M          | 1M          |  100k/h            |
+---------------------+-------------+-------------+--------------------+
| 125M                | 4M          | 4M          |  100k/h            |
+---------------------+-------------+-------------+--------------------+   



Đây là cấu hình của tôi:

+-----------------------+-----------------------+
|DATABASE SERVER        |WEB SERVER             |
+-----------------------+-----------------------+
|Windows Server 2008 R2 |Windows Server 2008 R2 |
+-----------------------+-----------------------+
|MySQL 5.1.48           |IIS 7.5                |
+-----------------------+-----------------------+
|4 Core CPU             |4 Core CPU             |
+-----------------------+-----------------------+
|4GB RAM                |8GB RAM                |
+-----------------------+-----------------------+

Thông tin thêm

+--------------------+---------+
|PARAM               |VALUE    |
+--------------------+---------+
|Num of tables in Db |361      |
+--------------------+---------+
|Size of database    |2.5G     |
+--------------------+---------+
|Database engine     |InnoDB   |
+--------------------+---------+
|Read/write ratio    |3.5      |
|(Innodb_data_read/  |         |
|innodb_data_written)|         |
+--------------------+---------+
|Avg table size      |15k rows |
+--------------------+---------+
|Max table size      |744k rows|
+--------------------+---------+

Thiết lập này được trao cho tôi vì vậy tôi có quyền kiểm soát hạn chế đối với nó. Máy chủ web đang sử dụng rất ít CPU và RAM nên tôi đã loại máy đó là một nút cổ chai. Phần lớn các cài đặt MySQL bắt nguồn từ một công cụ tạo tự động cấu hình.

Tôi đã theo dõi hệ thống bằng PerfMon trong vài ngày. Từ đó, tôi kết luận rằng đó không phải là hệ điều hành được hoán đổi sang đĩa.

My.ini

[client]
port=3306
[mysql]
default-character-set=utf8

[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.1/"
datadir="D:/DBs/Data/"
default-character-set=utf8
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=125
query_cache_size=350M
table_cache=1520
tmp_table_size=125M
table-definition-cache= 1024
max-heap-table-size= 32M
thread_cache_size=38

MyISAM Specific options
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=125M
key_buffer_size=55M
read_buffer_size=1024K
read_rnd_buffer_size=256K
sort_buffer_size=1024K
join_buffer_size=1024K


INNODB Specific options
innodb_data_home_dir="D:/DBs/"
innodb_additional_mem_pool_size=32M
innodb_flush_log_at_trx_commit=1
innodb_log_buffer_size=16M
innodb_buffer_pool_size=2G
innodb_log_file_size=407M
innodb_thread_concurrency=8

Bình luận không dành cho thảo luận mở rộng; cuộc trò chuyện này đã được chuyển sang trò chuyện .
Paul White nói GoFundMonica

Câu trả lời:


16

Nhìn vào my.ini, tôi có hai gợi ý.

BỀN VỮNG # 1

Tôi sẽ tăng các cài đặt sau trong của bạn my.ini

sort_buffer_size=4M
join_buffer_size=4M

Điều này sẽ làm cho một số tham gia và sắp xếp ở lại trong bộ nhớ. Tất nhiên, một khi một JOINhoặc một ORDER BYnhu cầu nhiều hơn 4M, nó sẽ chuyển sang đĩa dưới dạng bảng MyISAM.

Nếu bạn không thể đăng nhập với tư cách root@localhost, thì hãy khởi động lại mysql bằng

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

Nếu bạn có thể đăng nhập với quyền root @ localhost, bạn không phải khởi động lại mysql để sử dụng các cài đặt này.

Chỉ cần chạy cái này trong máy khách MySQL:

SET @FourMegs = 1024 * 1024 * 4;
SET GLOBAL sort_buffer_size = @FourMegs;
SET GLOBAL join_buffer_size = @FourMegs;

BỀN VỮNG # 2

Vì Dữ liệu của bạn nằm trên Drive D:, bạn có thể có Đĩa I / O trên Drive C:.

Vui lòng chạy truy vấn này:

mysql> show variables like 'tmpdir';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tmpdir        | C:\Windows\TEMP |
+---------------+-----------------+
1 row in set (0.00 sec)

Vì tôi chạy mysql trên Máy tính để bàn với mặc định, các bảng tạm thời của tôi đang được ghi vào Drive C:. Nếu ổ D là một đĩa tốt hơn so với ổ C:, có lẽ bạn có thể ánh xạ bảng tạm thời để ổ D:bằng cách thiết lập tmpdir trong my.ininhư sau:

tmpdir="D:/DBs/"

Bạn sẽ phải khởi động lại mysql vì tmpdir không phải là biến động.

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

CẬP NHẬT 2013-11-29 10:09 EST

BỀN VỮNG # 3

Với thực tế là MySQL đang chạy trong Windows và bạn không thể chạm vào các truy vấn trong gói lõi, tôi có hai ý tưởng phải được thực hiện cùng nhau.

IDEA # 1: Di chuyển cơ sở dữ liệu sang máy Linux

Bạn sẽ có thể

  • Cài đặt máy Linux
  • Cài đặt MySQL trên máy Linux
  • Kích hoạt tính năng ghi nhật ký nhị phân cho MySQL trong Windows
  • mysqldump cơ sở dữ liệu thành một tệp SQL văn bản
  • Tải tập tin SQL vào MySQL chạy trong Linux
  • Thiết lập sao chép từ MySQL / Windows sang MySQL / Linux

IDEA # 2: Cấu hình lại Moodle để trỏ đến máy Linux

Moodle được thiết kế cho LAMP ở nơi đầu tiên. Chỉ cần thay đổi các tệp cấu hình để trỏ đến máy Linux thay vì localhost.

Đây là liên kết đến tài liệu Moodle 2.3 cũ khi thiết lập MySQL: http://docs.moodle.org/23/en/Installing_Moodle#Create_an_empty_database

Tôi chắc chắn rằng các tài liệu mới nhất cũng có sẵn.

Điểm di chuyển cơ sở dữ liệu sang Linux là gì ???

Làm thế nào điều này giúp tình hình bảng tạm thời ???

Sau đó tôi sẽ đề nghị thiết lập một đĩa RAM làm thư mục đích cho các bảng tạm thời của bạn

Tạo bảng tạm thời vẫn sẽ xảy ra, nhưng nó sẽ được ghi vào RAM chứ không phải đĩa. giảm đĩa I / O.

CẬP NHẬT 2013-11-29 11:24 EST

BỀN VỮNG # 4

Tôi sẽ đề nghị xem lại SUGGESTION # 2 với đĩa RAID-0 nhanh (32+ GB), định cấu hình nó là Drive T: (T cho Temp). Sau khi cài đặt một đĩa như vậy, thêm nó vào my.ini:

[mysqld]
tmpdir="T:\"

Khởi động lại MySQL sẽ được yêu cầu, sử dụng

net stop mysql
net start mysql

BTW Tôi đã nói về mục đích RAID-0 để bạn có thể có hiệu suất ghi tốt hơn so với RAID-1, RAID-10. Một đĩa bảng tmp không phải là thứ tôi sẽ làm cho dư thừa.

Nếu không tối ưu hóa các truy vấn như @RaymondNijland đã nhận xét, bạn không thể giảm số lượng tạo bảng tạm thời theo bất kỳ cách nào. SUGGESTION #3SUGGESTION #4cung cấp tăng tốc độ tạo bảng tạm thời và I / O bảng tạm thời thay thế.


13

Tôi trả lời câu hỏi của riêng tôi ở đây cho đầy đủ

Tôi sẽ chọn @RolandoMySQLDBA làm câu trả lời ưa thích vì nó cho tôi nhiều gợi ý nhất mặc dù nó không thực sự giải quyết được vấn đề của tôi.

Dưới đây là kết quả điều tra của tôi

Phần kết luận

MySQL trên Windows chỉ tạo nhiều bảng tạm thời và điều chỉnh MySQL bằng cách sửa đổi nội dung của các tệp cấu hình không giúp được gì.

Chi tiết

Bảng chi tiết các tham số tôi đã sửa đổi trong my.ini tương ứng trước khi thực hiện bất kỳ truy vấn nào. MySQL đã được bắt đầu lại giữa mỗi bài kiểm tra.

Tôi đã sử dụng my.ini được tìm thấy trong câu hỏi ban đầu làm mẫu và sau đó tôi đã thay đổi giá trị của từng tham số theo bảng bên dưới.

Tôi đã sử dụng JMeter để tạo 100 yêu cầu web đồng thời (như thể hiện việc sử dụng của chúng tôi) được lặp lại 10 mười lần. Mỗi cái Testbao gồm 1000 yêu cầu trong tổng số. Điều này dẫn đến các cuộc gọi cơ sở dữ liệu tiếp theo. Điều này cho thấy MySQL sẽ tạo ra rất nhiều bảng tạm thời bất kể chúng ta đã thay đổi tham số cấu hình nào.

+----+------------+-------+---------------+------------+
|Test|Parameter   |Value  |NumOfTempTables|Db Max Conn |
+----+------------+-------+---------------+------------+
| 1  |key_buffer_ | 25M   | 30682         | 29         |
|    |size        |       |               |            | 
+----+------------+-------+---------------+------------+
| 2  |key_buffer_ | 55M   | 30793         | 29         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 3  |key_buffer_ | 100M  | 30666         | 28         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 4  |key_buffer_ | 125M  | 30593         | 24         |
|    |size        |       |               |            | 
+----+------------+-------+---------------+------------+
| 5  |query_cache_| 100M  | 30627         | 32         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 6  |query_cache_| 250M  | 30761         | 26         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 7  |query_cache_| 500M  | 30864         | 83*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 8  |query_cache_| 1G    | 30706         | 75*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 9  |tmp_table_  | 125M  | 30724         | 31         |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 10 |tmp_table_  | 250M  | 30689         | 90*        |
|    |size        |       |               |            |
+----+------------+-------+---------------+------------+
| 11 |tmp_table_  | 500M  | 30792         | 28         |
|    |size        |       |               |            |  
+----+------------+-------+---------------+------------+
| 12 |Sort_buffer&| 256K  | 30754         | 28         |
|    |Join_buffer |       |               |            |
+----+------------+-------+---------------+------------+
| 13 |Sort_buffer&| 512K  | 30788         | 30         |
|    |Join_buffer |       |               |            | 
+----+------------+-------+---------------+------------+
| 14 |Sort_buffer&| 1M    | 30788         | 28         |
|    |Join_buffer |       |               |            | 
+----+------------+-------+---------------+------------+
| 15 |Sort_buffer&| 4M    | 30642         | 35         |
|    |Join_buffer |       |               |            |
+----+------------+-------+---------------+------------+
| 16 |innodb-     | 1G    | 30695         | 33         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            |
+----+------------+-------+---------------+------------+
| 17 |innodb-     | 2G    | 30791         | 28         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            | 
+----+------------+-------+---------------+------------+
| 18 |innodb-     | 3G    | 30719         | 34         |
|    |buffer-     |       |               |            |
|    |pool-size   |       |               |            |  
+----+------------+-------+---------------+------------+

* Trung bình của ba lần chạy

Các hình ảnh dưới đây mô tả dung lượng bộ nhớ và CPU mà máy chủ cơ sở dữ liệu cần cho các cấu hình khác nhau. Các đường màu đen biểu thị giá trị tối thiểu và tối đa và các thanh màu xanh biểu thị giá trị bắt đầu và kết thúc. Bộ nhớ tối đa được 4096Mchỉ định trong câu hỏi.

Sử dụng bộ nhớ Sử dụng CPU


Bạn đang sử dụng công cụ lưu trữ nào? MyiSAM? Nếu bạn không sử dụng bảng MyISAM, việc dựa vào key_buffer_size sẽ không có ý nghĩa. nếu bạn đang sử dụng công cụ lưu trữ innodb, kích thước của innodb_buffer_pool_size là bao nhiêu. Bạn đang sử dụng query_cache?
kasi
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.