SQL Server 2005: มีหน่วยความจำระบบไม่เพียงพอที่จะเรียกใช้แบบสอบถามนี้


13

หนึ่งในเซิร์ฟเวอร์ SQL ของเราซึ่งทำงานอย่างเสถียรมานานพอสมควร (หลายปี) เพิ่งเกิดข้อผิดพลาดเกี่ยวกับหน่วยความจำไม่เพียงพอ จากบันทึกเหตุการณ์ของแอปพลิเคชันเราจะเห็น:

รหัสเหตุการณ์: 701

คำอธิบาย: มีหน่วยความจำระบบไม่เพียงพอที่จะเรียกใช้แบบสอบถามนี้

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

ดังนั้นนี่คือรายละเอียดเพิ่มเติมที่จะช่วยในการแก้ไขปัญหา:

  • หน่วยความจำเซิร์ฟเวอร์ขั้นต่ำของเราตั้งเป็น 0
  • หน่วยความจำเซิร์ฟเวอร์สูงสุดของเราตั้งไว้ที่ 2000
  • หน่วยความจำกายภาพทั้งหมดคือ 3,325.85 MB (จาก sysinfo)
  • หน่วยความจำเสมือนทั้งหมดคือ 7.10 GB (จาก sysinfo)
  • เราไม่ได้ใช้ AWE เพื่อจัดสรรหน่วยความจำ แต่ตอนนี้เรามาดูว่ามันสร้างความแตกต่างหรือไม่
  • ข้อผิดพลาดนี้เกิดจากงานที่สำรองข้อมูลบันทึกธุรกรรมโดยไม่เรียกใช้แบบสอบถาม
  • เรามีเซิร์ฟเวอร์ที่เชื่อมโยงมากมาย ประเภทของ RDBMS ที่อยู่อีกด้านคือระบบ SQL Server (2005 และ 2000), Oracle 10g และ OSI PI
  • ณ จุดนี้ไม่ต่อเนื่อง ดูเหมือนว่าเราจะไม่สามารถมีความสัมพันธ์ได้ตลอดเวลาหรือเหตุการณ์กับข้อผิดพลาด
  • แน่นอนว่าการรีบู๊ตดูเหมือนจะทำให้มันหายไประยะหนึ่งซึ่งเหมาะสมเนื่องจากลักษณะของข้อความแสดงข้อผิดพลาด
  • เซิร์ฟเวอร์นี้เป็นเซิร์ฟเวอร์แอปพลิเคชัน (บริการ Windows สองสาม) และเว็บเซิร์ฟเวอร์รวมถึงเซิร์ฟเวอร์ฐานข้อมูล

แก้ไข:

เราอยู่ใน SP3 โพสต์ส่วนใหญ่ที่เราพบก่อนหน้า SP1 ซึ่งไม่ได้ใช้กับเรา

SELECT  SERVERPROPERTY('productversion'), SERVERPROPERTY ('productlevel'), SERVERPROPERTY ('edition')

ผลตอบแทน

9.00.4035.00 SP3 Standard Edition


คุณสามารถตรวจสอบบันทึกข้อผิดพลาดของเซิร์ฟเวอร์ SQL ได้เนื่องจากอาจมีรายละเอียดเพิ่มเติมเกี่ยวกับข้อผิดพลาดนี้
John Sansom

คำตอบ:


4

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


7

ข้อความแสดงข้อผิดพลาด"มีหน่วยความจำระบบไม่เพียงพอที่จะเรียกใช้แบบสอบถามนี้" อ้างถึง Virtual Address Space (VAS) ที่ไม่พร้อมใช้งานและไม่ใช่หน่วยความจำในแง่ปกติเช่นภายในพื้นที่กระบวนการเซิร์ฟเวอร์ SQL

ระบุว่าคุณใช้งานกับ 3GB บนเซิร์ฟเวอร์นี้เท่านั้นและ SQL Server ได้รับการมอบหมายสูงสุด 2GB หมายความว่าระบบปฏิบัติการและที่สำคัญกว่านั้นคือสิ่งอื่นในกล่องมีน้อยกว่า 1GB ในการเล่น นั่นไม่ใช่ความทรงจำทั้งหมด

หากปัญหานี้เป็นผลมาจากการรั่วไหลของหน่วยความจำก็เป็น VAS นอกพื้นที่กระบวนการ SQL Server (memToLeave) ที่มีการใช้

ฉันขอแนะนำให้ใช้พารามิเตอร์ -g startup เพื่อกำหนดหน่วยความจำเพิ่มเติมให้กับส่วน memToLeave

ดูบทความต่อไปนี้สำหรับข้อมูลเพิ่มเติม:

http://www.johnsansom.com/sql-server-memory-configuration-determining-memtoleave-settings/

คุณอาจต้องการลดการตั้งค่าหน่วยความจำสูงสุดของ SQL Server แต่ฉันจะทำเช่นนี้เป็นทางเลือกสุดท้าย


