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_tables
trong 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_tables
là> 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
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ó?
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_queries
nhậ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_size
Tôi có 0 key_reads
và 0 key_writes
vì vậy tôi cho rằng nó key_buffer_size
đủ lớn.
Tôi đã tăng tmp_table_size
và max-heap-table-size
lê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_passes
mỗi giây trong đầu ra SHOW GLOBAL STATUS, bạn có thể xem xét tăng sort_buffer_size
giá trị. Tôi đã có 2 sort_merge_passes
trong một giờ vì vậy tôi coi sort_buffer_size
là đủ 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_disk
vẫ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_disk
sau 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