ทำไม MySQL ถึงบอกว่าฉันไม่มีความจำ


9

ฉันพยายามรันINSERT...SELECTMySQL ที่มีขนาดค่อนข้างใหญ่ด้วย JDBC และฉันได้รับข้อยกเว้นต่อไปนี้:

Exception in thread "main" java.sql.SQLException: Out of memory (Needed 1073741824 bytes)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)

เนื่องจากฉันไม่ได้ส่งคืนออบเจกต์ ResultSet ฉันจึงคิดว่าพื้นที่ของฮีป Java ไม่น่าจะมีปัญหา อย่างไรก็ตามฉันพยายามเพิ่มมันต่อไปและมันก็ไม่ได้ดี จากนั้นฉันพยายามเรียกใช้คำสั่งใน MySQL Workbench และฉันได้สิ่งเดียวกัน:

Error Code 5: Out of memory (Needed 1073741816 bytes)

ฉันควรมี RAM มากมายเพื่อให้การดำเนินการเหล่านี้ (เพียงพอที่จะพอดีกับตารางทั้งหมดที่ฉันเลือกจาก) แต่ฉันเดาว่ามีการตั้งค่าต่าง ๆ ที่ฉันจำเป็นต้องปรับแต่งเพื่อใช้ประโยชน์จากหน่วยความจำทั้งหมดของฉัน ฉันใช้หน่วยความจำสูง Amazon EC2 หน่วยความจำเสริมใหญ่เป็นสองเท่าด้วย Windows Server 2008 AMI ฉันได้ลองเล่นไฟล์ my.ini เพื่อใช้การตั้งค่าที่ดีขึ้น แต่สำหรับสิ่งที่ฉันรู้ฉันอาจทำสิ่งต่าง ๆ แย่ลง นี่คือดัมพ์ของไฟล์นั้น:

[client]
port=3306
[mysql]
default-character-set=latin1
[mysqld]
port=3306
basedir="C:/Program Files/MySQL/MySQL Server 5.5/"
datadir="C:/ProgramData/MySQL/MySQL Server 5.5/Data/"
character-set-server=latin1
default-storage-engine=INNODB
sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
max_connections=100
query_cache_size=1024M
table_cache=256
tmp_table_size=25G
thread_cache_size=8
myisam_max_sort_file_size=100G
myisam_repair_threads = 2
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_additional_mem_pool_size=26M
innodb_flush_log_at_trx_commit=2
innodb_log_buffer_size=13M
innodb_buffer_pool_size=23G
innodb_log_file_size=622M
innodb_thread_concurrency=18
innodb_file_per_table=TRUE
join_buffer_size=4G
max_heap_table_size = 10G

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

หากนี่ไม่ใช่เรื่องของการเปลี่ยนการตั้งค่าเหล่านั้นปัญหาคืออะไร ขอบคุณสำหรับความช่วยเหลือใด ๆ ที่คุณสามารถนำเสนอสำหรับวิธีการกำหนดค่าทุกอย่างดีขึ้น


ทุกคนที่ใช้แคชข้อความค้นหา 1g ไม่มีเงื่อนงำสิ่งที่พวกเขาทำ

@winmutt คุณอาจจะถูกต้องมาก แต่ความคิดเห็นของคุณไม่ได้ช่วยใครเลยหากไม่มีคำอธิบายเพิ่มเติม คุณช่วยเราด้วยการให้เหตุผลในความรู้สึกของคุณได้ไหม?
Michael McGowan

เครื่องมือที่ใช้งานง่ายในการเริ่มต้นคือtools.percona.com/wizard
KCD

คำตอบ:


9

รับนี่คือการติดตั้ง Windows, @DTest ยังคงให้ทิศทางที่เหมาะสมเริ่มต้น

ใช้สูตรต่อไปนี้:

คนส่วนใหญ่ใช้สิ่งนี้:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + (read_buffer_size + sort_buffer_size) X max_connections

ฉันชอบสิ่งนี้:

Maximum MySQL Memory Usage = innodb_buffer_pool_size + key_buffer_size + ((read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size) X max_connections)

ตัวแปรเหล่านี้เป็นตัวแปรที่คุณต้องปรับจนกว่าสูตรจะให้ผล 80% ของ RAM ที่ติดตั้งหรือน้อยกว่า

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections

4

ฉันจะลองลดขนาดบัฟเฟอร์ของคุณ ทำให้พวกเขามีขนาดใหญ่เท่าที่คุณมีพวกเขากำลังจะทำให้เกิดปัญหา คุณมีหน่วยความจำเท่าใดในการเรียกใช้ค่าเหล่านี้:

query_cache_size=1024M
myisam_max_sort_file_size=100G
myisam_sort_buffer_size=10G
key_buffer_size=5000M
bulk_insert_buffer_size = 4000M
read_buffer_size=8000M
read_rnd_buffer_size=8000M
sort_buffer_size=1G
innodb_buffer_pool_size=23G

ขนาดบัฟเฟอร์บางส่วนถูกจัดสรรต่อเธรดเช่น myisam_sort_buffer_size 10G จัดสรร 10G สำหรับแต่ละเธรด

ฉันจะลดค่าเหล่านั้นลงอย่างมากก่อนจากนั้นตรวจสอบว่าคุณต้องจัดสรร RAM จำนวนเท่าใด (ถ้ามี)


4

วิธีที่รวดเร็วในการกำหนดจำนวนหน่วยความจำ MySQL ที่คิดว่าสามารถจัดสรรได้มีดังนี้:

wget mysqltuner.pl

perl mysqltuner.pl

เมื่อคุณเรียกใช้สคริปต์นี้มันจะบอกคุณว่าเปอร์เซ็นต์ของ RAM MySQL ที่ติดตั้งคิดว่าสามารถจัดสรรได้อย่างปลอดภัย หากคำตอบที่ได้รับมีมากกว่า 100% คุณต้องลดขนาดบัฟเฟอร์ของคุณลงอย่างแน่นอน หลักสำคัญที่จะมุ่งเน้นคือ:

sort_buffer_size
read_buffer_size
read_rnd_buffer_size
join_buffer_size
max_connections
key_buffer_size (ไม่มีผลบังคับใช้จริง ๆ ผ่าน 4G)

@DTest กำหนดทิศทางให้กับคุณแล้วในคำตอบของเขาดังนั้น +1 สำหรับผู้ตอบคำถามของเขา สคริปต์ perl จะบอกคุณว่าเกิดอะไรขึ้นถ้าคุณไม่ได้ตั้งค่าไว้หรือถ้าคุณเปลี่ยนค่าใด ๆ นี่คือตัวอย่าง:

ลูกค้าของฉันมี
read_buffer_size = 128K
read_rnd_buffer_size = 256K
sort_buffer_size = 2M
join_buffer_size = 128K
max_connections = 1050

นี่คือผลลัพธ์จาก mysqltuner.pl:

1.2.0 MySQLTuner - เมเจอร์เฮย์เดน
รายงานข้อผิดพลาดการร้องขอคุณสมบัติและการดาวน์โหลดที่http://mysqltuner.com/
Run ด้วย '--help' สำหรับตัวเลือกเพิ่มเติมและผลผลิตกรอง
กรุณากรอกข้อมูล MySQL การเข้าสู่ระบบการบริหารของคุณ: lwdba
กรุณากรอก MySQL ดูแลระบบของคุณ รหัสผ่าน:

-------- สถิติทั่วไป ---------------------------------------- ----------
[-] ข้ามการตรวจสอบเวอร์ชั่นสำหรับสคริปต์ MySQLTuner
[OK] ปัจจุบันรองรับเวอร์ชัน MySQL 5.0.51a-community-log
[!!] เปลี่ยนเป็นระบบปฏิบัติการ 64 บิตปัจจุบัน MySQL ไม่สามารถใช้งานได้ RAM ทั้งหมดของคุณ

-------- สถิติของเครื่องมือการจัดเก็บ --------------------------------------- ----
[-] สถานะ: + เก็บถาวร -BDB + สหพันธ์ + InnoDB -ISAM -NDBCluster
[-] ข้อมูลในตาราง MyISAM: 319M (ตาราง: 108)
[-] ข้อมูลในตาราง InnoDB: 2M (ตาราง: 5)
[!!] ตารางแยกส่วนทั้งหมด: 22

