Thursday, February 14, 2008

SQL Server Performance Tuning ตอนที่ 1 (Processor)

การวิเคราะห์ปัญหาจาก Processor


ตัว Counters ที่เกี่ยวข้องก็มี
ชื่อ Counter คำอธิบาย ค่าของ Counter

Object --> Processor(_Total)
- % Processor Time %ของเวลาที่ Processor busy Avg < 80 %
- % Privilege Time %ของเวลาที่ Processor ทำงานใน Privileged mode Avg < 10 %
Object --> System
- Processor Queue Length จำนวน request ที่รอคิว Processor อยู่ Avg < 2
- Context Switches/Sec อัตราการ Switch จาก Thread หนึ่งไปอีก Thread หนึ่ง Avg < 1000 per processor

ซึ่งมีรายละเอียดดังนี้

% Processor Time
ค่านี้ไม่ควรเกิน 80% เป็นเวลานาน ๆ ถ้าหากว่าค่า %Process Time สูงอย่างต่อเนื่อง ขณะที่ค่า Counter ของ Disk และ Network ต่ำอยู่ จะแสดงให้เห็นว่าเกิดคอขวดที่ Processor แต่ หาก %Processor Time อยู่ที่ 85% ขณะที่ % Disk Time อยู่ที่ 50% ลักษณะนี้จะดูเหมือนว่า CPU ส่วนใหญ่จะใช้เวลาไปกับการจัดการ Disk ซึ่งหากจะให้สรุปแน่นอน จะต้องดูค่า % Privileged Time ต่อไป ซึ่งในลักษณะนี้ เราควรที่จะแก้ไขปัญหาเรื่อง Disk ก่อน ซึ่งปัญหาเรื่อง Disk ก็อาจจะมาจากเรื่องของ Memory อีกทีหนึ่ง ดังที่ได้กล่าวไปแล้ว

%Privileged Time
ใน Windows นั้น Processor จะทำงานอยู่ 2 mode คือ user mode และ privileged mode (หรือ kernel mode) ซึ่งกิจกรรมต่าง ๆ ในระดับของ System เช่น disk access จะทำงานอยู่ใน Privileged mode ดังนั้น หากพบว่า % privileged time อยู่สูงกว่า 20-25% (ในเครื่องที่มีเฉพาะ SQL Server) นั้นจะหมายถึงว่า มีการใช้งาน I/O สูงมาก ซึ่งโดยปกติ %Privileged Time จะอยู่ที่ 5-10%

Process Queue Length
หมายถึงจำนวนของ Threads ที่อยู่ใน Processor Queue (จะมี Processor Queue แค่ Queue เดียวเท่านั้น ไม่ว่าจะมีกี่ตัวก็ตาม) ค่า Process Queue Length ที่สูงกว่า 2 อย่างต่อเนื่อง จะหมายถึงมีการใช้งาน Processor ที่สูง โดยปกติแล้วเราสามารถดูค่าการใช้งาน Processor ได้จาก %Processor Time อยู่แล้ว แต่ว่าค่า Process Queue Length จะช่วยยืนยันได้ว่ามีการใช้งานของ Processor ที่สูงจริง ( นอกจาก Processor ไม่ว่างทำงานตลอดแล้ว ยังมีงานรอ Queue ให้ทำอีก )

Context Switches /sec
ค่าควรอยู่ที่ประมาณ 300-1000 Context Switches/sec per processor ค่าที่สูงกว่านี้แสดงว่าเกิด page faults เนื่องจาก Memory ไม่พอ สำหรับค่าที่แสดงใน Counter นี้เป็นค่ารวมของทุก ๆ Processors รวมกัน

การแก้ปัญหาเรื่อง Processor
====================

1. Optimize Query โดยใช้ Profiler ทำการจับ Query ที่มี Workload ของ Processor สูง ๆ แล้วทำการแก้ไข

2. เพิ่มจำนวน Processor หรือ เปลี่ยนเป็น Processor ที่ทำงานได้เร็วขึ้น ซึ่ง
- หาก % Processor Time สูง แต่ Processor Queue Length ต่ำ ควรเปลี่ยนเป็น Processor ที่ทำงานเร็วขึ้น
- หาก % Processor Time สูง และ Processor Queue Length สูง ควรเพิ่มจำนวน Processor ให้มากขึ้น

3. อย่าเปิด Screen Save บน Server โดยเฉพาะอย่างยิ่งพวกที่ใช้ OpenGL

4. ใช้ Lightweight Pooling หรือ NT fibers ซึ่งจะช่วยลด Context Switches และเพิ่มประสิทธิภาพได้ หากว่าระบบอยู่ภายใต้เงื่อนไขทั้ง 3 ข้อนี้
- Server มี Processor หลายตัว อยู่แล้ว
- Processors ทุกตัวใช้งานเกือบเต็ม
- มี Context Switches มากกว่า 1000 per processor
Credit: insanity
Link: http://www.thaiadmin.org/board/index.php?topic=49494.0

No comments: