Score:0

MySQL "ไม่สามารถจัดสรรหน่วยความจำสำหรับบัฟเฟอร์พูล" ที่ใช้หน่วยความจำ 73% ได้หรือไม่

ธง in

ฉันกำลังโฮสต์เว็บไซต์ WordPress บน DigitalOcean droplet (1GB RAM) ฐานข้อมูล MySQL ของเว็บไซต์ขัดข้องในบางครั้ง ซึ่งทำให้เว็บไซต์แสดงข้อความ "เกิดข้อผิดพลาดในการสร้างการเชื่อมต่อฐานข้อมูล" การใช้งานหน่วยความจำลดลงประมาณ 02:40 น. แสดงว่าเป็นช่วงที่ฐานข้อมูลขัดข้อง ฉันตรวจสอบไฟล์บันทึก MySQL สำหรับวันนั้น และรายการแรกสุดคือเวลา 10:47 น. นี่คือจุดเริ่มต้นของไฟล์บันทึก:

2021-12-06T10:47:14.800977Z 0 [คำเตือน] TIMESTAMP ที่มีค่า DEFAULT โดยปริยายเลิกใช้แล้ว โปรดใช้ --explicit_defaults_for_timest$
2021-12-06T10:47:14.806192Z 0 [หมายเหตุ] /usr/sbin/mysqld (mysqld 5.7.36-0ubuntu0.18.04.1) เริ่มต้นเป็นกระบวนการ 2810 ...
2021-12-06T10:47:14.819674Z 0 [หมายเหตุ] InnoDB: รองรับ PUNCH HOLE
2021-12-06T10:47:14.819711Z 0 [หมายเหตุ] InnoDB: Mutexes และ rw_locks ใช้ GCC atomic builtins
2021-12-06T10:47:14.819716Z 0 [หมายเหตุ] InnoDB: ใช้ mutexes เหตุการณ์
2021-12-06T10:47:14.819720Z 0 [หมายเหตุ] InnoDB: GCC ในตัว __atomic_thread_fence() ใช้สำหรับกั้นหน่วยความจำ
2021-12-06T10:47:14.819723Z 0 [หมายเหตุ] InnoDB: ตารางที่บีบอัดใช้ zlib 1.2.11
2021-12-06T10:47:14.819727Z 0 [หมายเหตุ] InnoDB: การใช้ AIO ดั้งเดิมของ Linux
2021-12-06T10:47:14.820551Z 0 [หมายเหตุ] InnoDB: จำนวนพูล: 1
2021-12-06T10:47:14.823342Z 0 [หมายเหตุ] InnoDB: การใช้คำสั่ง CPU crc32
2021-12-06T10:47:14.825847Z 0 [หมายเหตุ] InnoDB: กำลังเริ่มต้นบัฟเฟอร์พูล ขนาดรวม = 128M อินสแตนซ์ = 1 ขนาดก้อน = 128M
2021-12-06T10:47:14.826246Z 0 [ข้อผิดพลาด] InnoDB: mmap(137428992 ไบต์) ล้มเหลว; เออร์โน 12
2021-12-06T10:47:14.826258Z 0 [ข้อผิดพลาด] InnoDB: ไม่สามารถจัดสรรหน่วยความจำสำหรับบัฟเฟอร์พูล
2021-12-06T10:47:14.826262Z 0 [ข้อผิดพลาด] InnoDB: การเริ่มต้นปลั๊กอินถูกยกเลิกโดยมีข้อผิดพลาด ข้อผิดพลาดทั่วไป
2021-12-06T10:47:14.826270Z 0 [ข้อผิดพลาด] ฟังก์ชันเริ่มต้นของปลั๊กอิน 'InnoDB' ส่งกลับข้อผิดพลาด
2021-12-06T10:47:14.826274Z 0 [ข้อผิดพลาด] การลงทะเบียนปลั๊กอิน 'InnoDB' เป็น STORAGE ENGINE ล้มเหลว
2021-12-06T10:47:14.826278Z 0 [ข้อผิดพลาด] ไม่สามารถเริ่มต้นปลั๊กอินในตัว
2021-12-06T10:47:14.826282Z 0 [ข้อผิดพลาด] การยกเลิก

2021-12-06T10:47:14.832237Z 0 [หมายเหตุ] สิ้นสุด Binlog
2021-12-06T10:47:14.832297Z 0 [หมายเหตุ] กำลังปิดปลั๊กอิน 'CSV'
2021-12-06T10:47:14.832572Z 0 [หมายเหตุ] /usr/sbin/mysqld: การปิดระบบเสร็จสมบูรณ์

