คำสั่ง SELECT จากระยะไกลช้าเนื่องจาก“ เวลาในการประมวลผลลูกค้า” ที่ยาวนาน แต่รวดเร็วในพื้นที่


12

ในขณะที่เชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้งานจริงของเรา (SQL Server 2008, เครื่องจักรที่ทรงพลังมาก), คำสั่ง SELECT นี้ใช้เวลา2 วินาที , กระจายกลับทุกช่อง (รวมข้อมูล 4 MB)

SELECT TOP (30000) *
FROM person
WITH(NOLOCK);

จากการใด ๆอื่น ๆกล่องบนเครือข่ายเดียวกัน (การเชื่อมต่อใช้การตรวจสอบ SQL หรือ Windows Authentication) แบบสอบถามเดียวกันจะใช้เวลา1 นาที 8 วินาที

ฉันกำลังทดสอบด้วยคำสั่งง่ายๆนี้เพื่อแสดงให้เห็นว่าไม่ใช่ปัญหาการจัดทำดัชนีหรือปัญหาเกี่ยวกับแบบสอบถาม (เรามีปัญหาด้านประสิทธิภาพด้วยข้อความค้นหาทั้งหมดในขณะนี้ ... )

แถวมาเป็นกลุ่มและไม่ใช่ทั้งหมดในคราวเดียว ฉันได้แถวแรกทันทีจากนั้นรอประมาณ 1 นาทีเพื่อให้แถวเข้ามา

นี่คือสถิติลูกค้าของแบบสอบถามเมื่อมีการเรียกใช้จากกล่องระยะไกล:

Query Profile Statistics
  Number of INSERT, DELETE and UPDATE statements 0
  Rows affected by INSERT, DELETE, or UPDATE statements 0
  Number of SELECT statements  2
  Rows returned by SELECT statements 30001
  Number of transactions 0

Network Statistics
  Number of server roundtrips 3
  TDS packets sent from client        3
  TDS packets received from server 1216
  Bytes sent from client         266
  Bytes received from server 4019800

Time Statistics
  Client processing time 72441 ms (72 seconds)
  Total execution time   72441 ms
  Wait time on server replies 0

เราจะเห็นได้ว่า "เวลาดำเนินการลูกค้า" เท่ากับเวลาดำเนินการทั้งหมด

ไม่มีใครรู้ขั้นตอนที่ฉันสามารถดำเนินการเพื่อวินิจฉัยว่าทำไมการถ่ายโอนข้อมูลจริงใช้เวลานานหรือไม่

มีพารามิเตอร์การกำหนดค่า SQL ที่ จำกัด หรือ จำกัด ความเร็วการถ่ายโอนข้อมูลระหว่างเครื่องหรือไม่?


โดยวิธีการที่เราพยายามคัดลอกไฟล์ที่มีขนาดเดียวกัน (4 MB) ระหว่างเซิร์ฟเวอร์ DB และกล่องอื่นและนั่นใช้เวลาไม่กี่วินาที ดังนั้นดูเหมือนจะไม่เป็นปัญหาเครือข่าย
FranticRock

แอปพลิเคชันไคลเอนต์คืออะไร SSMS บนเวิร์กสเตชันผู้ใช้ปลายทาง?
Thomas Stringer

ใช่ Microsoft SQL Server Management Studio 10.50.1600.1 2008 R2
FranticRock

ปัญหานี้เริ่มต้นตั้งแต่เราย้ายดาต้าเซ็นเตอร์และเครื่องทั้งหมดติดตั้งใหม่ (ทุกอย่างรวมถึง SQL) เราอยู่กับผู้ให้บริการโฮสติ้งที่น่านับถือมาก
FranticRock

คำตอบ:


5

ปัญหาของคุณเกี่ยวข้องกับเครือข่ายอย่างแน่นอนตามข้อมูลของคุณ ดังนั้นจะต้องมีการจัดการกับผู้เชี่ยวชาญด้านเครือข่าย (ฉันไม่ใช่คน)

สิ่งที่อาจช่วยได้:

  • การ์ด NIC ที่เร็วกว่า (บนเซิร์ฟเวอร์ SQL)
  • การเพิ่มการ์ด NIC / ซับเน็ตที่จัดสรร / เฉพาะระหว่างเซิร์ฟเวอร์ (เว็บเซิร์ฟเวอร์และเซิร์ฟเวอร์ SQL)

เว็บเซิร์ฟเวอร์ในซับเน็ตเดียวกันกับเซิร์ฟเวอร์ SQL หรือไม่

มีเราเตอร์ / สะพาน ฯลฯ ระหว่างพวกเขาหรือไม่?

มีการเปลี่ยนแปลงที่เป็นไปได้ไม่มากบนเซิร์ฟเวอร์ SQL:

  • ข้อมูลขาออกกำลังถูกส่งโดย SQL Server ด้วย MS "TDS protocol" ที่เป็นกรรมสิทธิ์
  • ขนาดเริ่มต้นของบัฟเฟอร์ TDS คือ 4 KB ดูใน MSDB: "ตัวเลือกขนาดแพ็คเก็ตเครือข่าย"
  • การบีบอัดข้อมูล (ด้วย SQL Server หรือแอปพลิเคชันภายนอก) - ขึ้นอยู่กับลักษณะของข้อมูล

คุณกำลังใช้ขนาดเริ่มต้น: ดูสถิติของคุณ: "แพ็คเก็ต TDS ที่ได้รับจากเซิร์ฟเวอร์ 1216" (4MB / 1K = 4KB) ใช่ขนาดของบัฟเฟอร์ TDS สามารถเปลี่ยนแปลงได้: ดูใน Google: "ขนาดแบทช์โปรโตคอล TDS"

การอภิปรายที่ดีในหัวข้อ: "ขนาดแพ็คเก็ตเครือข่ายของ sql จริง ๆ กำหนดปริมาณการรับส่งไปกลับหรือไม่"

อย่างไรก็ตามการเปลี่ยนขนาดแพคเกจ TDS (อย่างหลีกเลี่ยงไม่ได้) จะมีผลกระทบที่ไม่แน่นอนและควรจะใช้ในการผลิตในกรณีพิเศษเท่านั้น

การเปลี่ยนแปลงสถาปัตยกรรมหรือการแนะนำการแคชข้อมูลในระดับกลางก็จะช่วยได้เช่นกัน


8

ปัญหานี้ได้รับการแก้ไขแล้ว

มันเป็นปัญหาเครือข่ายและกล่อง SQL ใช้การ์ด NIC 100 MB / sแทนการ์ด10 GB / s NIC ...

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

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


ฉันมีปัญหาเดียวกันกับคุณและฉันต้องการตรวจสอบว่า NIC การ์ดของฉันใช้ SQL Server ใด ฉันจะดูได้ที่ไหน
Misha Zaslavsky

3

เมื่ออ่านครั้งแรกดูเหมือนว่าคุณกำลังประสบปัญหาเวลาในการตอบสนองของเครือข่าย คุณเคยดู Network Perfmon counters บ้างไหม? สิ่งเหล่านี้อาจเป็นสัญญาณบ่งบอกว่าคุณกำลังทำอะไรอยู่กับเครือข่าย

อ้างอิงจากเคาน์เตอร์ Perfmon แบบใดที่ฉันควรตรวจสอบและแต่ละรายการมีความหมายอย่างไร

เครือข่าย IO

หากต้องการวัด I / O เครือข่ายคุณสามารถใช้ตัวนับต่อไปนี้:

Network InterfaceBytes รวม / วินาที

Threshold: ค่าที่ยั่งยืนของแบนด์วิธเครือข่ายมากกว่า 80 เปอร์เซ็นต์

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

Network InterfaceBytes ได้รับ / วินาที

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

Network InterfaceBytes ส่ง / วินาที

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

ServerBytes รวม / วินาที

ค่านี้ไม่ควรเกิน 50 เปอร์เซ็นต์ของความจุเครือข่าย

ตัวนับนี้ระบุจำนวนไบต์ที่ส่งและรับผ่านเครือข่าย ค่าที่สูงกว่าระบุแบนด์วิดท์เครือข่ายเป็นคอขวด หากผลรวมของ Bytes Total / วินาทีสำหรับเซิร์ฟเวอร์ทั้งหมดมีค่าเท่ากับอัตราการถ่ายโอนสูงสุดของเครือข่ายของคุณคุณอาจต้องแบ่งส่วนเครือข่าย

หน่วยประมวลผล% เวลาขัดจังหวะ

ตัวนับนี้ระบุเปอร์เซ็นต์ของเวลาที่หน่วยประมวลผลใช้ในการรับและให้บริการการขัดจังหวะฮาร์ดแวร์ ค่านี้เป็นตัวบ่งชี้ทางอ้อมของกิจกรรมของอุปกรณ์ที่สร้างการขัดจังหวะเช่นอะแดปเตอร์เครือข่าย

Network Interface (*) Output Queue Length

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

