จะปิดใช้งานไฮเปอร์เธรดเพื่อปรับปรุงประสิทธิภาพในการติดตั้ง SQL Server ของเรา


28

ที่เกี่ยวข้องกับ: ภูมิปัญญาปัจจุบันบน SQL Server และ Hyperthreading

เร็ว ๆ นี้เราอัพเกรดเซิร์ฟเวอร์ฐานข้อมูลของเรา Windows 2008 R2 จากX5470กับX5560 ทฤษฏีคือซีพียูทั้งสองตัวมีประสิทธิภาพที่คล้ายกันมากหากมีสิ่งใดที่ X5560 นั้นเร็วกว่าเล็กน้อย

อย่างไรก็ตามประสิทธิภาพของ SQL Server 2008 R2 นั้นค่อนข้างแย่ในวันสุดท้ายและการใช้งาน CPU ค่อนข้างสูง

อายุขัยของเพจมีขนาดใหญ่มากเราได้รับผลกระทบเกือบ 100% สำหรับเพจดังนั้นหน่วยความจำจึงไม่เป็นปัญหา

เมื่อฉันวิ่ง:

SELECT * FROM sys.dm_os_wait_stats 
order by signal_wait_time_ms desc

ฉันได้:

wait_type wait_tasks_count wait_time_ms max_wait_time_ms สัญญาณ _wait_time_ms
-------------------------------------------------- ---------- -------------------- -------------------- -------------------- --------------------
XE_TIMER_EVENT 115166 2799125790 30165 2799125065
REQUEST_FOR_DEADLOCK_SEARCH 559393 2799053973 5180 2799053973
SOS_SCHEDULER_YIELD 152289883 189948844 960 189756877
CXPACKET 234638389 2383701040 141334 118796827
SLEEP_TASK 170743505 1525669557 1406 76485386
LATCH_EX 97301008 810738519 1107 55093884
LOGMGR_QUEUE 16525384 2798527632 20751319 4083713
WRITELOG 16850119 18328365 1193 2367880
PAGELATCH_EX 13254618 8524515 11263 1670113
ASYNC_NETWORK_IO 23954146 6981220 7110 1475699

(10 แถวได้รับผลกระทบ)

ฉันยังวิ่ง

-- Isolate top waits for server instance since last restart or statistics clear
WITH Waits AS (
   SELECT 
        wait_type, 
        wait_time_ms / 1000. AS [wait_time_s],
        100. * wait_time_ms / SUM(wait_time_ms) OVER() AS [pct],
        ROW_NUMBER() OVER(ORDER BY wait_time_ms DESC) AS [rn]
FROM sys.dm_os_wait_stats
WHERE wait_type NOT IN ('CLR_SEMAPHORE','LAZYWRITER_SLEEP','RESOURCE_QUEUE',
    'SLEEP_TASK','SLEEP_SYSTEMTASK','SQLTRACE_BUFFER_FLUSH','WAITFOR','LOGMGR_QUEUE',
    'CHECKPOINT_QUEUE','REQUEST_FOR_DEADLOCK_SEARCH','XE_TIMER_EVENT','BROKER_TO_FLUSH',
    'BROKER_TASK_STOP','CLR_MANUAL_EVENT','CLR_AUTO_EVENT','DISPATCHER_QUEUE_SEMAPHORE',
    'FT_IFTS_SCHEDULER_IDLE_WAIT','XE_DISPATCHER_WAIT', 'XE_DISPATCHER_JOIN'))

SELECT W1.wait_type, 
    CAST(W1.wait_time_s AS DECIMAL(12, 2)) AS wait_time_s,
    CAST(W1.pct AS DECIMAL(12, 2)) AS pct,
    CAST(SUM(W2.pct) AS DECIMAL(12, 2)) AS running_pct
FROM Waits AS W1
INNER JOIN Waits AS W2 ON W2.rn <= W1.rn
GROUP BY W1.rn, W1.wait_type, W1.wait_time_s, W1.pct
HAVING SUM(W2.pct) - W1.pct < 95; -- percentage threshold

และได้รับ