ตามไฟล์บันทึก ดูเหมือนว่า MySQL หน่วยความจำไม่เพียงพอ อย่างไรก็ตาม การใช้หน่วยความจำสำหรับหยดข้อมูลนั้นคงที่ประมาณ 73% จนกระทั่งฐานข้อมูลขัดข้องในเวลาประมาณ 02:40 น. ซึ่งลดลงเหลือ 32% ดูเหมือนว่ามีหน่วยความจำเหลือเฟือ แล้วทำไมมันถึงพังล่ะ?

แก้ไข ตามที่ร้องขอ นี่คือเนื้อหาของไฟล์กำหนดค่า MySQL ของฉัน:

/etc/mysql/conf.d/mysql.cnf

[มายเอสคิวแอล]

/etc/mysql/conf.d/mysqldump.cnf

[mysqldump]
เร็ว
อ้างชื่อ
max_allowed_packet = 16M

/etc/mysql/mysql.conf.d/mysqld.cnf

#
# ไฟล์การกำหนดค่าเซิร์ฟเวอร์ฐานข้อมูล MySQL
#
# คุณสามารถคัดลอกสิ่งนี้ไปยังหนึ่งใน:
# - "/etc/mysql/my.cnf" เพื่อตั้งค่าตัวเลือกส่วนกลาง
# - "~/.my.cnf" เพื่อตั้งค่าตัวเลือกเฉพาะผู้ใช้
#
# หนึ่งสามารถใช้ตัวเลือกยาวทั้งหมดที่โปรแกรมรองรับ
# เรียกใช้โปรแกรมด้วย --help เพื่อรับรายการตัวเลือกที่มีและด้วย
# --print-defaults เพื่อดูว่าตัวใดจะเข้าใจและใช้งานได้จริง
#
#ดูคำอธิบายได้ที่
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html

# สิ่งนี้จะถูกส่งไปยังไคลเอนต์ mysql ทั้งหมด
# มีรายงานว่ารหัสผ่านควรใส่เครื่องหมาย / เครื่องหมายคำพูด
# โดยเฉพาะอย่างยิ่งหากมีอักขระ "#" ...
# อย่าลืมแก้ไข /etc/mysql/debian.cnf เมื่อเปลี่ยนตำแหน่งซ็อกเก็ต

# นี่คือรายการสำหรับบางโปรแกรมเฉพาะ
# ค่าต่อไปนี้ถือว่าคุณมี ram อย่างน้อย 32M

[mysqld_safe]
ซ็อกเก็ต = /var/run/mysqld/mysqld.sock
สวย = 0

[มายเอสคิวลด์]
#
# * การตั้งค่าพื้นฐาน
#
ผู้ใช้ = mysql
ไฟล์ pid = /var/run/mysqld/mysqld.pid
ซ็อกเก็ต = /var/run/mysqld/mysqld.sock
พอร์ต = 3306
เบสซีร์ = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
ข้ามล็อคภายนอก
#
# แทนที่จะข้ามเครือข่ายค่าเริ่มต้นคือเปิดฟังเท่านั้น
# localhost ซึ่งเข้ากันได้มากกว่าและปลอดภัยไม่น้อย
ที่อยู่ผูก = 127.0.0.1
#
# * การปรับแต่งอย่างละเอียด
#
key_buffer_size = 16M
max_allowed_packet = 16M
thread_stack = 192K
thread_cache_size = 8
# สิ่งนี้จะแทนที่สคริปต์เริ่มต้นและตรวจสอบตาราง MyISAM หากจำเป็น
#ครั้งแรกที่ได้สัมผัส
myisam-recover-options = สำรองข้อมูล
#max_connections = 100
#table_open_cache = 64
#thread_concurrency = 10
#
# * การกำหนดค่าแบบสอบถามแคช
#
query_cache_limit = 1M
query_cache_size = 16M
#
# * การบันทึกและการจำลองแบบ
#
# ตำแหน่งทั้งสองได้รับการหมุนโดย cronjob
# โปรดทราบว่าประเภทบันทึกนี้เป็นตัวทำลายประสิทธิภาพ
# ตั้งแต่ 5.1 คุณสามารถเปิดใช้งานบันทึกเมื่อรันไทม์!
#general_log_file = /var/log/mysql/mysql.log
#general_log = 1
#
# บันทึกข้อผิดพลาด - ควรมีรายการน้อยมาก
#
log_error = /var/log/mysql/error.log
#
# ที่นี่ คุณสามารถดูข้อความค้นหาที่มีระยะเวลานานเป็นพิเศษ
#slow_query_log = 1
#slow_query_log_file = /var/log/mysql/mysql-slow.log
#long_query_time = 2
#log-query-not-use-indexes
#
# ข้อมูลต่อไปนี้สามารถใช้เป็นบันทึกสำรองซ้ำหรือทำซ้ำได้ง่าย
# หมายเหตุ: หากคุณกำลังตั้งค่า replication slave โปรดดูที่ README.Debian about
# การตั้งค่าอื่นๆ ที่คุณอาจต้องเปลี่ยน
#server-id = 1
#log_bin = /var/log/mysql/mysql-bin.log
expier_logs_days = 10
max_binlog_size = 100M
#binlog_do_db = include_database_name
#binlog_ignore_db = include_database_name
#
# * อินโนดีบี
#
# InnoDB เปิดใช้งานโดยค่าเริ่มต้นด้วยไฟล์ข้อมูล 10MB ใน /var/lib/mysql/
# อ่านคู่มือสำหรับตัวเลือกเพิ่มเติมที่เกี่ยวข้องกับ InnoDB มีมากมาย!
#
# * คุณลักษณะด้านความปลอดภัย
#
# อ่านคู่มือด้วย ถ้าคุณต้องการ chroot!
# chroot = /var/lib/mysql/
#
# สำหรับการสร้างใบรับรอง SSL ฉันขอแนะนำ OpenSSL GUI "tinyca"
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem

/etc/mysql/mysql.conf.d/mysqld_safe_syslog.cnf

[mysqld_safe]
syslog
dominix avatar
gf flag
คุณควรมีการตั้งค่าตัวแปรบางอย่างใน /etc/my.cnf.d/server.cnf ที่เกี่ยวข้องกับหน่วยความจำและ/หรือ innodb ที่ไม่พอดีกับขนาดฐานข้อมูลหรือหน่วยความจำของคุณ คุณสามารถแสดงตัวแปรเหล่านี้และขนาดฐานข้อมูลของคุณให้เราดูได้ไหม
bumbleshoot avatar
in flag
@dominix ไม่มีไดเรกทอรีหรือไฟล์ /etc/my.cnf.d/server.cnf สิ่งที่ใกล้เคียงที่สุดที่ฉันสามารถหาได้คือ /etc/mysql/mysql.conf.d/mysqld.cnf เซิร์ฟเวอร์กำลังเรียกใช้ Ubuntu 18.04 หากช่วยได้
us flag
คุณสามารถเพิ่มส่วนย่อยของไฟล์บันทึกในคำถามได้หรือไม่ ไฟล์บันทึกนี้ดูเหมือนว่าเซิร์ฟเวอร์ MySQL เพิ่งเริ่มทำงาน ซึ่งไม่ตรงกับคำอธิบายของคุณ
bumbleshoot avatar
in flag
@dominix ขนาดฐานข้อมูลคือ 43.5 MB
bumbleshoot avatar
in flag
@TeroKilkanen ตามประวัติการใช้หน่วยความจำ ดูเหมือนว่าฐานข้อมูลจะล่มประมาณ 02:40 น. อย่างไรก็ตาม ไฟล์บันทึกของวันนั้นไม่มีรายการก่อนเวลา 10:47 น. นี่เป็นเวลาที่ใกล้เคียงที่สุดที่ฉันสามารถไปถึงเวลาที่ฐานข้อมูลขัดข้อง ฉันจะขยายคำถามของฉันเพื่อรวมรายการทั้งหมดตั้งแต่เริ่มต้นไฟล์บันทึก
us flag
คุณตรวจสอบไฟล์บันทึกที่หมุนหรือไม่
bumbleshoot avatar
in flag
@TeroKilkanen ฉันได้อัปเดตข้อความในคำถามของฉันแล้ว หวังว่าตอนนี้จะชัดเจนขึ้น
bumbleshoot avatar
in flag
@TeroKilkanen คุณหมายถึงไฟล์บันทึกที่บีบอัดใน /var/log/mysql? ใช่ ฉันคลายและอ่านมัน
us flag
`/var/log/kern.log` มีอะไรในช่วงเวลาที่เกิดความผิดพลาดหรือไม่
bumbleshoot avatar
in flag
ให้เรา [ดำเนินการสนทนาต่อในการแชท](https://chat.stackexchange.com/rooms/132261/discussion-between-bumbleshoot-and-tero-kilkanen)
Score:2
ธง us

หลังจากตรวจสอบบันทึกเคอร์เนลในแชทแล้ว สาเหตุของความผิดพลาดของ MySQL คือหน่วยความจำไม่เพียงพอ

6 ธันวาคม 02:47:13 เคอร์เนล: [341799.228400] หน่วยความจำไม่เพียงพอ: ฆ่ากระบวนการ 23566 (mysqld) ได้คะแนน 197 หรือสังเวยลูก
6 ธันวาคม 02:47:13 เคอร์เนล: [341799.229866] กระบวนการที่ถูกฆ่า 23566 (mysqld) total-vm:1168576kB, anon-rss:198536kB, file-rss:0kB, shmem-rss:0kB

ในช่วงเวลานั้นมีกระบวนการ Apache2 จำนวนมากที่ใช้งานอยู่ ซึ่งหมายความว่าการรับส่งข้อมูลที่เพิ่มขึ้นทำให้การใช้หน่วยความจำเพิ่มขึ้น เป็นผลให้เคอร์เนลตัดสินใจฆ่า MySQL เพื่อเพิ่มหน่วยความจำ

หนึ่งสามารถวิ่ง mysqltuner เพื่อวิเคราะห์การกำหนดค่า MySQL มันให้คำแนะนำซึ่งสามารถช่วยลดการใช้หน่วยความจำ MySQL

อย่างไรก็ตาม ปริมาณการใช้งานที่เพิ่มขึ้นยังคงทำให้เกิดปัญหาเหมือนเดิม ดังนั้นวิธีแก้ปัญหาที่ยั่งยืนกว่าคือการเพิ่มหน่วยความจำที่มีอยู่สำหรับหยด

bumbleshoot avatar
in flag
ขอขอบคุณอีกครั้งสำหรับความช่วยเหลือของคุณ!
bumbleshoot avatar
in flag
ฉันเพิ่งตรวจสอบ Google Analytics สำหรับเว็บไซต์นี้ และมีการดูหน้าเว็บเพียงครั้งเดียวในวันที่ 6 ธันวาคม (เว็บไซต์หยุดทำงานในวันที่ 6 ธันวาคม ระหว่างเวลา 02:40-2:50 น.) ดูเหมือนจะไม่ตรงกับสิ่งที่คุณเห็นในบันทึกเคอร์เนล มีความคิดว่าทำไม?
us flag
Google Analytics แสดงเฉพาะการเข้าชมจากเว็บเบราว์เซอร์ที่รันโค้ด Google Analytics JS นอกจากนี้ อินเทอร์เน็ตมีปริมาณการใช้บอทจำนวนมาก คุณสามารถดูทราฟฟิกนั้นใน access.log ของเว็บเซิร์ฟเวอร์ของคุณ
bumbleshoot avatar
in flag
โอเค เข้าท่า ต้องมีการรับส่งข้อมูลบอทจำนวนมากพร้อมกันเพื่อครอบงำเซิร์ฟเวอร์ที่ใช้หน่วยความจำเพียง 73% อย่างสม่ำเสมอหรือไม่ คุณคิดว่าเป็นการโจมตี DDoS หรือไม่? มีวิธีบล็อกทราฟฟิกบอทนี้ในอนาคตหรือไม่?
Score:1
ธง ua

แรม 1GB คือ เล็กมาก วันนี้. เซิฟเวอร์ อาจ อยู่รอดถ้าคุณตั้งค่า innodb_buffer_pool_size=50M. คำแนะนำสำหรับ RAM บางเปอร์เซ็นต์ใช้ไม่ได้กับขนาด RAM ที่เล็กเช่นนี้

มีความเสี่ยงที่ 50M จะน้อยเกินไป กรุณาระบุของคุณ my.cnf เพื่อให้เราสามารถมองหาการตั้งค่าอื่นๆ เพื่อย่อขนาดได้ บางคนน่าจะ:

max_connections = 10
key_buffer_size = 10M
temp_table_size=10M
max_heap_table_size = 10M
table_open_cache = 100

query_cache_size = 0
max_allowed_packet = 8M
key_buffer_size = 10M
max_connections = 10

ใช่ MySQL/MariaDB จะทำงานในเครื่องขนาดเล็ก แต่จำเป็นต้องมีการปรับแต่ง

หาก Apache ทำงานบนเซิร์ฟเวอร์เดียวกัน ให้ลด MaxRequestWorkers เป็น 10 และตรวจสอบการกำหนดค่าของสิ่งอื่นใดที่ทำงานในเซิร์ฟเวอร์ [เสมือน] เดียวกัน

bumbleshoot avatar
in flag
ขอบคุณสำหรับการตอบกลับของคุณ.`my.cnf` มีเฉพาะ `!includedir /etc/mysql/conf.d/` และ `!includedir /etc/mysql/mysql.conf.d/` `/etc/mysql/conf.d/` ประกอบด้วย `mysql.cnf` และ `mysqldump.cnf` `/etc/mysql/mysql.conf.d/` ประกอบด้วย `mysqld.cnf` และ `mysqld_safe_syslog.cnf` คุณจำเป็นต้องดูเนื้อหาของไฟล์เหล่านี้หรือไม่?
ua flag
@bumbleshoot - ใช่ โปรดแสดงให้พวกเขาเห็น
bumbleshoot avatar
in flag
ตกลง ฉันเพิ่มพวกเขาในคำถามเดิมของฉันแล้ว
ua flag
@bumbleshoot - ฉันเพิ่มการตั้งค่าเพิ่มเติมเพื่อเปลี่ยน
bumbleshoot avatar
in flag
ขอบคุณมาก! ฉันจะลองตั้งค่าเหล่านี้ดู

โพสต์คำตอบ

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