เรากำลังเรียกใช้ไซต์ (Moodle) ที่ผู้ใช้พบว่าช้า ฉันคิดว่าฉันได้ติดตามปัญหาของ MySQL ที่สร้างตารางชั่วคราวบนดิสก์ ฉันดูตัวแปรcreated_tmp_disk_tables
ในการดูแลเซิร์ฟเวอร์ Mysql Workbench และจำนวนเพิ่มขึ้นด้วยประมาณ 50 tables / s หลังจากใช้ไป 1 วันcreated_tmp_disk_tables
คือ> 100k นอกจากนี้ดูเหมือนว่าหน่วยความจำจะไม่ออก การใช้งานเพิ่มขึ้นเรื่อย ๆ จนกระทั่งระบบใช้งานไม่ได้และเราต้องเริ่ม MySQL ใหม่ ฉันต้องเริ่มต้นใหม่เกือบทุกวันและเริ่มต้นด้วยการใช้หน่วยความจำที่มีอยู่ประมาณ 30-35% และจบวันด้วย 80%
ฉันไม่มี blobs ในฐานข้อมูลและไม่สามารถควบคุมการค้นหาได้ดังนั้นฉันจึงไม่สามารถพยายามปรับให้เหมาะสม ฉันได้ใช้Percona Confirguration Wizardเพื่อสร้างไฟล์การกำหนดค่า แต่ my.ini ไม่ได้แก้ปัญหาเช่นกัน
คำถาม
ฉันควรเปลี่ยนอะไรเพื่อหยุด MySQL ไม่ให้สร้างตารางชั่วคราวบนดิสก์ จำเป็นต้องเปลี่ยนการตั้งค่าหรือไม่? ฉันควรจะโยนความทรงจำมากกว่านี้หรือไม่
ฉันจะหยุด MySQL ไม่ให้กินหน่วยความจำได้อย่างไร
แก้ไข
ฉันเปิดใช้งานการslow_queries
บันทึกและค้นพบว่าการสืบค้นSELECT GET_LOCK()
ถูกบันทึกไว้ช้า การค้นหาอย่างรวดเร็วเปิดเผยว่าฉันอนุญาตการเชื่อมต่อแบบถาวรในการกำหนดค่า PHP ( mysqli.allow_persistent = ON
) ฉันปิดสิ่งนี้แล้ว สิ่งนี้ช่วยลดอัตราการใช้งานหน่วยความจำของ MySQL ซึ่งยังคงสร้างตารางชั่วคราวอยู่
ฉันยังตรวจสอบว่าkey_buffer size
มีขนาดใหญ่พอ key_writes
ผมมองไปที่ตัวแปร นี่ควรเป็นศูนย์ ถ้าไม่เพิ่มkey_buffer_size
. ฉันมีศูนย์key_reads
และศูนย์key_writes
ดังนั้นฉันคิดว่าkey_buffer_size
มันมีขนาดใหญ่พอ
ฉันเพิ่มtmp_table_size
และmax-heap-table-size
ถึง 1024M เนื่องจากการเพิ่มขึ้นของ created_tmp_disk_tables อาจบ่งบอกว่าตารางไม่สามารถพอดีกับหน่วยความจำได้ สิ่งนี้ไม่ได้แก้มัน
แก้ไข 2
หากคุณเห็นจำนวนมากsort_merge_passes
ต่อวินาทีในเอาต์พุต SHOW GLOBAL STATUS คุณสามารถพิจารณาเพิ่มsort_buffer_size
มูลค่าได้ ฉันมี 2 sort_merge_passes
ชั่วโมงต่อชั่วโมงดังนั้นฉันคิดว่ามันsort_buffer_size
ใหญ่พอ
Ref: คู่มือ Mysql เปิด sort_buffer_size
แก้ไข 3
ฉันได้แก้ไขการเรียงลำดับและเข้าร่วมบัฟเฟอร์ตามที่แนะนำโดย @RolandoMySQLDBA ผลลัพธ์แสดงในตารางด้านล่าง แต่ฉันคิดว่าcreated_tmp_tables_on_disk
ยังคงสูง ฉันรีสตาร์ทเซิร์ฟเวอร์ mysql หลังจากฉันเปลี่ยนค่าและตรวจสอบcreated_tmp_tables_on_disk
หลังจากผ่านไปหนึ่งวัน (8 ชั่วโมง) และคำนวณค่าเฉลี่ย ข้อเสนอแนะอื่น ๆ ? สำหรับฉันดูเหมือนว่ามีบางอย่างที่ไม่พอดีกับภาชนะบางชนิด แต่ฉันไม่สามารถคิดได้ว่ามันคืออะไร
+---------------------+-------------+-------------+--------------------+
| 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 |
+---------------------+-------------+-------------+--------------------+
นี่คือการกำหนดค่าของฉัน:
+-----------------------+-----------------------+
|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 |
+-----------------------+-----------------------+
ข้อมูลเพิ่มเติม
+--------------------+---------+
|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|
+--------------------+---------+
การตั้งค่านี้มอบให้ฉันดังนั้นฉันจึงมีข้อ จำกัด ในการควบคุม เว็บเซิร์ฟเวอร์ใช้ CPU และ RAM น้อยมากดังนั้นฉันจึงแยกเครื่องดังกล่าวเป็นคอขวด การตั้งค่า MySQL ส่วนใหญ่มาจากเครื่องมือสร้างอัตโนมัติ config
ฉันได้ตรวจสอบระบบโดยใช้ PerfMon เป็นเวลาสองสามวัน จากนั้นฉันสรุปได้ว่าไม่ใช่ OS ที่เปลี่ยนเป็นดิสก์
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