wait_type wait_time_s pct running_pct
CXPACKET 554821.66 65.82 65.82
LATCH_EX 184123.16 21.84 87.66
SOS_SCHEDULER_YIELD 37541.17 4.45 92.11
PAGEIOLATCH_SH 19018.53 2.26 94.37
FT_IFTSHC_MUTEX 14306.05 1.70 96.07

นั่นแสดงให้เห็นถึงจำนวนมหาศาลของเวลาในการซิงโครไนซ์แบบสอบถามที่เกี่ยวข้องกับการขนาน (CXPACKET สูง) นอกจากนี้โดยทั่วไปแล้วคำถามค้นหาปัญหาเหล่านี้จะถูกดำเนินการในหลายคอร์ (เราไม่มีคำแนะนำ MAXDOP ที่ใดก็ได้ในรหัสของเรา)

เซิร์ฟเวอร์ไม่ได้โหลดมานานกว่าหนึ่งวัน เรากำลังประสบกับความแปรปรวนจำนวนมากกับการดำเนินการค้นหาโดยทั่วไปแบบสอบถามจำนวนมากดูเหมือนจะช้ากว่าที่เคยทำบนเซิร์ฟเวอร์ DB ก่อนหน้านี้และ CPU ของเรานั้นสูงมาก

การปิดใช้งานไฮเปอร์เธรดจะช่วยลดการใช้ CPU และเพิ่มปริมาณงานหรือไม่



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

ในกรณีของเรา CXPACKET นั้นสูงเนื่องจากเธรดอื่น ๆ เพิ่งอ่านจากแคชมากเกินไป (20 ล้านครั้งต่อการอ่านแบบตรรกะต่อการสืบค้น) กรณีของเราอีกครั้งคือเซมินอย anti-semijoin ที่ไม่ดีพร้อมตารางที่แบ่งพาร์ติชันซึ่งมีเพียง 700K แถว
ozamora

@ mrdenny ใช่เวลารอการสลักสูงนั้นเกี่ยวกับเรากำลังตรวจสอบอยู่ในขณะนี้
Sam Saffron

คำตอบ:


10

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

เราสามารถพูดคุยเกี่ยวกับทฤษฎีว่า Hyperthreading ควรทำร้ายหรือปรับปรุงสิ่งต่าง ๆ โดยทั่วไปหรือไม่ (ฉันคิดว่ามันมีแนวโน้มที่จะได้รับบาดเจ็บมากกว่าความช่วยเหลือบนเซิร์ฟเวอร์ดังนั้นสำหรับการปรับใช้ "ทั่วไป" ที่ฉันอาจปิดใช้งาน) แต่มี วิธีเดียวที่จะเห็นว่ามันจะสร้างความแตกต่างในกรณีเฉพาะของคุณและนั่นคือลองและดู


3
หมายเหตุฉันไม่ได้ลงคะแนนเราต้องการความช่วยเหลือทั้งหมดที่เราสามารถทำได้อย่างไรก็ตามเราต้องการหลีกเลี่ยงการแทงในที่มืดในระบบการผลิต ฉันต้องการตรวจสอบให้แน่ใจว่าเรารวบรวมการวินิจฉัยเพียงพอก่อนที่จะทำการโทรโดยใช้การตั้งค่านี้
Sam Saffron

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

5
โหวตที่นี่ - ฉันเห็นด้วยกับคำตอบ คำตอบทั่วไปคือ: ปิดการทำไฮเปอร์เธรด คำตอบที่เฉพาะเจาะจงมากขึ้นคือ: มันขึ้นอยู่กับข้อมูลเฉพาะและต้องผ่านการทดสอบ
TomTom

1
ผิดปกติพอฉันคิดว่านี่เป็นคำตอบที่ดีที่สุดที่จะยอมรับการล้อเล่นด้วยการตั้งค่า maxdop สามารถนำไปสู่ปัญหามากมาย Nehalem cpus เร็วกว่า xeons ที่ใช้คอร์มากแม้ว่าความเร็วสัญญาณนาฬิกาจะช้าลงเล็กน้อยฉันพบอาร์กิวเมนต์ l2 แคชเล็กน้อย ปลาเฮอริ่งแดงทำให้แคช l3 ใหญ่ขึ้นมาก ในฐานะที่เป็นภาคผนวกดู: blog.stackoverflow.com/2010/10/database-upgradeหากใครเห็น Hit / Gain มากกว่า 20% เปอร์เซ็นต์ / การ ... มันอาจไม่ได้เกิดจาก HT
Sam Saffron

