Score:1

ความผิดพลาดของเซิร์ฟเวอร์ที่เกิดจากการใช้ MySQL CPU

ธง gy

สถานที่:

ฉันไม่ใช่ DBA และฉันไม่ได้อยู่ในเซิร์ฟเวอร์ แต่ฉันเป็นคนเดียวในบริษัทที่สามารถใช้สิ่งนั้นเพียงเล็กน้อยได้

เรามี Windows VPS ที่มีข้อกำหนดดังต่อไปนี้:

ซีพียู: Intel Xeon E5-2630 v4 2.20GHz
แรม: 60GB
ดังนั้น: Windows Server 2016 Datacenter
ฮาร์ดดิสก์: 2TB SSD

ที่นี่ฉันได้โฮสต์เว็บแอปพลิเคชันของฉันซึ่งเข้าถึง DB ที่โฮสต์ในเซิร์ฟเวอร์เดียวกัน เว็บแอปพลิเคชันถูกใช้งานโดยผู้ใช้ +- 1,000 รายซึ่งต้องการข้อมูลจากฐานข้อมูลผ่านเว็บแอปพลิเคชัน API เวอร์ชัน MySQL คือ: 8.0.20 (เซิร์ฟเวอร์ชุมชน MySQL - GPL)

และนี่คือ my.ini

# ค่าปรับแต่งเริ่มต้นอื่น ๆ
# ไฟล์กำหนดค่าอินสแตนซ์ของเซิร์ฟเวอร์ MySQL
# --------------------------------------------- ---------------------
# สร้างโดยตัวช่วยสร้างการกำหนดค่าอินสแตนซ์ของเซิร์ฟเวอร์ MySQL
# 
# คำแนะนำในการติดตั้ง
# --------------------------------------------- ---------------------
# 
# บน Linux คุณสามารถคัดลอกไฟล์นี้ไปที่ /etc/my.cnf เพื่อตั้งค่าตัวเลือกส่วนกลาง
# mysql-data-dir/my.cnf เพื่อตั้งค่าตัวเลือกเฉพาะเซิร์ฟเวอร์
# (@localstatedir@ สำหรับการติดตั้งนี้) หรือถึง
# ~/.my.cnf เพื่อตั้งค่าตัวเลือกเฉพาะผู้ใช้
# 
# บน Windows คุณควรเก็บไฟล์นี้ไว้ในไดเร็กทอรีการติดตั้ง 
# เซิร์ฟเวอร์ของคุณ (เช่น C:\Program Files\MySQL\MySQL Server XY) ถึง
# ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์อ่านไฟล์กำหนดค่าโดยใช้ตัวเลือกการเริ่มต้น 
# "--ไฟล์เริ่มต้น". 
# 
# หากต้องการเรียกใช้เซิร์ฟเวอร์จากบรรทัดคำสั่ง ให้ดำเนินการในไฟล์ 
# เชลล์บรรทัดคำสั่งเช่น
# mysqld --defaults-file="C:\Program Files\MySQL\MySQL Server XY\my.ini"
# 
# หากต้องการติดตั้งเซิร์ฟเวอร์เป็นบริการ Windows ด้วยตนเอง ให้ดำเนินการนี้ใน 
# เชลล์บรรทัดคำสั่งเช่น
# mysqld -- ติดตั้ง MySQLXY --defaults-file="C:\Program Files\MySQL\MySQL Server XY\my.ini"
# 
# จากนั้นดำเนินการนี้ในเชลล์บรรทัดคำสั่งเพื่อเริ่มเซิร์ฟเวอร์เช่น
# เริ่มต้นสุทธิ MySQLXY
# 
#คำแนะนำในการแก้ไขไฟล์นี้
# --------------------------------------------- ---------------------
# 
# ในไฟล์นี้ คุณสามารถใช้ตัวเลือกแบบยาวทั้งหมดที่โปรแกรมรองรับได้
# หากคุณต้องการทราบตัวเลือกที่โปรแกรมรองรับ ให้เริ่มโปรแกรม
# ด้วยตัวเลือก "--help"
# 
# ข้อมูลรายละเอียดเพิ่มเติมเกี่ยวกับแต่ละตัวเลือกยังสามารถ
#ดูได้จากคู่มือ
# 
# สำหรับคำแนะนำเกี่ยวกับวิธีเปลี่ยนการตั้งค่าโปรดดู
# https://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
# 
#ส่วนลูกค้า
# --------------------------------------------- ---------------------
# 
# ตัวเลือกต่อไปนี้จะถูกอ่านโดยแอปพลิเคชันไคลเอนต์ MySQL
# โปรดทราบว่ารับประกันเฉพาะแอปพลิเคชันไคลเอนต์ที่จัดส่งโดย MySQL เท่านั้น
#เพื่ออ่านส่วนนี้ หากคุณต้องการโปรแกรมไคลเอนต์ MySQL ของคุณเอง
# ให้เกียรติค่าเหล่านี้ คุณต้องระบุเป็นตัวเลือกระหว่าง
# การเริ่มต้นไลบรารีไคลเอนต์ MySQL
# 
[ลูกค้า]

#ท่อ=

# ซ็อกเก็ต = MYSQL

พอร์ต = 3306

[มายเอสคิวแอล]
ไม่มีเสียงบี๊บ =

# ชุดอักขระเริ่มต้น =

#ส่วนเซิฟเวอร์
# --------------------------------------------- ---------------------
# 
# ตัวเลือกต่อไปนี้จะถูกอ่านโดยเซิร์ฟเวอร์ MySQL ทำให้เเน่นอน
# คุณได้ติดตั้งเซิร์ฟเวอร์อย่างถูกต้อง (ดูด้านบน) ดังนั้นจึงอ่านสิ่งนี้ 
#ไฟล์.=
# 
# server_type=2
[มายเอสคิวลด์]

