บริษัท ของฉันใช้แอปพลิเคชันที่มีปัญหาด้านประสิทธิภาพที่สำคัญ มีปัญหาหลายอย่างเกี่ยวกับฐานข้อมูลของตัวเองซึ่งฉันกำลังอยู่ในขั้นตอนการทำงาน แต่มีปัญหามากมายที่เกี่ยวข้องกับการใช้งานอย่างแท้จริง
ในการตรวจสอบของฉันฉันพบว่ามีล้านแบบสอบถามกดปุ่มฐานข้อมูล SQL Server ซึ่งแบบสอบถามตารางที่ว่างเปล่า เรามีตารางว่างเปล่าประมาณ 300 ตารางและบางตารางมีการสอบถามถึง 100-200 ครั้งต่อนาที ตารางไม่มีส่วนเกี่ยวข้องกับธุรกิจของเราและเป็นส่วนหนึ่งของแอปพลิเคชันดั้งเดิมซึ่งผู้ขายไม่ได้ลบเมื่อ บริษัท ของฉันทำสัญญาเพื่อผลิตโซลูชันซอฟต์แวร์สำหรับเรา
นอกเหนือจากข้อเท็จจริงที่ว่าเราสงสัยว่าบันทึกข้อผิดพลาดแอปพลิเคชันของเรากำลังถูกน้ำท่วมด้วยข้อผิดพลาดที่เกี่ยวข้องกับปัญหานี้ผู้จัดจำหน่ายมั่นใจกับเราว่าไม่มีประสิทธิภาพหรือเสถียรภาพด้านผลกระทบสำหรับทั้งแอปพลิเคชันหรือเซิร์ฟเวอร์ฐานข้อมูล บันทึกข้อผิดพลาดมีน้ำท่วมจนเราไม่สามารถเห็นข้อผิดพลาดเกินกว่า 2 นาทีในการวินิจฉัย
ค่าใช้จ่ายจริงของข้อความค้นหาเหล่านี้เห็นได้ชัดว่าอยู่ในระดับต่ำในแง่ของรอบการทำงานของ CPU เป็นต้น แต่ใครก็ตามสามารถแนะนำสิ่งที่มีผลต่อ SQL Server และแอปพลิเคชันได้บ้าง ฉันสงสัยว่ากลไกที่แท้จริงของการส่งคำขอยืนยันดำเนินการส่งคืนและยอมรับการรับแอปพลิเคชันนั้นจะส่งผลกระทบต่อประสิทธิภาพการทำงาน
เราใช้ SQL Server 2008 R2, Oracle Weblogic 11g สำหรับแอป
@ Frisbee- เรื่องสั้นสั้นฉันสร้างตารางที่มี querytext ซึ่งตีตารางที่ว่างเปล่าในฐานข้อมูลของแอพจากนั้นทำการสอบถามสำหรับ tablenames ทั้งหมดที่ฉันรู้ว่าว่างเปล่าและมีรายการที่ยาวมาก สิ่งที่ฮิตที่สุดคือการประหารชีวิต 2.7 ล้านครั้งในช่วงเวลา 30 วันโดยคำนึงถึงแอปที่ใช้กันทั่วไป 8 โมงเช้าถึงหกโมงเย็นดังนั้นตัวเลขเหล่านี้จึงมีความเข้มข้นมากกว่าเวลาทำการ หลายตารางหลายแบบสอบถามอาจบาง relavent ผ่านการเข้าร่วมบางคนไม่ Hit ที่ได้รับความนิยมสูงสุด (2.7 ล้านในเวลานั้น) เป็นตัวเลือกที่ง่ายจากตารางที่ว่างเปล่าเพียงตารางเดียวโดยไม่มีส่วนร่วม ฉันคาดว่าแบบสอบถามที่มีขนาดใหญ่กว่าด้วยการรวมเข้ากับตารางที่ว่างเปล่าอาจรวมถึงการปรับปรุงไปยังตารางที่เชื่อมโยง แต่ฉันจะตรวจสอบและอัปเดตคำถามนี้โดยเร็ว
อัปเดต: มี 1,000 ข้อความค้นหาที่มีจำนวนการดำเนินการระหว่าง 1043 - 4622614 (มากกว่า 2.5 เดือน) ฉันจะต้องขุดให้มากขึ้นเพื่อดูว่าเมื่อใดที่แผนแคชถูกสร้างขึ้นมา นี่เป็นเพียงเพื่อให้คุณทราบขอบเขตของแบบสอบถาม ส่วนใหญ่มีความซับซ้อนพอสมควรมีผู้เข้าร่วมมากกว่า 20 คน
@ srutzky- ใช่ฉันเชื่อว่ามีคอลัมน์วันที่ที่เกี่ยวข้องกับเมื่อแผนถูกรวบรวมเพื่อให้เป็นที่สนใจดังนั้นฉันจะตรวจสอบว่า ฉันสงสัยว่าการ จำกัด เธรดจะเป็นปัจจัยทั้งหมดเมื่อ SQL Server อยู่ในคลัสเตอร์ VMware หรือไม่ อีกไม่นานจะได้เป็น Dell PE 730xD โดยเฉพาะ
@Frisbee - ขออภัยในความล่าช้า ตามที่คุณแนะนำฉันเลือก * จากตารางว่าง 10,000 ครั้งใน 24 กระทู้โดยใช้ SQLQueryStress (จริง ๆ แล้ว 240,000 ซ้ำ) และกด 10,000 Batch Requests / วินาทีทันที จากนั้นฉันลดเหลือ 1,000 ครั้งใน 24 กระทู้และกดต่ำกว่า 4,000 Batches Requests / วินาที ฉันยังลอง 10,000 ซ้ำใน 12 กระทู้เท่านั้น (รวม 120000 ซ้ำ) และทำให้ 6,505 Batches / วินาทียั่งยืน ผลกระทบที่เกิดขึ้นกับ CPU นั้นสามารถสังเกตเห็นได้จริงประมาณ 5-10% ของการใช้ CPU ทั้งหมดในระหว่างการทดสอบ เครือข่ายที่รอนั้นมีน้อยมาก (เช่น 3ms กับไคลเอนต์บนเวิร์กสเตชันของฉัน) แต่ผลกระทบของ CPU อยู่ที่นั่นแน่นอนซึ่งเป็นข้อสรุปที่สวยตราบใดที่ฉันกังวล ดูเหมือนว่าจะลดลงถึงการใช้งาน CPU และไฟล์ฐานข้อมูลที่ไม่มีความจำเป็น IO การประหารชีวิตโดยรวม / วินาทีนั้นทำได้น้อยกว่า 3000 ซึ่งมากกว่าในการผลิต แต่ฉันทดสอบเพียงหนึ่งในสิบของแบบสอบถามเช่นนี้ ผลสุทธิของการค้นหาหลายร้อยครั้งที่เข้าสู่ตารางที่ว่างเปล่าในอัตราระหว่าง 300-4,000 ครั้งต่อนาทีดังนั้นจะไม่มีผลกระทบเล็กน้อยเมื่อพูดถึงเวลาของ CPU การทดสอบทั้งหมดทำกับ PE 730xD ที่ไม่ได้ใช้งานพร้อมด้วยแฟลชคู่และ RAM ขนาด 256GB, 12 คอร์ที่ทันสมัย
@ srutzky- คิดดี SQLQueryStress ดูเหมือนว่าจะใช้การเชื่อมต่อร่วมกันโดยค่าเริ่มต้น แต่ฉันได้ดูแล้วและพบว่าใช่มีการตรวจสอบกล่องสำหรับการเชื่อมต่อร่วมกัน อัปเดตเพื่อติดตาม
@ srutzky- การเชื่อมต่อร่วมกันนั้นไม่ได้เปิดใช้งานในแอปพลิเคชัน - หรือถ้าเป็นเช่นนั้นมันไม่ทำงาน ฉันติดตาม profiler และพบว่าการเชื่อมต่อมี EventSubClass "1 - Nonpooled" สำหรับเหตุการณ์ Audit Login
RE: Connection Pooling- ตรวจสอบ weblogics และพบว่า pooling การเชื่อมต่อถูกเปิดใช้งาน เรียกใช้ร่องรอยเพิ่มเติมต่อการถ่ายทอดสดและพบว่ามีการรวมกันไม่เกิดขึ้นอย่างถูกต้อง / เลย:
และนี่คือสิ่งที่ดูเหมือนว่าเมื่อฉันเรียกใช้แบบสอบถามเดียวโดยไม่รวมกับตารางที่มีประชากร ข้อยกเว้นอ่าน "เกิดข้อผิดพลาดเกี่ยวกับเครือข่ายหรือเฉพาะของอินสแตนซ์ขณะสร้างการเชื่อมต่อกับ SQL Server ไม่พบเซิร์ฟเวอร์หรือไม่สามารถเข้าถึงได้ตรวจสอบว่าชื่ออินสแตนซ์ถูกต้องและมีการกำหนดค่า SQL Server เพื่ออนุญาตการเชื่อมต่อระยะไกล (ผู้ให้บริการ: เนมไปป์ผู้ให้บริการข้อผิดพลาด: 40 - ไม่สามารถเปิดการเชื่อมต่อกับ SQL Server) "หมายเหตุชุดการร้องขอการนับ ส่ง Ping ไปยังเซิร์ฟเวอร์ในช่วงเวลาที่ข้อยกเว้นถูกสร้างผลลัพธ์ในการตอบสนอง ping ที่ประสบความสำเร็จ
อัพเดต - รันการทดสอบต่อเนื่องสองครั้ง, เวิร์กโหลดเดียวกัน (เลือก * จากEmptyTable), เปิดใช้งานการรวมกำไร / ไม่เปิดใช้งาน การใช้ CPU มากขึ้นเล็กน้อยและความล้มเหลวจำนวนมากและไม่เคยไปเกิน 500 ชุดคำขอ / วินาที การทดสอบแสดง 10,000 Batches / วินาทีและไม่มีความล้มเหลวเมื่อรวมกำไรกันแล้วและประมาณ 400 batches / วินาทีจากนั้นมีความล้มเหลวมากมายเนื่องจากการรวมกำไรถูกปิดใช้งาน ฉันสงสัยว่าความล้มเหลวเหล่านี้เกี่ยวข้องกับการขาดความพร้อมในการเชื่อมต่อหรือไม่?
@ srutzky- เลือกจำนวน (*) จาก sys.dm_exec_connections
เปิดใช้งานการรวม: 37 อย่างสม่ำเสมอแม้หลังจากหยุดการทดสอบโหลดแล้ว
การรวมกำไรถูกปิดใช้งาน: 11-37 ขึ้นอยู่กับว่ามีข้อยกเว้น
เกิดขึ้นบน SQLQueryStress หรือไม่: เมื่อรางเหล่านั้นปรากฏบน
กราฟ Batches / วินาทีข้อยกเว้นเกิดขึ้นบน SQLQueryStress และ
จำนวนการเชื่อมต่อลดลงถึง 11 จากนั้นค่อยสำรองสูงสุด 37 เมื่อแบตช์เริ่มขึ้นสู่จุดสูงสุดและข้อยกเว้นจะไม่เกิดขึ้น น่าสนใจมาก ๆ
การเชื่อมต่อสูงสุดทั้งอินสแตนซ์การทดสอบ / อินสแตนซ์ตั้งค่าเริ่มต้นเป็น 0
ตรวจสอบบันทึกของแอปพลิเคชันแล้ว แต่ไม่พบปัญหาการเชื่อมต่ออย่างไรก็ตามมีการบันทึกเพียงไม่กี่นาทีเนื่องจากมีข้อผิดพลาดจำนวนมากและขนาดเช่น: ข้อผิดพลาดในการติดตามสแต็กจำนวนมาก เพื่อนร่วมงานในการสนับสนุนแอปแนะนำว่าข้อผิดพลาด HTTP จำนวนมากเกิดขึ้นที่เกี่ยวข้องกับการเชื่อมต่อ ดูเหมือนว่าจะขึ้นอยู่กับสิ่งนี้ว่าด้วยเหตุผลบางอย่างแอปพลิเคชันที่ไม่ได้รวมการเชื่อมต่ออย่างถูกต้องและด้วยเหตุนี้เซิร์ฟเวอร์จึงขาดการเชื่อมต่อซ้ำ ๆ ฉันจะตรวจสอบบันทึกแอพเพิ่มเติม ฉันสงสัยว่ามีวิธีการพิสูจน์ว่าสิ่งนี้เกิดขึ้นในการผลิตจากฝั่งเซิร์ฟเวอร์ SQL หรือไม่?
@ srutzky- ขอบคุณ ฉันจะตรวจสอบการกำหนดค่าทางเว็บในวันพรุ่งนี้และอัปเดต ฉันคิดว่าเกี่ยวกับการเชื่อมต่อเพียง 37 - ถ้า SQLQueryStress ทำ 12 กระทู้ที่ 10,000 ซ้ำ = 120,000 งบเลือกไม่ใช่สระว่ายน้ำไม่ได้หมายความว่าแต่ละเลือกสร้างการเชื่อมต่อที่แตกต่างกับอินสแตนซ์ SQL?
@ srutzky- Weblogics ได้รับการกำหนดค่าให้เชื่อมต่อกับพูลดังนั้นจึงควรใช้งานได้ดี การรวมการเชื่อมต่อได้รับการกำหนดค่าเช่นนี้ในแต่ละบล็อกการโหลดบาลานซ์ 4 รายการ:
- ความจุเริ่มต้น: 10
- ความจุสูงสุด: 50
- ความจุขั้นต่ำ: 5
เมื่อฉันเพิ่มจำนวนเธรดที่เรียกใช้การเลือกจากคิวรีตารางที่ว่างเปล่าจำนวนการเชื่อมต่อสูงสุดประมาณ 47 เมื่อปิดการรวมการเชื่อมต่อถูกปิดใช้งานฉันเห็นการร้องขอแบตช์สูงสุดต่อวินาทีต่ำลง สิ่งที่จะเกิดขึ้นทุกครั้งคือ 'ข้อยกเว้น' บน SQLQueryStress เกิดขึ้นไม่นานหลังจากที่แบทช์ / วินาทีเข้าสู่รางน้ำ มันเกี่ยวข้องกับการเชื่อมต่อ แต่ฉันไม่สามารถเข้าใจได้อย่างชัดเจนว่าทำไมสิ่งนี้ถึงเกิดขึ้น เมื่อไม่มีการทดสอบใด ๆ #connections จะลดลงเหลือประมาณ 12
เมื่อการรวมการเชื่อมต่อถูกปิดใช้งานฉันมีปัญหาในการทำความเข้าใจว่าทำไมข้อยกเว้นจึงเกิดขึ้น แต่อาจเป็นคำถาม / คำถามแบบสแต็กซ์เอ็กซ์เชนจ์อื่น ๆ สำหรับ Adam Machanic
@ srutzky ฉันสงสัยว่าทำไมข้อยกเว้นเกิดขึ้นโดยไม่เปิดใช้งานการรวมกำไรแม้ว่า SQL Server จะไม่เชื่อมต่อหมด
SELECT COUNT(*) FROM sys.dm_exec_connections;
เพื่อดูว่าค่าแตกต่างกันมากระหว่างการเปิดใช้งานการรวมหรือ ไม่. จากข้อผิดพลาดเหล่านั้นฉันคิดว่าจะมีการเชื่อมต่ออีกมากมายเมื่อปิดการใช้งานร่วมกัน
Pooling=false
หรือMax Pool Size
ไม่?