ฉันมีประสบการณ์ตรงข้ามกับ @TomTom และ @Robert ฉันพบว่า HT เปิดมักจะดีกว่าปิด 10-15% โอกาสที่ปิดใช้งานจะช่วยเพิ่มประสิทธิภาพได้ยาก
Brian Knoblauch

12

ฉันเห็นด้วย

  • คำแนะนำที่ดีที่สุดคือ "ลอง HyperThreading กับปริมาณงานของคุณและดูว่าเกิดอะไรขึ้น" เรากำลังทำสิ่งนี้ในขณะที่ฉันพิมพ์และ .. มันไม่ดีเลย!
  • คุณควรเริ่มต้นด้วย HyperThreading อยู่เสมอซึ่งจะปลอดภัยที่สุด

ดูเหมือนว่าเราควรจะปรับสองสิ่ง:

  1. MAXDOP (องศาสูงสุดของความเท่าเทียมกัน) ทุกสิ่งที่ฉันอ่านบ่งชี้ว่าการมีขอบเขตที่ไม่ จำกัด นี้อาจเป็นความคิดที่ไม่ดีและเอกสารของ Microsoft ระบุว่า:

    การตั้งค่าตัวเลือกนี้ [MAXDOP] เป็นค่าที่มากขึ้น [มากกว่า 8] มักทำให้การใช้ทรัพยากรที่ไม่พึงประสงค์และการเสื่อมประสิทธิภาพ

    สิ่งที่สูงกว่าที่8ไม่แนะนำโดยทั่วไป .. ดังนั้นฉันตั้งไว้4สำหรับตอนนี้ เริ่มแรกเป็นศูนย์ (ไม่ จำกัด )

  2. เกณฑ์ต้นทุนสำหรับความเท่าเทียม เห็นได้ชัดว่าค่าเริ่มต้นของ5ที่นี่ถือเป็นค่าเริ่มต้นที่ค่อนข้างต่ำตามโพสต์ SQL MVP สองสามรายการที่ฉันพบ - เราสามารถปรับแต่งมันขึ้นมาเพื่อลดความพยายามในการขนานกันของตัวจัดตารางเวลา

แต่ความจริงแล้วพวกเขารู้สึกเหมือนการแก้ปัญหา ฉันคิดว่าทางออกที่แท้จริงสำหรับภาระงานของเรา (ดัชนีข้อความแบบเต็มหนัก) คือการปิดใช้งาน HT


4
MAXDOP ยังทำให้เกิดปัญหากับ HT เนื่องจากอาจพยายามเรียกใช้สองเธรดบน CPU เดียวกันหากคุณพูด 8 คอร์และ 16 เธรดและ maxdop ของคุณถูกตั้งค่าเป็น 10 โดยทั่วไป 1 MAXDOP ต่อลอจิคัลโปรเซสเซอร์ควรเป็น max และการรันสองเธรดบน CPU เดียวกันสำหรับกระบวนการเดียวกันนั้นไม่มีประโยชน์
Mark Henderson

2
@Farseeker ที่จะเกิดขึ้นหากคุณไม่มีระบบปฏิบัติการ HyperThreading ที่รับรู้ Windows ที่ใหม่กว่า 2000 นั้นรับรู้ถึงมัน
Mircea Chirea

มันน่าสังเกตว่าการแทนที่ maxdop เหล่านี้เป็นสาเหตุของปัญหาเท่านั้น ค่าเริ่มต้นก็ดีสำหรับเรา
แซม Saffron

2
รุ่นมาตรฐานของ SQL Server maxes ออกที่ MAXDOP ของ 4 anyways เมื่อเหลือไม่ จำกัด ต้องการให้องค์กรไปสูงกว่านั้น เรามีปริมาณงานบางส่วนที่เร็วขึ้นด้วย MAXDOP จาก 1 (ไม่ใช่กล่อง HT ทำงานหลาย AMD 8 คอร์) ...
Brian Knoblauch

1
@Brian Knoblauch - ฉันรู้สิ่งนี้ในอีกหนึ่งปีต่อมา แต่ฉันพบกับ "รุ่นมาตรฐานของ SQL Server maxes ที่ MAXDOP ทุก 4 เมื่อเหลือไม่ จำกัด " โอกาสใด ๆ ที่คุณสามารถชี้ไปที่เอกสารบางอย่าง ขณะนี้เรากำลังพูดถึงการใช้ MAXDOP ในที่ทำงาน แต่ไม่แน่ใจว่าจะตั้งไว้อย่างไร ซึ่งโดยทั่วไปหมายถึง 4 เหมือนกันว่าไม่ถูกต้อง?
Jeremy A. West

9

Anandtech พบว่าเมื่อมีการอ่านข้อมูลอย่างหนักมันเจ็บเพียงเล็กน้อยและด้วยภาระงานเขียนที่หนักหน่วง ฉันไม่เคยเห็นอะไรที่จะทำให้ฉันคิดว่ามันจะทำให้คุณได้รับผลกระทบที่แย่กว่า -5% หรือชนะได้ดีกว่า 15% สังเกตสิ่งที่เป็น Atom มันเป็นชัยชนะครั้งใหญ่ แต่นั่นเป็นซีพียูที่แปลกมาก

สิ่งที่คุณเปลี่ยนเป็นซีพียู? คุณเปลี่ยนจากแคช 12MB และ 4 เธรดดังนั้นแคช 3MB ต่อเธรดเป็นแคช 8 MB และ 8 เธรดดังนั้น 1MB ต่อเธรด ทีนี้นั่นมันเกินความจริง แต่ฉันคิดว่านั่นคือสิ่งที่กำลังฆ่าคุณคุณเคยเรียกใช้คิวรี่ในแคชและตอนนี้เรียกใช้จาก RAM เพราะพวกเขาต้องการมากกว่า 1MB แต่น้อยกว่า 3MB การปิด HT อาจจะช่วยได้ แต่ฉันจะกลับไปใช้ CPU ตัวเก่า ปิด HT และคุณจะได้รับ 2MB ต่อเธรด แต่ถ้าปริมาณงานของคุณเพิ่มขึ้นมากมันจะไม่ช่วย อาจเป็นไปได้ว่า cpu แคชขนาด 12MB เร็วขึ้นอย่างมากสำหรับปริมาณงานของคุณ

ฉันจะลองปิด HT และดูว่าเป็นการปรับปรุงหรือไม่ แต่ฉันสงสัยว่าแคชนั้นเป็นสิ่งสำคัญสำหรับภาระงานของคุณและคุณอาจต้องกลับไปใช้ชิป 12 MB


3
L2 cache ต่อการสังเกตหลักคือการขยายขนาดใหญ่เนื่องจาก CPU เป็นรุ่นเต็มรุ่นหนึ่งล่วงหน้า (Nehalem / Core i7 เทียบกับคลาส Core 2 Quad)
Jeff Atwood

@Jess, @Ronald และ Nehalem มีแคช L2 น้อย จำนวนมากคือ L3 ซึ่งใช้ร่วมกันข้ามคอร์
Mircea Chirea

7

Hyperthreading เป็นวิธีที่ดีที่สุดในการแยกงานออกจากระบบปฏิบัติการและวางไว้บนตายด้วยการเข้าถึงโดยตรงไปยังแคช L1 และ L2 ซึ่งทำให้งานเปลี่ยน crapload เร็วขึ้น

การทดสอบกับ VMWare บ่งชี้ว่าการปิดใช้งาน HT นั้นไม่สามารถแยกแยะได้ภายใต้โหลดมาตรฐานและเพิ่มขึ้น 5% ภายใต้ภาระหนักเนื่องจาก ESXi นั้นฉลาดพอที่จะทราบความแตกต่างระหว่างเธรด "ของจริง" และ "ปลอม" (มี มากไปกว่านั้น แต่ที่อยู่ในแง่ laymens) SQL Server 2005 นั้นค่อนข้างฉลาด แต่รวมกับระบบปฏิบัติการที่ทันสมัยควรมีข้อได้เปรียบเล็กน้อยในการปิดใช้งาน HT

จากทั้งหมดที่กล่าวมาฉันเห็นด้วยกับ Ronald ว่าเป็นไปได้มากที่สุดที่จะเป็นแคช L2 ของคุณ ขนาดแคชที่ลดลง 33% นั้นเป็นสิ่งที่สำคัญมากและเมื่อเราระบุเซิร์ฟเวอร์ SQL ของเราเรามักจะทำการแคชมากกว่าความเร็วสัญญาณนาฬิกาดิบทุกครั้ง


คุณสามารถตั้งค่า affinity ภายนอกเพื่อให้ 4 คอร์ถูกต้องถูกละเว้นโดย SQL?
Sam Saffron

3
โดยทั่วไปคุณต้องการตั้งค่าความสัมพันธ์กับเธรด CPU แต่ละตัว แต่ตราบใดที่ MAXDOP ถูกตั้งค่าอย่างถูกต้องฉันไม่เห็นเหตุผลใดเลยที่จะตั้งค่าความสัมพันธ์เลย ด้วย HT แม้ว่าเธรดแรกที่จะได้รับการโจมตีบน CPU กลายเป็นเธรด "main" และเธรดที่สองคือเธรด "HT" แม้ว่าจะไม่มีเธรด "main" และ "ht" ที่แท้จริงเพราะเป็นสิ่งใดก็ตามที่ไปถึงที่นั่นก่อนแล้วเมื่อพวกเขาสลับงานคำสั่งจะถูกกลับรายการ
Mark Henderson

ซีพียูที่ใช้ Nehalem มีแคช V2 LUTTLE LERY ส่วนใหญ่ L3 ส่วนใหญ่ใช้ร่วมกัน
Mircea Chirea

7

ตามประสบการณ์ของฉัน HT ทำให้การดำเนินงาน I / O ใช้งานตลอดเวลาบนโหนดที่ใช้งานอยู่บนคลัสเตอร์ Windows 2008 R2 (ใช้ SQL Server 2008 R2) ความจริงที่น่าสนใจคือมันไม่ได้สะท้อนให้เห็นในสถิติการรอหรือใน pssdiag ที่ฉันใช้สำหรับการสนับสนุน Microsoft

วิธีที่ฉันสังเกตเห็น I / O ต่ำเพียงแค่ดูตัวนับ OS สำหรับดิสก์ทางกายภาพ อย่างที่แซมบอกผมเขียนเกี่ยวกับที่นี่และที่นี่

หากคุณไม่พบปัญหา I / O และ CPU ผูกไว้ฉันขอแนะนำให้คุณเริ่มวิธีนี้:

ระบุกระบวนการและบล็อก T-SQL ที่ทำให้เกิดการใช้งาน CPU มากที่สุด จากประสบการณ์ของเราหลังจากที่เราแก้ไขปัญหาด้วย I / O (โดยการปิด HT) เราระบุรหัสที่ทำงานได้อย่างน่ากลัวในปี 2008 R2 และทำได้ดีในปี 2005 ฉันเขียนถึงที่นี่ที่นี่

ในขณะที่มีภาระมากให้เรียกใช้ sp_whoisactive ของ Adam Machanic คุณสามารถดาวน์โหลดได้จากที่นี่ที่นี่เราประสบกับการใช้งาน CPU สูงมากเนื่องจากมีจำนวนลอจิคัลอ่านมากเกินไป (20 ล้านต่อการค้นหา) เนื่องจากแผนการที่แย่มาก กระบวนการของเราทำการต่อต้านการรวมกึ่งกับตารางที่มีการแบ่งพาร์ติชัน

คำแนะนำต่อไปของฉันคือการเรียกใช้ตัวสร้างโปรไฟล์เพื่อระบุชุดรหัส T-SQL ที่มีทั้ง CPU และ I / O ลอจิกอ่านสูง

ด้วยขั้นตอนข้างต้นเราสามารถปรับกระบวนการที่ผิดพลาดและเปลี่ยนจากการใช้งาน CPU อย่างต่อเนื่อง 85% ไปเป็นเกือบศูนย์

ขอให้โชคดีและโปรดส่งสายมาให้ฉันหากคุณพบวิธีแก้ไขเนื่องจากฉันต้องการเพิ่มเคสไว้ในบล็อกของฉัน

ขอบคุณ

ออสการ์


1
+1 สำหรับผู้สร้างโปรไฟล์ช่วยฉันได้หลายครั้งเมื่อมีการระบุปัญหา
Mark Henderson

+1 ขอบคุณสำหรับคำแนะนำทั้งหมดของคุณการปรับแต่ง SQL ของเราให้อยู่ในระดับที่เหมาะสมคือฝันร้ายทั้งหมดเราต้องพึ่งพา fulltext ค่อนข้างมากสำหรับการติดต่อกับแท็กเรามักจะมองหารายการของรายการในแท็กเฉพาะ ตั้งค่าและกรองลง ตัวอย่างเช่นการรับรายการคำถามด้วยแท็ก [x] และ [y] เรียงลำดับตามวันที่เกี่ยวข้องกับการดึงข้อมูลจำนวนมหาศาลจาก fulltext แล้วเข้าร่วมจำนวนมาก
Sam Saffron

เข้าใจ หยิบหนึ่งตัวอย่างและรันด้วยสถิติ IO ON และดูว่าคุณสามารถระบุตารางใด ๆ ด้วยการอ่านเชิงตรรกะมากที่สุด อีกครั้งเราทำได้ดีในปี 2005 และแย่มากในปี 2008 R2 หากคุณเพิ่งพบการใช้งาน CPU สูงและต้องรอ CXPACKET สูงลองแรกโดยการเพิ่มเกณฑ์ค่าใช้จ่ายสำหรับการขนาน 10, 15 หรือแม้กระทั่ง 20
ozamora

หากไม่มีสิ่งใดช่วยได้ให้ออฟไลน์ DB ปิด HT และไปจากที่นั่น ขอให้โชคดี
ozamora

sp_whoisactive เป็นเครื่องมือที่ยอดเยี่ยมมากชอบวิธีค้นหาที่คลิกได้
Sam Saffron

2

ไม่ว่า HT ดีหรือไม่ดีก็ยากที่จะปักลง

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

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

ฉันได้ลองกับ MAXDOP และตัวประมวลผลความเกี่ยวข้อง (ย้อนกลับไปในบทบาท DBA จริงล่าสุดของฉันใน SQL Server 2000) แต่ไม่สามารถหาข้อสรุปใด ๆ เลย: แต่สำหรับร้านค้าของฉันในเวลานั้น

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

อย่างไรก็ตามอย่างน้อยที่สุดคุณสูญเสียแกนกลางไปครึ่งหนึ่ง ทุกวันนี้อาจไม่สำคัญเมื่อเทียบกับสิ่งที่ฉันเล่นเมื่อไม่กี่ปีที่ผ่านมาตอนที่ 2 vs 4 หรือ 4 vs 8 ตอนนี้มันคือ 8 vs 16 หรือ 16 vs 32

แก้ไข: การทดสอบโดย Slava Oks


คือแกน 0-3 ทางกายภาพและตรรกะ 4-7? มันเป็นวิธีการทำงานอย่างไร เราไม่สามารถบอกได้และฉันไม่สามารถหาเครื่องมือใด ๆ เพื่อแจ้งให้ฉันทราบ ..
Jeff Atwood

2
@Jeff Atwood: ฉันจะหาเพิ่มเติมในภายหลัง ฉันได้อ่านมันที่ไหนซักแห่ง .... สำหรับตอนนี้: support.microsoft.com/kb/322385
gbn

บทความ KB นั้นผลรวมค่อนข้างมาก
pauska

แม้ว่าบทความ KB นั้นจะมีข้อมูลที่มีประโยชน์ แต่ก็ดูเหมือนจะไม่ตอบคำถามของ Jeff โดยตรงว่าตัวประมวลผลเชิงตรรกะถูกแมปกับตัวจริงอย่างไร สมองของฉันทอดยาวไปครึ่งทาง แต่หวังว่าบทความ INTEL นี้จะให้สิ่งที่คุณต้องใช้ในการทำแผนที่: software.intel.com/en-us/articles/…โปรดดูsoftware.intel.com/en-us/ บล็อก / 2009/12/21 / ...พร้อมลิงก์ที่เกี่ยวข้อง
BradC

@Jeff Atwood @BradC: Lordy หายาก ดูสิ่งนี้: มันขึ้นอยู่กับการแนะนำของ Intel SQL Server จะใช้การแจงนับ Windows พื้นฐานdownload.microsoft.com/download/5/7/7/… .
gbn

2

น่าเสียดายที่ฉันไม่คิดว่าคุณจะได้คำตอบที่ชัดเจนกว่านี้ "ลองปิดไฮเปอร์เธรดออกและดูว่ามันช่วยได้หรือไม่"

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

คำแนะนำของฉัน:

ลองเซิร์ฟเวอร์ระดับ MAX ระดับการขนานการตั้งค่าของ 1 Parallelism บน SQL นั้นมีประโยชน์มากที่สุดสำหรับการสืบค้นที่มีขนาดใหญ่กว่าและใช้งานได้นานกว่าและการโหลดของคุณ (ฉันถือว่า) ประกอบด้วยการสืบค้นที่เล็กกว่าจำนวนมาก นี่ควรกำจัด CXPACKET ทั้งหมดที่รอ สิ่งนี้อาจทำให้การสืบค้นแต่ละรายการทำงานได้นานขึ้นเล็กน้อย แต่ควรอนุญาตให้ "การรับส่งข้อมูล" ของการสืบค้นทั้งหมดบนเซิร์ฟเวอร์

ฉันมีผลลัพธ์ที่ดีในการทำเช่นนี้บนเซิร์ฟเวอร์ OLTP เซิร์ฟเวอร์ประเภทอื่น ๆ (เซิร์ฟเวอร์รายงานเซิร์ฟเวอร์ประมวลผลคลังข้อมูล) ต้องใช้ MAXDOP อย่างแน่นอน

และเพื่อให้ชัดเจนการตั้งค่านี้จะยังคงอนุญาตให้ SQL ใช้หลายเธรดสำหรับแต่ละตารางใน JOIN ดังนั้นคุณจะไม่กำจัดความขนานอย่างสิ้นเชิง

อย่างน้อยน่าลองเนื่องจากการเปลี่ยนแปลงการตั้งค่านี้จะมีผลทันทีและไม่ต้องการให้คุณเริ่มบริการ SQL อีกครั้ง: http://msdn.microsoft.com/en-us/library/ms181007.aspx
ซึ่งหมายความว่าคุณสามารถเปลี่ยนได้ มันจะกลับมาทันทีถ้าสิ่งต่าง ๆ เริ่มตกนรก

การปิดไฮเปอร์เธรดใน BIOS จะต้องมีการรีบู๊ตเซิร์ฟเวอร์แบบเต็มดังนั้นจึงมีความเสี่ยงมากกว่า


0

สำหรับบันทึกเรายังมีประสิทธิภาพที่ไม่ดีอย่างไม่คาดคิดหลังจากการอัพเกรดเซิร์ฟเวอร์ มันเป็นเพราะปัญหาเกี่ยวกับการประหยัดพลังงาน BIOS และ CPU การตั้งค่าเริ่มต้นบนเซิร์ฟเวอร์ (HP) คือการเพิกเฉยต่อการควบคุมระบบปฏิบัติการของความเร็ว CPU และใช้อัลกอริทึมของตัวเอง การเปลี่ยนสิ่งนี้เป็นการควบคุมระบบปฏิบัติการและการอัพเดต BIOS ส่งผลให้มีการปรับปรุงที่สำคัญ มีบันทึกย่อประจำรุ่น (ไม่สามารถค้นหาได้ในตอนนี้) ว่ามีข้อผิดพลาด BIOS ที่ล็อค CPU ที่สถานะประสิทธิภาพต่ำสุด

https://serverfault.com/a/196329/6390

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