# สามตัวเลือกถัดไปเป็นของ SERVER_PORT ด้านล่าง
# ข้ามเครือข่าย =
# เปิดใช้งานชื่อท่อ =
# หน่วยความจำที่ใช้ร่วมกัน =

# หน่วยความจำที่ใช้ร่วมกันชื่อฐาน = MYSQL

# ท่อที่เซิร์ฟเวอร์ MySQL จะใช้
# ซ็อกเก็ต = MYSQL

# พอร์ต TCP/IP ที่เซิร์ฟเวอร์ MySQL จะรับฟัง
พอร์ต = 3306

# เส้นทางไปยังไดเร็กทอรีการติดตั้ง เส้นทางทั้งหมดมักจะได้รับการแก้ไขโดยสัมพันธ์กับสิ่งนี้
# basedir="C:/ไฟล์โปรแกรม/MySQL/MySQL Server 8.0/"

# พาธไปยังรูทฐานข้อมูล
datadir=C:/ProgramData/MySQL/MySQL Server 8.0/Data

# ชุดอักขระเริ่มต้นที่จะใช้เมื่อมีสคีมาหรือตารางใหม่
# สร้างและไม่มีการกำหนดชุดอักขระ
# ชุดอักขระเซิร์ฟเวอร์ =

# ปลั๊กอินการรับรองความถูกต้องเริ่มต้นที่จะใช้เมื่อเชื่อมต่อกับเซิร์ฟเวอร์
default_authentication_plugin=mysql_native_password

# เครื่องมือจัดเก็บข้อมูลเริ่มต้นที่จะใช้เมื่อสร้างตารางใหม่เมื่อ
default-storage-engine=INNODB

# ตั้งค่าโหมด SQL เป็นเข้มงวด
sql-mode="STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION"

# การบันทึกทั่วไปและช้า
ล็อกเอาท์พุต = FILE

บันทึกทั่วไป = 0

General_log_file="VMI384596.log"

แบบสอบถามช้าล็อก = 1

slow_query_log_file="VMI384596-slow.log"

long_query_time=10

# บันทึกข้อผิดพลาด
บันทึกข้อผิดพลาด = "VMI384596.err"

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ระบุชื่อฐานที่จะใช้สำหรับไฟล์บันทึกไบนารี ด้วยการบันทึกไบนารี
เปิดใช้งาน # เซิร์ฟเวอร์จะบันทึกคำสั่งทั้งหมดที่เปลี่ยนข้อมูลเป็นไบนารี
# บันทึกซึ่งใช้สำหรับการสำรองข้อมูลและการจำลองแบบ
ล็อกบิน = "VMI384596-bin"

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ตั้งค่ารูปแบบการบันทึกไบนารีและสามารถเป็น STATEMENT, ROW,
#หรือผสม แนะนำให้ใช้ ROW สำหรับการจำลองแบบกลุ่ม
#binlog_format=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ทำให้ต้นแบบเขียนการตรวจสอบสำหรับแต่ละเหตุการณ์ในบันทึกไบนารี
# binlog_checksum รองรับค่า NONE (ปิดใช้งาน) และ CRC32
# ค่าเริ่มต้นคือ CRC32 เมื่อปิดใช้งาน (ค่า NONE) เซิร์ฟเวอร์จะตรวจสอบ
# ว่ามันกำลังเขียนเฉพาะเหตุการณ์ที่สมบูรณ์ในบันทึกไบนารีโดยการเขียน
# และตรวจสอบความยาวของเหตุการณ์ (แทนที่จะเป็นการตรวจสอบ) สำหรับแต่ละเหตุการณ์
# ต้องใช้ NONE กับ Group Replication
# binlog_checksum=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ชื่อฐานสำหรับบันทึกการถ่ายทอด เซิร์ฟเวอร์สร้างไฟล์บันทึกการถ่ายทอด
# ลำดับโดยการเพิ่มส่วนต่อท้ายที่เป็นตัวเลขให้กับชื่อฐาน หากคุณระบุสิ่งนี้
# ตัวเลือก ค่าที่ระบุยังใช้เป็นชื่อพื้นฐานสำหรับบันทึกการถ่ายทอด
#ไฟล์ดัชนี บันทึกการถ่ายทอดเพิ่มความเร็วโดยใช้โหลดบาลานซ์ระหว่างดิสก์
#รีเลย์_ล็อก=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ระบุรหัสเซิร์ฟเวอร์ สำหรับเซิร์ฟเวอร์ที่ใช้ในโทโพโลยีการจำลองแบบ
# คุณต้องระบุรหัสเซิร์ฟเวอร์ที่ไม่ซ้ำกันสำหรับแต่ละเซิร์ฟเวอร์การจำลองแบบใน
# range from 1 to 2^32 - 1. �Unique� หมายความว่าแต่ละ ID จะต้องแตกต่างกัน
# จากทุก ID อื่น ๆ ที่ใช้งานโดยต้นแบบหรือทาสการจำลองแบบอื่น ๆ
รหัสเซิร์ฟเวอร์ = 1

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ชื่อโฮสต์หรือที่อยู่ IP ของสเลฟที่จะรายงานไปยังมาสเตอร์
#อยู่ระหว่างการขึ้นทะเบียนทาส ค่านี้จะปรากฏในเอาต์พุตของ SHOW SLAVE HOSTS
#บนเซิร์ฟเวอร์หลัก ปล่อยให้ค่าไม่ได้ตั้งค่าหากคุณไม่ต้องการให้เป็นทาส
#ลงทะเบียนเองกับมาสเตอร์
# report_host=0.0

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# หมายเลขพอร์ต TCP/IP สำหรับการเชื่อมต่อกับสเลฟ ซึ่งจะรายงานไปยังมาสเตอร์ในระหว่างนั้น
#ขึ้นทะเบียนทาส ตั้งค่านี้เฉพาะเมื่อสเลฟกำลังฟังพอร์ตที่ไม่ใช่ค่าเริ่มต้นหรือหาก
# คุณมีอุโมงค์พิเศษจากมาสเตอร์หรือไคลเอนต์อื่นไปยังทาส
รายงาน_พอร์ต=3306

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# ตัวเลือกนี้ระบุว่าตัวระบุธุรกรรมทั่วโลก (GTID) คือ
# ใช้เพื่อระบุธุรกรรม ต้องใช้ ON กับ Group Replication
#gtid_mode=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# เมื่อเปิดใช้งาน เซิร์ฟเวอร์จะบังคับใช้ความสอดคล้องของ GTID โดยอนุญาตให้ดำเนินการ
# เฉพาะคำสั่งที่สามารถบันทึกได้อย่างปลอดภัยโดยใช้ GTID คุณต้องตั้งค่านี้
# ตัวเลือกเป็นเปิดก่อนที่จะเปิดใช้งานการจำลองแบบตาม GTID
#การบังคับใช้_gtid_consistency=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# การอัปเดตที่ได้รับจากเซิร์ฟเวอร์สเลฟจากเซิร์ฟเวอร์หลักควรเป็นหรือไม่
# บันทึกไปยังบันทึกไบนารีของทาสเอง ต้องเปิดใช้การบันทึกแบบไบนารี
# ทาสสำหรับตัวแปรนี้จะมีผลใดๆ ON ต้องใช้กับ
# การจำลองแบบกลุ่ม
# log_slave_updates=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# กำหนดว่าเซิร์ฟเวอร์สเลฟบันทึกสถานะหลักและข้อมูลการเชื่อมต่อหรือไม่
# ไปยังตาราง InnoDB ในฐานข้อมูล mysql หรือไปยังไฟล์ในไดเร็กทอรีข้อมูล
# จำเป็นต้องมีการตั้งค่า TABLE เมื่อมีการกำหนดค่าช่องทางการจำลองแบบหลายช่องทาง
# master_info_repository=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# กำหนดว่าเซิร์ฟเวอร์สเลฟบันทึกตำแหน่งในรีเลย์บันทึกไปยัง InnoDB หรือไม่
# ตารางในฐานข้อมูล mysql หรือไปยังไฟล์ในไดเร็กทอรีข้อมูล การตั้งค่าตารางคือ
# จำเป็นเมื่อมีการกำหนดค่าช่องทางการจำลองแบบหลายช่องทาง
# relay_log_info_repository=