Output Queue Length คือความยาวของเอาต์พุตแพ็กเก็ตคิว (เป็นแพ็กเก็ต) หากสิ่งนี้ยาวเกินกว่าสองครั้งจะมีความล่าช้าและควรตรวจสอบและกำจัดคอขวดถ้าเป็นไปได้ เนื่องจากคำร้องขอถูกเข้าคิวโดย Network Driver Interface Specification (NDIS) ในการนำไปใช้งานสิ่งนี้จะเป็น 0 เสมอ


หลังจากตรวจสอบสถานะเหล่านี้ใน Perfmon ฉันสังเกตเห็นบางสิ่ง จำนวนไบต์ทั้งหมด / วินาทีไม่เพิ่มขึ้นมากกว่า 700K / s ในการ์ดเครือข่ายใด ๆ แม้ว่าฉันจะเรียกใช้คิวรีที่ขอข้อมูลเป็นเมกะไบต์ตัวเลขนี้จะอยู่ที่ประมาณ 500K / วินาที แบนด์วิดท์ของเราคือ 100 MBPS และเรายังไม่ได้ใช้งานถึง 1% ฉันคิดว่าควรมีการกำหนดค่าขีด จำกัด บางแห่งที่บังคับขนาดของแพ็คเก็ตหรือ จำกัด อัตราการถ่ายโอน การขัดจังหวะฮาร์ดแวร์ / วินาทีอยู่ที่ 700-2000 เอาต์พุตคิวว่างเปล่า การใช้งานการ์ดเครือข่ายสูงสุดที่ประมาณ 4% ที่สูงสุด
FranticRock

2
อาจมีความไม่ตรงกันระหว่างความเร็วของการ์ดเครือข่ายและพอร์ตสวิตช์ คุณได้ว่าจ้างทีมเครือข่ายของคุณให้มองจากด้านสวิตช์หรือไม่?
jgardner04

2

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

จากช่องอื่นในเครือข่ายเดียวกัน ... ข้อความค้นหาเดียวกันใช้เวลา 1 นาที 8 วินาที 3) คุณกำลังบอกว่าแบบสอบถามส่งคืนและถูกใช้จากไคลเอนต์ซึ่งตั้งอยู่บนเครื่องใด ๆ ในเครือข่ายที่กำหนด (แสดงเครื่องของคุณโดยเฉพาะ) ในเวลาประมาณ 70 วินาที? ฉันเข้าใจถูกต้องหรือไม่ 3.1 บังเอิญเวลาสำหรับการบริโภคของแบบสอบถามนี้เป็นที่ยอมรับโดยธุรกิจคืออะไร? 4) อย่างไรก็ตามคุณกำลังระบุว่าสำหรับเครื่องไคลเอนต์เฉพาะที่คุณใช้เวลาที่ใช้เอาต์พุตคิวรีคือ: เวลาเรียกใช้ไคลเอ็นต์ 15:30: 48 15 นาที? (และในเวลานี้ไม่สามารถยอมรับได้อย่างชัดเจน) แก้ไข? 5) ดังนั้นปัญหาถูก จำกัด ไว้ที่เครื่องไคลเอนต์เดียว? หรือเพื่อลูกค้า / เครื่องอื่น ๆ ระดับกลาง (ในสภาพแวดล้อมใหม่)? 6) ความล่าช้าที่ ping แสดงคืออะไร? จากคอมพิวเตอร์ไคลเอนต์ไปยังเซิร์ฟเวอร์หรือไม่ 7) คุณ (หรือผู้ดูแลระบบเครือข่าย) เรียกใช้ tracert ทั้งสองวิธี (จากไคลเอ็นต์ไปยังเซิร์ฟเวอร์จากเซิร์ฟเวอร์ไปยังไคลเอ็นต์) มีกี่ฮ็อป เวลารวมคืออะไร? 8) เครือข่ายการผลิตเก่ายังมีชีวิตอยู่หรือไม่? คุณสามารถเปรียบเทียบโดยใช้ Ping และ Traceroute - เวลาและการกระโดดข้ามระหว่างไคลเอนต์และเซิร์ฟเวอร์คืออะไร

