RAM ที่เพิ่มขึ้นประสิทธิภาพที่แย่ลง


9

ติดตั้ง:

  • Windows Server 2008 R2
  • SQL Server 2008 R2 SP1
  • RAM 240GB
  • TempDB เป็นไฟล์ข้อมูลขนาด 8x16GB โดยไม่มีการเติบโตอัตโนมัติ (รวม 128GB)
  • เซิร์ฟเวอร์ทางกายภาพ / เซิร์ฟเวอร์แบบเอกเทศ

เซิร์ฟเวอร์นี้ใช้สำหรับการประมวลผล ETL เราเพิ่งติดตั้ง RAM เพิ่มเติมในเซิร์ฟเวอร์นี้รวม 240GB RAM บริการ SQL Server เป็นสิ่งเดียวที่ทำงานจริง

หน่วยความจำแสดงผลได้ดีใน BIOS, OpenManage และ Windows

ถ้าฉันกำหนดค่า SQL Server ให้ใช้หน่วยความจำต่ำสุด / สูงสุด 70 / 100GB เราก็ไม่มีปัญหา อย่างไรก็ตามเมื่อฉันเพิ่มเป็น 120/150GB ฉันได้รับข้อผิดพลาดต่อไปนี้เมื่อฉันเรียกใช้กระบวนการ ETL ของเรา:

ไม่สามารถจัดสรรพื้นที่สำหรับวัตถุ '<ชั่วคราวระบบวัตถุ: 422234507706368>' ในฐานข้อมูล 'tempdb' เนื่องจากกลุ่มไฟล์ 'หลัก' เต็ม สร้างพื้นที่ดิสก์โดยการลบไฟล์ที่ไม่ต้องการวางวัตถุในกลุ่มไฟล์เพิ่มไฟล์เพิ่มเติมไปยังกลุ่มไฟล์หรือการตั้งค่าอัตโนมัติในไฟล์ที่มีอยู่ในกลุ่มไฟล์ (ข่าวสารเกี่ยวกับ 1105 สถานะ 2 ไม่ทราบขั้นตอนสาย 1)

เราไม่เคยพบปัญหานี้มาก่อนที่จะเปลี่ยนการกำหนดค่าหน่วยความจำ หลังจากกำหนดค่ากลับไปเป็น 70 / 100GB ดั้งเดิมเราไม่ได้รับข้อผิดพลาดนี้

สิ่งที่ฉันได้ลอง:

  1. ตั้งค่าไฟล์ข้อมูล TempDB ให้เติบโตอัตโนมัติ สิ่งนี้จะส่งผลให้ไฟล์เติบโตอัตโนมัติจนกว่าจะถึงความจุของดิสก์และล้มเหลว
  2. เพิ่มไฟล์ข้อมูล TempDB เพิ่มเติม ข้อผิดพลาดเดียวกับที่แสดง
  3. เพิ่มขนาด TempDB เป็น 8x32GB (รวม 256GB)

ฉันสูญเสียสิ่งที่อาจทำให้เกิดปัญหานี้


2
หน่วยความจำของคุณสมดุลข้ามโหน NUMA หรือไม่ โปรเซสเซอร์ของคุณเป็นอย่างไร? บันทึก SQL Server แสดงจำนวน CPU ที่ใช้งานในระหว่างการเริ่มต้นหรือไม่
แอรอนเบอร์ทรานด์ด์

1
คุณใช้อะไรในกระบวนการ ETL SSIS หรือเครื่องมือที่คล้ายกัน? หากเป็นเครื่องมือที่อยู่นอก SQL Server คุณกำลังรันบนเซิร์ฟเวอร์เดียวกันกับ SQL Server ของคุณหรือไม่?
Mike Fal

1
นั่นเป็นจุดที่ดี @ ไมค์หากกระบวนการ ETL ไม่สามารถดึงหน่วยความจำเพียงพอที่จะทำสิ่งนี้เพราะ SQL Server ใช้งานมากเกินไปก็อาจต้องผลักดันให้ทำงานกับ tempdb
แอรอนเบอร์ทรานด์ด์

1
นี่เป็นจุดเริ่มต้นที่ดีในการตรวจสอบการใช้งาน tempdb: msdn.microsoft.com/en-us/library/ms176029(v=SQL.105).aspx สิ่งนี้จะทำให้คุณเข้าใจว่าเกิดอะไรขึ้น
Thomas Stringer

2
คุณได้ทำการวิเคราะห์สิ่งที่ทำงานจริง ๆ แล้วเมื่อคุณกำลังขยาย TempDB หรือไม่? sp_who2 ง่าย ๆ / sp_whoisactive ฟังดูเหมือนว่าคุณจะมีธุรกรรมที่ใช้เวลานานซึ่งสามารถจัดการได้ดีกว่า แต่ยากที่จะบอก โดยส่วนตัวแล้วฉันจะไม่ติดกับการเปลี่ยนแปลงหน่วยความจำ แต่ดูที่รหัสก่อนและดูว่าทำงานอย่างถูกต้องหรือไม่
Mike Fal

คำตอบ:


3

ขอบคุณทุกคนสำหรับความช่วยเหลือของคุณ

หลังจากที่มีแผนการดำเนินการบางอย่างปรากฎว่ามี JOIN ที่กำลังดำเนินการแตกต่างกันไปตามจำนวน RAM ที่มีอยู่ ด้วย RAM ที่น้อยกว่ามันจะประเมินด้วยแฮช เมื่อใช้ RAM มากกว่าจะใช้ชุด Merge Joins

โดยพื้นฐานแล้วมันลงมาที่ T-SQL ที่เขียนไม่ดีซึ่งตอนนี้ฉันกำลังปรับโครงสร้าง


4
นั่นค่อนข้างเคาน์เตอร์ใช้งานง่ายเพราะการเข้าร่วมแฮต้องใช้สิทธิ์หน่วยความจำในขณะที่ผสานไม่ มีการดำเนินการเรียงลำดับเพิ่มเติมเพื่อสนับสนุนการเข้าร่วมผสานหรือไม่
Martin Smith

1

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

SELECT 
  parent_node_id, 
  [status],
  AVG(current_tasks_count) AS avg_tasks_count, 
  AVG(load_factor) AS avg_load_factor,
  scheduler_count = COUNT(*)
FROM sys.dm_os_schedulers
GROUP BY parent_node_id, [status];

SELECT 
  memory_node_id, 
  name, 
  SUM(single_pages_kb + multi_pages_kb) AS memory_kb
FROM sys.dm_os_memory_clerks
GROUP BY memory_node_id, name;

(ใน SQL Server 2012 ตัวสุดท้ายSUMควรเป็นSUM(pages_kb)เพราะไม่มีตัวแยกแบบเดี่ยวและหลายหน้าแยกกัน)

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