# ***** การจำลองกลุ่มที่เกี่ยวข้อง *****
# กำหนดอัลกอริทึมที่ใช้ในการแฮชการเขียนที่ดึงออกมาระหว่างการทำธุรกรรม ถ้าคุณ
# กำลังใช้ Group Replication ตัวแปรนี้ต้องตั้งค่าเป็น XXHASH64 เนื่องจากกระบวนการ
# ของการแยกการเขียนจากธุรกรรมเป็นสิ่งจำเป็นสำหรับการตรวจจับความขัดแย้งทั้งหมด
# สมาชิกกลุ่ม.
#transaction_write_set_extraction=

# หมายเหตุ: แก้ไขค่านี้หลังจากการเริ่มต้นเซิร์ฟเวอร์จะไม่มีผล
lower_case_table_names=1

# ไฟล์ส่วนตัวที่ปลอดภัย
secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/อัพโหลด"

# จำนวนเซสชันพร้อมกันสูงสุดที่เซิร์ฟเวอร์ MySQL จะทำได้
# อนุญาต. หนึ่งในการเชื่อมต่อเหล่านี้จะถูกสงวนไว้สำหรับผู้ใช้ที่มี
# สิทธิ์พิเศษเพื่อให้ผู้ดูแลระบบสามารถเข้าสู่ระบบได้แม้ว่า
# ถึงขีดจำกัดการเชื่อมต่อแล้ว
max_connections = 2,000

# จำนวนตารางที่เปิดสำหรับเธรดทั้งหมด การเพิ่มมูลค่านี้
# เพิ่มจำนวนตัวอธิบายไฟล์ที่ mysqld ต้องการ
# ดังนั้นคุณต้องแน่ใจว่าได้กำหนดจำนวนไฟล์ที่เปิด
# อนุญาตอย่างน้อย 4096 ในตัวแปร "open-files-limit" ใน
# ส่วน [mysqld_safe]
table_open_cache=2000

# ขนาดสูงสุดสำหรับตารางชั่วคราวภายใน (ในหน่วยความจำ) ถ้าเป็นโต๊ะ
# เติบโตมากกว่าค่านี้ มันจะถูกแปลงเป็นดิสก์โดยอัตโนมัติ
# ตามตาราง ข้อจำกัดนี้สำหรับตารางเดียว สามารถมีได้มากมาย
# ของพวกเขา.
tmp_table_size=4G