-------- การวัดประสิทธิภาพ ---------------------------------------- ---------
[-] สูงถึง: 52d 23h 15m 57s (72M q [15.875 qps], 241K conn, TX: 2B, RX: 1B)
[-] อ่าน / เขียน: 59% / 41%
[-] บัฟเฟอร์ทั้งหมด: 34.0M ทั่วโลก + 2.7M ต่อเธรด (1050 เธรดสูงสุด)
[!!] การจัดสรร> 2GB RAM บนระบบ 32 บิตสามารถทำให้เกิดความไม่เสถียรของระบบ
[!!] การใช้หน่วยความจำสูงสุดที่เป็นไปได้: 2.8G (72% ของ RAM ที่ติดตั้ง)
[ตกลง] แบบสอบถามที่ช้า: 0% (54 / 72M)
[ตกลง] การใช้งานการเชื่อมต่อที่ใช้ได้สูงสุด: 6% (65/1050)
[ตกลง] ขนาดบัฟเฟอร์หลัก / ดัชนี MyISAM ทั้งหมด: 8.0M / 82.1M
[OK] อัตราการกดบัฟเฟอร์ของคีย์: 100.0% (แคช 4B / การอ่าน 1M)
[!!] แคชข้อความค้นหาถูกปิดใช้งาน
[ตกลง] เรียงลำดับที่ต้องการตารางชั่วคราว: 0% (0 ประเภทชั่วคราว / 948K ทุกประเภท)
[ตกลง] ตารางชั่วคราวที่สร้างขึ้นบนดิสก์: 3% (11K บนดิสก์ / ทั้งหมด 380K)
[!!] แคชเธรดถูกปิดใช้งาน
[!!] อัตราการเข้าชมแคชตาราง: 0% (เปิด 64 เปิด / 32K)
[OK] ไฟล์เปิด ข้อ จำกัด ที่ใช้: 2% (125 / 5K)
[ตกลง] ล็อคตารางที่ได้รับทันที: 99% (ล็อค 30M ทันที / 30M)
[ตกลง] ขนาดข้อมูล InnoDB / พูลบัฟเฟอร์: 2.7M / 8.0M

-------- ข้อเสนอแนะ ----------------------------------------- ------------
คำแนะนำทั่วไป:
Run ตาราง OPTIMIZE ตารางจัดระเบียบเพื่อประสิทธิภาพที่ดี
เปิดใช้งานบันทึกแบบสอบถามช้าที่จะแก้ไขปัญหาที่ไม่ดี queries
ชุด thread_cache_size 4 เป็นเริ่มต้นมูลค่า
เพิ่มขึ้น table_cache ค่อยๆเพื่อหลีกเลี่ยงข้อ จำกัด ไฟล์อธิบาย
ตัวแปร เพื่อปรับ:
query_cache_size (> = 8M)
thread_cache_size (เริ่มต้นที่ 4)
table_cache (> 64)

โปรดแจ้งให้ทราบภายใต้ตัวชี้วัดประสิทธิภาพ

[-] บัฟเฟอร์ทั้งหมด: 34.0M ทั่วโลก + 2.7M ต่อเธรด (1050 เธรดสูงสุด)

MySQL สามารถจัดสรร RAM ที่ติดตั้งได้มากถึง 72% ตามการตั้งค่าใน /etc/my.cnf

34M ขึ้นอยู่กับ innodb_buffer_pool_size และ key_buffer_size รวมกัน

2.7M ต่อเธรดนั้นขึ้นอยู่กับ read_buffer_size + read_rnd_buffer_size + sort_buffer_size + join_buffer_size

ทวีคูณของ 2.7M ขึ้นอยู่กับ max_connections

ดังนั้นคุณจะต้องตรวจสอบพารามิเตอร์เหล่านี้จนกว่ารายงานการวัดประสิทธิภาพบอกว่าคุณมี RAM ต่ำกว่า 100% (ดีกว่าต่ำกว่า 80%)


ฉันไม่แน่ใจว่าฉันสามารถใช้เครื่องมือของคุณ; ฉันใช้ Windows เอกสารดังกล่าวระบุว่า Windows ไม่รองรับ แต่ฉันพยายามต่อไป เมื่อฉันลองใช้มันแสดงว่าไม่สามารถหา mysqladmin ใน $ PATH ของฉันได้ แต่ไดเรกทอรี bin ของ MySQL นั้นอยู่ใน $ PATH ของฉัน
Michael McGowan

ขออภัยฉันไม่ได้สังเกต Data datir ของ Windows ฉันจะเพิ่มคำตอบอื่น
RolandoMySQLDBA

1

คุณไม่ได้บอกว่าคุณมี RAM เท่าใด ฉันคิดว่าอย่างน้อย 32GB

innodb_buffer_pool_size - 23G

ดีสำหรับแรมมาก

query_cache_size = 1G

ใหญ่เกินไป มันไม่มีประสิทธิภาพเมื่อมันมีขนาดใหญ่ แนะนำไม่เกิน 50M

key-buffer_size = 5G

อาจมีขีด จำกัด ระดับสูงของ 4G (ยัง) ใน Windows มีขีด จำกัด ระดับ 4G 5G ของคุณอาจกลายเป็น 1G อย่างไรก็ตามถ้าโต๊ะทั้งหมดของคุณคือ InnoDB ทำไมต้องเสีย ram ตั้งค่าเป็น 50M

เนื่องจากเกิดข้อผิดพลาดได้ว่า 1G, sort_buffer_sizeมันมีกลิ่นเหมือน 32M อาจจะสมเหตุสมผล

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.