บทความที่ดี ขอบคุณสำหรับการเขียนมันเช่นกัน! เรามีการขนถ่าย AppDomains หลายรายการในบันทึก SQL ของเรา เรามีขั้นตอนการจัดเก็บ 2 CLR เท่านั้นและโดยพื้นฐานแล้วพวกเขาเพียงแค่รับและนำข้อมูลไป / จากบริการบนเว็บ ดูเหมือนว่าขั้นตอนการจัดเก็บ 2 CLR เหล่านี้น่าจะใช้ VAS มากเกินไปนอกกรอบ
Aaron Daniels

ไม่เป็นไร อย่างที่คุณอาจทราบแล้วว่าการจัดสรรเริ่มต้นสำหรับ memToLeave นั้นมีขนาดเพียง 256MB เท่านั้น นี่เป็น sandbox ขนาดเล็กสำหรับ AppDomains ของคุณรหัส CLR / ที่มีการจัดการแบบสอบถามเซิร์ฟเวอร์ที่เชื่อมโยง SSIS ฯลฯ โดยเฉพาะถ้าคุณใช้หน่วยความจำที่มีอยู่ทั้งหมดบนเซิร์ฟเวอร์ ฉันขอแนะนำให้เพิ่มเป็นสองเท่าเป็น 512MB โดยใช้พารามิเตอร์เริ่มต้น -g
John Sansom

1

สิ่งนี้อาจเกี่ยวข้องกับการรั่วไหลของหน่วยความจำของไดรเวอร์เซิร์ฟเวอร์ที่เชื่อมโยงตามฟอรัมนี้ :

ต่อไปนี้เป็นสิ่งที่ Microsoft บอกกับเรา

เห็นได้ชัดว่าการประมวลผลข้อมูลโดยใช้เซิร์ฟเวอร์ที่เชื่อมโยงโดยเฉพาะไดรเวอร์ Fox pro ทำให้เกิดการรั่วไหลของหน่วยความจำซึ่งสร้างขึ้นในช่วงเวลา


0

เซิร์ฟเวอร์นี้เป็นเซิร์ฟเวอร์แอปพลิเคชัน (บริการ Windows สองสาม) และเว็บเซิร์ฟเวอร์รวมถึงเซิร์ฟเวอร์ฐานข้อมูล

ฉันจะตั้งค่าหน่วยความจำขั้นต่ำของคุณ - เป็นไปได้ค่อนข้างที่กระบวนการอื่น ๆ เหล่านี้จะ "ขโมย" หน่วยความจำจาก SQL

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


0

การอ้างอิงที่นำมาจากบล็อกนี้!

มีทางเลือกอื่นในการแก้ปัญหานี้

ก่อนอื่นให้ตรวจสอบการตั้งค่า SQL Server ของคุณสำหรับ“ หน่วยความจำเซิร์ฟเวอร์ต่ำสุด” และ“ หน่วยความจำเซิร์ฟเวอร์สูงสุด” หากคุณพบว่าค่าทั้งสองแตกต่างกันเล็กน้อยให้เพิ่ม“ หน่วยความจำเซิร์ฟเวอร์สูงสุดของคุณ”

ประการที่สองพบคำค้นหาที่ใช้เวลานานซึ่งมีข้อมูลการใช้หน่วยความจำและถ้าแบบสอบถามนี้ในสถานะว่างให้ตรวจสอบและฆ่ากระบวนการนี้ การเพิ่มประสิทธิภาพของฐานข้อมูลเป็นสิ่งสำคัญสำหรับการใช้หน่วยความจำ

ประการที่สามพบว่าการใช้ดัชนีใช้สำหรับการสืบค้นที่ใช้เวลานานเพราะไม่มีการทำดัชนีที่เหมาะสมระบบของคุณเพิ่ม DISK I / O และส่งผลโดยตรงต่อหน่วยความจำของคุณ

ประการที่สี่ตรวจสอบขนาดของไฟล์เพจหน่วยความจำเสมือนและเพิ่มขนาดของไฟล์นี้

ประการที่ห้าตรวจสอบขนาดของ "หน่วยความจำขั้นต่ำต่อการค้นหา" ที่จริงแล้วเป็นค่าเริ่มต้น 1024 KB แต่ในสถานการณ์ที่หายากคุณสามารถลดขนาดของพารามิเตอร์นี้ จริงๆแล้วนี่ไม่แนะนำให้เลือก แต่คุณสามารถลองใช้ได้

หกลองดำเนินการคำสั่ง DBCC นี้และอีกครั้งนี้ไม่แนะนำให้เลือกเพราะมันอาจส่งผลกระทบต่อประสิทธิภาพโดยรวมของเซิร์ฟเวอร์ แต่คุณสามารถลองสิ่งนี้

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