# จำนวนเธรดที่เราควรเก็บไว้ในแคชเพื่อใช้ซ้ำ เมื่อลูกค้า
# ตัดการเชื่อมต่อ เธรดของไคลเอนต์จะถูกใส่ในแคชหากไม่มี
# มากกว่าเธรด thread_cache_size จากเมื่อก่อน นี้ลดลงอย่างมาก
# จำนวนการสร้างเธรดที่จำเป็นหากคุณมีเธรดใหม่จำนวนมาก
#การเชื่อมต่อ (โดยปกติแล้วสิ่งนี้ไม่ได้ให้ประสิทธิภาพที่โดดเด่น
# การปรับปรุงหากคุณมีการติดตั้งเธรดที่ดี)
thread_cache_size=10

# *** ตัวเลือกเฉพาะ MyISAM
# ขนาดสูงสุดของไฟล์ชั่วคราว MySQL อนุญาตให้ใช้ได้ในขณะที่
# สร้างดัชนีใหม่ (ระหว่างการซ่อมแซม แก้ไขตาราง หรือโหลดข้อมูลในไฟล์
# หากขนาดไฟล์ใหญ่กว่านี้จะจัดทำดัชนี
# ผ่านคีย์แคช (ซึ่งช้ากว่า)
myisam_max_sort_file_size=10G

# ขนาดของบัฟเฟอร์ที่จัดสรรเมื่อเรียงลำดับดัชนี MyISAM
# ระหว่าง REPAIR TABLE หรือเมื่อสร้างดัชนีด้วย CREATE INDEX
# หรือเปลี่ยนตาราง
myisam_sort_buffer_size=256K

# ขนาดของคีย์บัฟเฟอร์ ใช้เพื่อแคชบล็อคดัชนีสำหรับตาราง MyISAM
# อย่าตั้งค่าให้ใหญ่กว่า 30% ของหน่วยความจำที่มีอยู่ของคุณ เป็นหน่วยความจำบางส่วน
ระบบปฏิบัติการยังต้องการ # เพื่อแคชแถว แม้ว่าคุณจะไม่ได้ใช้
# ตาราง MyISAM คุณควรตั้งค่าเป็น 8-64M เหมือนเดิม
# ใช้สำหรับตารางดิสก์ชั่วคราวภายใน
key_buffer_size = 64M

# ขนาดของบัฟเฟอร์ที่ใช้สำหรับสแกนตาราง MyISAM แบบเต็มตาราง
# จัดสรรต่อเธรดหากจำเป็นต้องสแกนแบบเต็ม
read_buffer_size=64K

read_rnd_buffer_size=256K

# *** INNODB ตัวเลือกเฉพาะ ***
# innodb_data_home_dir=

# ใช้ตัวเลือกนี้หากคุณมีเซิร์ฟเวอร์ MySQL ที่เปิดใช้งานการรองรับ InnoDB
#แต่คุณไม่คิดจะใช้มัน สิ่งนี้จะช่วยประหยัดหน่วยความจำและพื้นที่ดิสก์
#และเร่งดำเนินการบางอย่าง
#skip-innodb=

# หากตั้งค่าเป็น 1 InnoDB จะล้าง (fsync) บันทึกธุรกรรมไปที่
# ดิสก์ในแต่ละคอมมิชชันซึ่งมีพฤติกรรมของกรดเต็มรูปแบบ ถ้าคุณคือ
# เต็มใจที่จะประนีประนอมกับความปลอดภัยนี้ และคุณกำลังทำงานน้อย
# ธุรกรรม คุณสามารถตั้งค่านี้เป็น 0 หรือ 2 เพื่อลด I/O ของดิสก์เป็น
# บันทึก ค่า 0 หมายความว่าบันทึกถูกเขียนไปยังไฟล์บันทึกเท่านั้น และ
# ไฟล์บันทึกถูกล้างไปยังดิสก์ประมาณหนึ่งครั้งต่อวินาที ค่า 2
# หมายถึงบันทึกถูกเขียนไปยังไฟล์บันทึกในแต่ละการกระทำ แต่บันทึก
# ไฟล์จะถูกล้างลงดิสก์ประมาณหนึ่งครั้งต่อวินาทีเท่านั้น
innodb_flush_log_at_trx_commit = 1

# ขนาดของบัฟเฟอร์ InnoDB ใช้สำหรับการบัฟเฟอร์ข้อมูลบันทึก เร็ว ๆ นี้
# เต็มแล้ว InnoDB จะต้องล้างข้อมูลลงดิสก์ ในขณะที่มันถูกล้างออก
# หนึ่งครั้งต่อวินาที มันไม่สมเหตุสมผลที่จะมีขนาดใหญ่มาก
# (แม้จะมีธุรกรรมที่ยาวนาน)


# InnoDB ซึ่งแตกต่างจาก MyISAM ใช้พูลบัฟเฟอร์เพื่อแคชทั้งดัชนีและ
#แถวข้อมูล ยิ่งคุณตั้งค่านี้มากเท่าใด ดิสก์ I/O ก็ยิ่งจำเป็นเท่านั้น
#เข้าถึงข้อมูลในตาราง บนเซิร์ฟเวอร์ฐานข้อมูลเฉพาะ คุณสามารถตั้งค่านี้ได้
# พารามิเตอร์สูงถึง 80% ของขนาดหน่วยความจำกายภาพของเครื่อง อย่าตั้งค่า
# ใหญ่เกินไป แต่เนื่องจากการแข่งขันของหน่วยความจำกายภาพอาจ
# ทำให้เกิดการเพจในระบบปฏิบัติการ โปรดทราบว่าในระบบ 32 บิตคุณ
# อาจถูกจำกัดไว้ที่ 2-3.5G ของหน่วยความจำระดับผู้ใช้ต่อการประมวลผล ดังนั้นอย่าทำเช่นนั้น
#ตั้งสูงเกินไป
innodb_buffer_pool_size=38G

# ขนาดของแต่ละไฟล์บันทึกในกลุ่มบันทึก คุณควรกำหนดขนาดรวมกัน
# ของไฟล์บันทึกถึงประมาณ 25%-100% ของขนาดบัฟเฟอร์พูลของคุณเพื่อหลีกเลี่ยง
# กิจกรรมล้างบัฟเฟอร์พูลที่ไม่จำเป็นในการเขียนทับไฟล์บันทึก อย่างไรก็ตาม,
# โปรดทราบว่าขนาดไฟล์บันทึกที่ใหญ่ขึ้นจะเพิ่มเวลาที่จำเป็นสำหรับ
#ขั้นตอนการกู้คืน
innodb_log_file_size=48M

# จำนวนเธรดที่อนุญาตภายในเคอร์เนล InnoDB ค่าที่เหมาะสมที่สุด
# ขึ้นอยู่กับแอพพลิเคชั่น ฮาร์ดแวร์ และระบบปฏิบัติการเป็นอย่างสูง
#คุณสมบัติของตัวกำหนดตารางเวลา ค่าที่สูงเกินไปอาจทำให้ด้ายหลุดได้
innodb_thread_concurrency=21

# ขนาดที่เพิ่มขึ้น (เป็น MB) สำหรับการขยายขนาดของไฟล์พื้นที่ตารางระบบ InnoDB ที่ขยายอัตโนมัติเมื่อเต็ม
innodb_autoextend_increment=64

# จำนวนภูมิภาคที่แบ่งกลุ่มบัฟเฟอร์ InnoDB
# สำหรับระบบที่มีบัฟเฟอร์พูลในช่วงหลายกิกะไบต์ การแบ่งบัฟเฟอร์พูลออกเป็นอินสแตนซ์แยกกันสามารถปรับปรุงการทำงานพร้อมกัน
# โดยการลดความขัดแย้งเมื่อเธรดต่างๆ อ่านและเขียนไปยังเพจที่เก็บไว้
innodb_buffer_pool_instances=8

# กำหนดจำนวนเธรดที่สามารถป้อน InnoDB ได้พร้อมกัน
innodb_concurrency_tickets=5,000

# ระบุระยะเวลาหน่วยเป็นมิลลิวินาที (ms) บล็อกที่แทรกลงในรายการย่อยเก่าต้องอยู่ที่นั่นหลังจากเข้าถึงครั้งแรกก่อน
# สามารถย้ายไปที่รายการย่อยใหม่ได้
innodb_old_blocks_time=1,000

# ระบุจำนวนไฟล์ .ibd สูงสุดที่ MySQL สามารถเปิดได้ในครั้งเดียว ค่าต่ำสุดคือ 10
innodb_open_files=300

# เมื่อเปิดใช้งานตัวแปรนี้ InnoDB จะอัปเดตสถิติระหว่างคำสั่งข้อมูลเมตา
innodb_stats_on_metadata=0

# เมื่อเปิดใช้งาน innodb_file_per_table (ค่าเริ่มต้นใน 5.6.6 และสูงกว่า) InnoDB จะเก็บข้อมูลและดัชนีสำหรับแต่ละตารางที่สร้างขึ้นใหม่
# ในไฟล์ .ibd แยกต่างหาก แทนที่จะอยู่ในพื้นที่ตารางของระบบ
innodb_file_per_table=1

# ใช้รายการค่าต่อไปนี้: 0 สำหรับ crc32, 1 สำหรับ sql_crc32, 2 สำหรับ innodb, 3 สำหรับ strict_innodb, 4 สำหรับไม่มี, 5 สำหรับ strict_none
innodb_checksum_algorithm = ไม่มี

ข้าม innodb-doublewrite=

# จำนวนคำขอการเชื่อมต่อคงค้างที่ MySQL สามารถมีได้
# ตัวเลือกนี้มีประโยชน์เมื่อเธรดหลักของ MySQL ได้รับคำขอการเชื่อมต่อจำนวนมากในเวลาอันสั้น
# จากนั้นจะใช้เวลาสักครู่ (แม้ว่าจะน้อยมาก) เพื่อให้เธรดหลักตรวจสอบการเชื่อมต่อและเริ่มเธรดใหม่
# ค่า back_log ระบุจำนวนคำขอที่สามารถซ้อนกันได้ในช่วงเวลาสั้นๆ ก่อน MySQL ชั่วขณะ
# หยุดตอบคำขอใหม่
# คุณต้องเพิ่มสิ่งนี้ก็ต่อเมื่อคุณคาดว่าจะมีการเชื่อมต่อจำนวนมากในช่วงเวลาสั้นๆ
back_log=80

# หากตั้งค่านี้เป็นค่าที่ไม่ใช่ศูนย์ ตารางทั้งหมดจะปิดทุก ๆ วินาที flush_time เพื่อเพิ่มทรัพยากรและ
# ซิงโครไนซ์ข้อมูลที่ไม่ได้ล้างออกไปยังดิสก์
# ตัวเลือกนี้ใช้ได้ดีที่สุดกับระบบที่มีทรัพยากรน้อยที่สุดเท่านั้น
flush_time=0

# ขนาดต่ำสุดของบัฟเฟอร์ที่ใช้สำหรับการสแกนดัชนีธรรมดา การสแกนดัชนีช่วง และการรวมที่ไม่ได้ใช้
# ดัชนีและทำการสแกนตารางทั้งหมด
join_buffer_size=256K

# ขนาดสูงสุดของหนึ่งแพ็กเก็ตหรือสตริงใดๆ ที่สร้างขึ้นหรือระดับกลาง หรือพารามิเตอร์ใดๆ ที่ส่งโดย
# mysql_stmt_send_long_data() ฟังก์ชัน C API
max_allowed_packet=4M