ออกมาจากความอยากรู้อยากเห็น: นี่คือตัวอย่างของการสืบค้น? หรือถ้อยคำที่แน่นอนของแบบสอบถาม? แบบสอบถามไม่มีส่วนคำสั่ง WHERE จริงหรือ? เห็นด้วยกับฉันว่ามันผิดปกติมาก .. ตารางมีดัชนีแบบกลุ่มหรือเป็นฮีป ตารางประกอบด้วยจำนวนแถวทั้งหมดในทั้งหมดหรือไม่ ตารางมีการแยกส่วนอย่างหนัก? ด้วยความอยากรู้: มีเหตุผลให้เลือก TOP NNN หรือไม่ ทำไมไม่ตั้งค่า ROWCOUNT NNN - จากนั้นเลือก * แบบสอบถามนี้มีการออกลูกค้ากี่ครั้งต่อวัน 1? 100? 1MLN? ข้อมูลอ้างอิงเป็นแบบคงที่หรือเป็นแบบไดนามิกและมีการเปลี่ยนแปลงมาก? เท่าไหร่ (0.01 เปอร์เซ็นต์ต่อวัน 1 เปอร์เซ็นต์ต่อวัน 10 เปอร์เซ็นต์ต่อวัน?) ผลลัพธ์ของแบบสอบถามจะถูกประมวลผลโดยทางโปรแกรม (ไม่ใช่ผู้ใช้ใช่หรือไม่) ทำไมจึงไม่แคช / ไม่จัดเก็บในระดับกลาง ขอบคุณอเล็กซี่


ขอบคุณมากสำหรับข้อมูล คำตอบของฉันด้านล่าง 1. ถูกต้อง เครื่องมือไคลเอ็นต์ยังได้รับการติดตั้งใน prod และแบบสอบถามเดียวกันที่ฉันกล่าวถึงใช้เวลา 2 วินาทีในการส่งคืนระเบียนทั้งหมด 30,000 รายการ (ขนาดรวม 4 MB) โดยวิธีการแบบสอบถามที่ฉันใช้เป็นเพียงตัวอย่าง ไม่ใช่แบบสอบถามธุรกิจจริง เป็นเพียงวิธีการรับข้อมูล 4 MB จากตาราง ขณะนี้เราประสบปัญหาด้านประสิทธิภาพในการอ่านข้อมูลหลายเมกะไบต์จากตารางใด ๆ ด้วยแบบสอบถามใด ๆ ในขณะนี้
FranticRock

2. เวลาการใช้งานจะใกล้เคียงกันหากไม่ตรงกับที่ใช้แบบสอบถามเดียวกันภายในเครื่องจากกล่อง PROD (IE 2 วินาที) 3. นั่นคือเวลา 1 นาที 8 วินาทีที่ถูกต้องคือเวลาดำเนินการ เวลานี้จะแตกต่างกันระหว่างเครื่องไคลเอนต์ที่แตกต่างกัน จากเครื่องพัฒนาของเรา (ตั้งอยู่ไกลจากเครื่องเวที) ฉันวิ่งแบบสอบถามนี้ 8 ครั้งในหนึ่งแถวและเวลาอยู่ในช่วงตั้งแต่ 11 วินาทีถึง 22 วินาที (เฉลี่ย 18 วินาที)
FranticRock

จากกล่อง dev tracert ของเรา Prod_IP_ ที่อยู่ 1 53 ms 52 ms 53 ms SQL2008 จากเครื่องสเตจใช้เวลาอย่างต่อเนื่องมากกว่า 1 นาที tracert Prod_IP_ ที่อยู่ tracert: 1 1 ms <1 ms <1 ms SQL2008 จากเว็บเซิร์ฟเวอร์การผลิต: เวลาดำเนินการคือ 53 วินาที tracert: 1 1 ms <1 ms <1 ms SQL2008
FranticRock

4. คอลัมน์ด้านบน "เวลาดำเนินการไคลเอ็นต์" เป็นเพียงเวลาท้องถิ่นของเครื่อง (IE: 15:30:00) 5. ปัญหาเกิดขึ้นกับเครื่องใด ๆ ที่กดปุ่มเซิร์ฟเวอร์ฐานข้อมูลการผลิตรวมถึงบนเว็บเซิร์ฟเวอร์การผลิตของเรา 6. การหน่วงเวลา ping คือ <1 MS จากกล่องระยะไปยังกล่อง prod SQL 7. โปรดดูด้านบน 8. น่าเสียดายที่เครือข่ายเก่าไม่มีอยู่อีกต่อไป
FranticRock

เป็นเรื่องที่น่าสนใจจริง ๆ แม้ว่า DEV จะส่ง 53 MS แต่ใช้เวลาเพียง 11-22 วินาทีในการเรียกใช้แบบสอบถาม ขณะที่สเตจปิง 1 MS ใช้เวลามากกว่า 1 นาทีในการส่งคืนข้อมูล Dev อยู่ห่างออกไปทางภูมิศาสตร์มากเช่นกัน และเวทีอยู่ตรงนั้นถัดจากกล่องแยงและยังใช้เวลานานกว่านั้นมาก
FranticRock
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.