# หากคำขอเชื่อมต่อต่อเนื่องจากโฮสต์มากกว่านี้หลายรายการถูกขัดจังหวะโดยที่การเชื่อมต่อไม่สำเร็จ
# เซิร์ฟเวอร์บล็อกโฮสต์ไม่ให้ทำการเชื่อมต่อเพิ่มเติม
max_connect_errors=100

# เปลี่ยนจำนวนตัวอธิบายไฟล์ที่มีให้สำหรับ mysqld
# คุณควรลองเพิ่มค่าของตัวเลือกนี้หาก mysqld แสดงข้อผิดพลาด "Too many open files"
open_files_limit=4161

# หากคุณเห็น sort_merge_passes จำนวนมากต่อวินาทีในเอาต์พุต SHOW GLOBAL STATUS คุณสามารถลองเพิ่ม
# ค่า sort_buffer_size เพื่อเพิ่มความเร็วในการดำเนินการ ORDER BY หรือ GROUP BY ที่ไม่สามารถปรับปรุงได้ด้วยการเพิ่มประสิทธิภาพแบบสอบถาม
# หรือการจัดทำดัชนีที่ดีขึ้น
sort_buffer_size = 256K

# จำนวนคำจำกัดความของตาราง (จากไฟล์ .frm) ที่สามารถเก็บไว้ในแคชคำจำกัดความ
# หากคุณใช้ตารางจำนวนมาก คุณสามารถสร้างแคชข้อกำหนดตารางขนาดใหญ่เพื่อเพิ่มความเร็วในการเปิดตาราง
# แคชข้อกำหนดตารางใช้พื้นที่น้อยและไม่ใช้ตัวอธิบายไฟล์ซึ่งแตกต่างจากแคชตารางปกติ
# ค่าต่ำสุดและค่าเริ่มต้นคือ 400
table_definition_cache=1400

# ระบุขนาดสูงสุดของเหตุการณ์บันทึกไบนารีตามแถวเป็นไบต์
# แถวจะถูกจัดกลุ่มเป็นเหตุการณ์ที่เล็กกว่าขนาดนี้หากเป็นไปได้ ค่าควรเป็นผลคูณของ 256
binlog_row_event_max_size=8K

# หากค่าของตัวแปรนี้มากกว่า 0 สเลฟการจำลองจะซิงโครไนซ์ไฟล์ master.info กับดิสก์
# (ใช้ fdatasync()) หลังทุกเหตุการณ์ sync_master_info
sync_master_info=10,000

# หากค่าของตัวแปรนี้มากกว่า 0 เซิร์ฟเวอร์ MySQL จะซิงโครไนซ์บันทึกการถ่ายทอดไปยังดิสก์
# (ใช้ fdatasync()) หลังจากทุก sync_relay_log เขียนไปยังบันทึกการถ่ายทอด
sync_relay_log=10,000

# ถ้าค่าของตัวแปรนี้มากกว่า 0 สเลฟการจำลองจะซิงโครไนซ์ไฟล์ relay-log.info กับดิสก์
# (ใช้ fdatasync()) หลังจากทุกธุรกรรม sync_relay_log_info
sync_relay_log_info=10000

# โหลดปลั๊กอิน mysql เมื่อเริ่มต้น "plugin_x ; plugin_y"
#plugin_load=

# พอร์ต TCP/IP ที่ MySQL Server X Protocol จะรับฟัง
# Loose_mysqlx_port=33060

# ขนาดของคีย์บัฟเฟอร์ ใช้เพื่อแคชบล็อคดัชนีสำหรับตาราง MyISAM
# อย่าตั้งค่าให้ใหญ่กว่า 30% ของหน่วยความจำที่มีอยู่ของคุณ เป็นหน่วยความจำบางส่วน
ระบบปฏิบัติการยังต้องการ # เพื่อแคชแถว แม้ว่าคุณจะไม่ได้ใช้
# ตาราง MyISAM คุณควรตั้งค่าเป็น 8-64M เหมือนเดิม
# ใช้สำหรับตารางดิสก์ชั่วคราวภายใน

ฉันควรปรับปรุงประสิทธิภาพ MySQL ของฉันและป้องกันเซิร์ฟเวอร์ล่มด้วยการจำกัดการใช้งาน CPU อย่างไร

Score:1
ธง ua

ไม่มีคำอธิบายที่ชัดเจนในตัวแปรและสถานะ

การวิเคราะห์สถานะสากลและตัวแปร:

ข้อสังเกต:

  • เวอร์ชัน: 8.0.20
  • แรม 60 GB
  • เวลาทำงาน = 04:49:11; ค่า GLOBAL STATUS บางค่าอาจยังไม่มีความหมาย
  • คุณกำลังทำงานบน Windows
  • 4.89 คำถาม/วินาที : 3.43 คำถาม/วินาที

ปัญหาที่สำคัญกว่า:

แทบไม่มีอะไรเกิดขึ้น ฉันมีปัญหาในการจินตนาการว่า MySQL ทำให้เกิดความผิดพลาด

ต่ำกว่า max_connections ถึง 500 (มีการเชื่อมต่อพร้อมกันไม่เกิน 23 ครั้งตั้งแต่เริ่มต้น)

tmp_table_size = 500M -- ขณะนี้สูงจนเป็นอันตรายสำหรับจำนวน RAM ที่คุณมี

innodb_doublewrite = เปิด

รายละเอียดและข้อสังเกตอื่นๆ:

( innodb_lru_scan_ความลึก * innodb_page_cleaners ) = 1,024 * 4 = 4,096 -- จำนวนงานสำหรับโปรแกรมทำความสะอาดหน้าทุกๆ วินาที -- "InnoDB: page_cleaner: 1,000ms ตั้งใจวนลูปเอา ..." อาจแก้ไขได้โดยลดระดับ lru_scan_html: พิจารณา 1,000 / innodb_page_cleaners (ตอนนี้ 4) ตรวจสอบการแลกเปลี่ยนด้วย

( innodb_lru_scan_ความลึก ) = 1,024 -- "InnoDB: page_cleaner: 1000ms ตั้งใจวนลูปเอา ..." อาจแก้ไขได้โดยการลดระดับ lru_scan_html

( Innodb_buffer_pool_pages_free * 16384 / innodb_buffer_pool_size ) = 2,478,311 * 16384 / 38912M = 99.5% - บัฟเฟอร์พูลฟรี -- buffer_pool_size ใหญ่กว่าชุดการทำงาน ก็สามารถลดลงได้

( innodb_io_capacity ) = 200 -- เมื่อล้าง ให้ใช้ IOP จำนวนมากนี้ -- การอ่านอาจเฉื่อยชาหรือแหลมคม

( Innodb_buffer_pool_pages_free / Innodb_buffer_pool_pages_total ) = 2,478,311 / 2490368 = 99.5% -- ส่วนของ buffer_pool ไม่ได้ใช้งานอยู่ในขณะนี้ -- innodb_buffer_pool_size (ตอนนี้ 40802189312) ใหญ่เกินความจำเป็นหรือไม่

( innodb_io_capacity_max / innodb_io_capacity ) = 2,000 / 200 = 10 -- ความจุ: สูงสุด/ธรรมดา -- ข้อแนะนำ 2. ค่าสูงสุดควรเท่ากับ IOP ที่ระบบย่อย I/O ของคุณสามารถจัดการได้ (หากไม่ทราบประเภทไดรฟ์ 2000/200 อาจเป็นคู่ที่เหมาะสม)

( Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size ) = 196,214,784 / 38912M = 0.48% -- เปอร์เซ็นต์ของบัฟเฟอร์พูลที่ใช้โดยข้อมูล -- เปอร์เซ็นต์เล็กน้อย อาจ ระบุว่า buffer_pool มีขนาดใหญ่โดยไม่จำเป็น

( innodb_doublewrite ) = innodb_doublewrite = ปิด - I/O พิเศษ แต่ความปลอดภัยเป็นพิเศษเมื่อเกิดการชน -- ปิดใช้ได้สำหรับ FusionIO, Galera, Replicas, ZFS

( Innodb_os_log_written / (เวลาทำงาน / 3600) / innodb_log_files_in_group / innodb_log_file_size ) = 3,944,448 / (17351 / 3600) / 2 / 48M = 0.00813 -- อัตราส่วน -- (ดูนาที)

( เวลาทำงาน / 60 * innodb_log_file_size / Innodb_os_log_written ) = 17,351 / 60 * 48M / 3944448 = 3,690 -- นาทีระหว่างการหมุนบันทึก InnoDB ตั้งแต่ 5.6.8 เป็นต้นไป สามารถเปลี่ยนแปลงได้แบบไดนามิก อย่าลืมเปลี่ยน my.cnf ด้วย -- (คำแนะนำ 60 นาทีระหว่างการหมุนค่อนข้างไม่มีกฎเกณฑ์) ปรับ innodb_log_file_size (ตอนนี้ 50331648) (ไม่สามารถเปลี่ยนแปลงใน AWS)

( innodb_flush_method ) = innodb_flush_method = ไม่บัฟเฟอร์ -- InnoDB ควรขอให้ OS เขียนบล็อกอย่างไร แนะนำ O_DIRECT หรือ O_ALL_DIRECT (Percona) เพื่อหลีกเลี่ยงการบัฟเฟอร์ซ้ำซ้อน (อย่างน้อยสำหรับ Unix) ดู chrischandler สำหรับคำเตือนเกี่ยวกับ O_ALL_DIRECT

( innodb_io_capacity ) = 200 - I/O ops ต่อวินาทีที่มีความสามารถบนดิสก์ 100 สำหรับไดรฟ์ช้า 200 สำหรับไดรฟ์แบบหมุน 1,000-2,000 สำหรับ SSD; คูณด้วยปัจจัย RAID

( innodb_adaptive_hash_index ) = innodb_adaptive_hash_index = เปิด -- โดยปกติควรจะเปิด -- มีหลายกรณีที่ปิดดีกว่า ดูเพิ่มเติมที่ innodb_adaptive_hash_index_parts (ตอนนี้ 8) (หลัง 5.7.9) และ innodb_adaptive_hash_index_partitions (MariaDB และ Percona) ON มีส่วนเกี่ยวข้องกับข้อขัดข้องที่หายาก (ข้อผิดพลาด 73890) 10.5.0 ตัดสินใจที่จะปิดค่าเริ่มต้น

( innodb_print_all_deadlocks ) = innodb_print_all_deadlocks = ปิด -- ไม่ว่าจะบันทึก Deadlocks ทั้งหมด -- หากคุณประสบปัญหา Deadlocks ให้เปิดใช้งาน ข้อควรระวัง: หากคุณมีการชะงักงันจำนวนมาก สิ่งนี้อาจเขียนจำนวนมากลงในดิสก์

( max_connections ) = 2,000 -- จำนวนการเชื่อมต่อสูงสุด (เธรด) ส่งผลกระทบต่อการจัดสรรต่างๆ -- หาก max_connections (ปัจจุบันคือ 2000) สูงเกินไปและการตั้งค่าหน่วยความจำต่างๆ สูง คุณอาจใช้ RAM จนหมด

(bulk_insert_buffer_size) = 8 / 61440M = 0.01% -- บัฟเฟอร์สำหรับการแทรกหลายแถวและโหลดข้อมูล -- ใหญ่เกินไปอาจคุกคามขนาด RAM ขนาดเล็กเกินไปอาจขัดขวางการดำเนินการดังกล่าว

( tmp_table_size ) = 4096M --จำกัดขนาดของ หน่วยความจำ ตาราง temp ที่ใช้เพื่อรองรับ SELECT -- ลด tmp_table_size (ตอนนี้เป็น 4294967296) เพื่อป้องกันไม่ให้ RAM หมด อาจจะไม่เกิน64M.

( Select_full_join / Com_select ) = 15,198 / 31082 = 48.9% -- % ของการเลือกที่มีการรวมแบบไม่มีดัชนี -- เพิ่มดัชนีที่เหมาะสมลงในตารางที่ใช้ในการเข้าร่วม

( Com_admin_commands / ข้อความค้นหา ) = 25,348 / 84808 = 29.9% -- เปอร์เซ็นต์ของข้อความค้นหาที่เป็นคำสั่ง "admin" -- เกิดอะไรขึ้น?

( long_query_time ) = 10 -- Cutoff (วินาที) สำหรับกำหนดแบบสอบถาม "ช้า" -- แนะนำ 2

( log_slow_slave_statements ) = log_slow_slave_statements = ปิด -- (5.6.11, 5.7.1) ตามค่าเริ่มต้น คำสั่งที่จำลองจะไม่ปรากฏในสโลว์ล็อก สิ่งนี้ทำให้พวกเขาแสดง -- อาจมีประโยชน์ใน slowlog เพื่อดูการเขียนที่อาจรบกวนการอ่าน Replica

( back_log ) = 80 -- (ปรับขนาดอัตโนมัติตั้งแต่ 5.6.6 อ้างอิงจาก max_connections) -- การเพิ่มขึ้นเป็น min(150, max_connections (ปัจจุบันคือ 2000)) อาจช่วยได้เมื่อทำการเชื่อมต่อจำนวนมาก

( max_used_connections / max_connections ) = 23/2000 = 1.1% -- % สูงสุดของการเชื่อมต่อ -- เนื่องจากปัจจัยหน่วยความจำหลายอย่างสามารถขยายได้ตาม max_connections (ปัจจุบันคือ 2000) จึงเป็นการดีที่จะไม่ตั้งค่านั้นสูงเกินไป

( Com_change_db / การเชื่อมต่อ ) = 25,413 / 311 = 81.7 -- สวิตช์ฐานข้อมูลต่อการเชื่อมต่อ -- (เล็กน้อย) พิจารณาใช้ไวยากรณ์ "db.table"

( Aborted_connects / การเชื่อมต่อ ) = 227/311 = 73.0% -- บางทีแฮ็กเกอร์อาจพยายามเจาะเข้าไป? (พยายามเชื่อมต่อ)

เล็กผิดปกติ:

10 * read_buffer_size = 0.6MB
Com_insert = 4.4 /ชม
Handler_read_next = 16 /วินาที
Innodb_buffer_pool_reads * innodb_page_size / innodb_buffer_pool_size = 0.47%
Innodb_dblwr_pages_written = 0
Innodb_rows_updated = 0.62 /ชม
back_log / max_connections = 4.0%
innodb_doublewrite_files = 0
innodb_doublewrite_pages = 0

ใหญ่ผิดปกติ:

Com_create_db = 0.21 /ชม
Com_create_table = 92 /ชม
Com_show_charsets = 1.7 /ชม
Com_show_plugins = 0.41 /ชม
Com_show_storage_engines = 0.41 /ชม
Innodb_buffer_pool_pages_free = 2.48e+6
Innodb_system_rows_deleted = 0.1 /วินาที
Innodb_system_rows_inserted = 0.1 /วินาที
Innodb_system_rows_updated = 0.32 /วินาที
Ssl_accepts = 304
Ssl_default_timeout = 7,200
Ssl_finished_accepts = 304
Ssl_session_cache_hits = 290
Ssl_session_cache_timeouts = 5
Ssl_verify_ความลึก = 4.29e+9
Ssl_verify_mode = 5
gtid_executed_compression_period = 0.058 /วินาที
innodb_thread_concurrency = 21
max_error_count = 1,024
max_length_for_sort_data = 4,096
Optimizer_trace_offset = --1
performance_schema_max_cond_classes = 100
performance_schema_max_mutex_classes = 300
performance_schema_max_rwlock_classes = 60
performance_schema_max_stage_classes = 175
performance_schema_max_statement_classes = 218
performance_schema_max_thread_classes = 100

สตริงที่ผิดปกติ:

event_scheduler = เปิด
ft_boolean_syntax = + -><()~*:\"\"&
have_query_cache = ไม่
innodb_fast_shutdown = 1
innodb_temp_tablespaces_dir = .\#innodb_temp\
lower_case_file_system = เปิด
lower_case_table_names = 1
mysqlx_compression_algorithms = DEFLATE_STREAM,LZ4_MESSAGE,ZSTD_STREAM
Optimizer_trace = เปิดใช้งาน = ปิด, one_line = ปิด
Optimizer_trace_features = โลภมาก = เปิด, range_optimizer = เปิด, dynamic_range = เปิด, repeat_subselect = เปิด
protocol_compression_algorithms = zlib,zstd,ไม่บีบอัด
slave_rows_search_algorithms = INDEX_SCAN,HASH_SCAN

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา