Tóm tắt
Microsoft SQL Server 2005 sử dụng bộ đếm CPU độ phân giải cao để cung cấp các chức năng định giờ micro giây. Một micro giây là một phần triệu của giây (hoặc một phần nghìn của một mili giây). Tuy nhiên, các giá trị định thời gian SQL Server có thể không chính xác nếu bạn sử dụng các công nghệ thay đổi tần số CPU. Ví dụ: sự cố này có thể xảy ra khi bạn sử dụng bất kỳ công nghệ nào sau đây:
- Nhảy bước CPU
- Công nghệ AMD Cool'n'Quiet
- Sơ đồ năng lượng khác nhau
Bài viết này chứa các phương pháp và thông tin bổ sung để giúp bạn giải quyết vấn đề này.
Triệu chứng
Khi bạn sử dụng câu lệnh SET STATISTICS TIME để hiển thị thời gian thực thi, phân tích cú pháp và biên dịch máy chủ, bạn có thể nhận được các giá trị không chính xác. Ví dụ: bạn có thể nhận thấy rằng thời gian thực thi SQL Server đã trôi qua lâu hơn nhiều so với thời gian CPU. Sự cố này có thể ảnh hưởng đến độ chính xác của việc điều chỉnh hiệu suất. Sự cố này xảy ra khi bạn sử dụng một trong các công nghệ được liệt kê trong phần "Tóm tắt" trên máy chủ.
Nguyên nhân
Sự cố này xảy ra vì tần số CPU bị thay đổi khi bạn sử dụng các công nghệ này. SQL Server 2005 sử dụng bộ đếm CPU độ phân giải cao để cung cấp các chức năng định giờ micro giây. Nếu tần số CPU được thay đổi để tiết kiệm năng lượng và giảm tản nhiệt, thời lượng được tính toán có thể không chính xác.
Giải pháp
Thông tin gói dịch vụ
Để giải quyết sự cố này, hãy tải gói dịch vụ mới nhất dành cho SQL Server 2005. Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
913089 Cách lấy gói dịch vụ mới nhất cho SQL Server 2005
Lưu ý Trong SQL Server 2005 Gói Dịch vụ 3 và các gói dịch vụ mới hơn, tem thời gian của bộ xử lý không được sử dụng. Các phiên bản SQL Server 2005 này sử dụng bộ hẹn giờ đáng tin cậy hơn có độ chính xác tối đa là 1 mili giây.
Trạng thái
Sự cố này được khắc phục lần đầu ở SQL Server 2005 Gói Dịch vụ 3.
Giải pháp thay thế
SQL Server 2005 yêu cầu các điểm dữ liệu ổn định và đã biết để thực hiện điều chỉnh hiệu suất chính xác. Nếu điều chỉnh tần số CPU động được bật trên máy tính, bạn có thể tắt chúng để CPU duy trì tốc độ tần số ổn định trước khi bạn bắt đầu theo dõi và điều chỉnh hiệu suất SQL Server. Để thực hiện việc này, hãy sử dụng các phương pháp sau đây.
Đặt cấu hình hệ thống nguồn trên máy tính để buộc CPU duy trì ở tần số tối đa
Để thực hiện điều này, hãy làm theo các bước sau:
Bấm vào Bắt đầu, bấm Chạy, nhập Powercfg.cpl, rồi bấm OK.
Trong hộp thoại Thuộc tính Tùy chọn Nguồn , bấm Luôn Bật trong danh sách Sơ đồ nguồn .
Bấm vào OK.
Có thể xảy ra sự trôi. Độ lệch là sự phân kỳ giữa các giá trị tần số CPU. Để biết thêm thông tin, hãy xem phần "Drift". Trong trường hợp này, bạn phải khởi động lại Microsoft Windows để đồng bộ hóa lại tần số của tất cả các CPU sau khi bạn thay đổi hệ thống nguồn.
Nếu bạn không thể khởi động lại máy tính, hãy bật mối quan hệ với bộ xử lý SQL Server để ngăn các luồng công việc của SQL Server di chuyển giữa các CPU. Khi thực hiện việc này, bạn không cần phải khởi động lại máy tính ngay cả khi xảy ra sự phân kỳ giữa các giá trị tần số CPU. Để bật yêu cầu bộ xử lý SQL Server cho tất cả CPU trên máy chủ, bạn phải sử dụng một dấu hiệu khác, tùy thuộc vào số bộ xử lý lô-gic trên máy chủ.
Bảng sau liệt kê các kịch bản ví dụ.
| Số CPU | Các câu lệnh để kích hoạt mối quan hệ của bộ xử lý |
|---|---|
| 02 CPU | exec sp_configure 'Affinity Mask', 0x00000003 GO đặt cấu hình lại GO |
| 04 CPU | exec sp_configure 'Affinity Mask', 0x0000000F GO đặt cấu hình lại GO |
| 08 CPU | exec sp_configure 'Affinity Mask', 0x000000FF GO đặt cấu hình lại GO |
| 16 CPU | Exec sp_configure 'Affinity Mask', 0x0000FFFF GO đặt cấu hình lại GO |
| 32 CPU | exec sp_configure 'Affinity Mask', 0xFFFFFFFF GO đặt cấu hình lại GO |
Lưu ý: Có thể không đủ để tắt các tính năng biến đổi tần số của CPU ở cấp BIOS. Các tiện ích khác nhau của bên thứ ba có thể thay đổi tần số CPU. Một số triển khai cho phép điều chỉnh tần số ngay cả khi CPU đang ở dưới cài đặt sơ đồ công suất tối đa. Trong trường hợp này, bạn phải tắt các tiện ích của bên thứ ba này khi thực hiện tinh chỉnh hiệu suất trong SQL Server 2005.
Sử dụng các tiện ích và trình điều khiển của bên thứ ba để đồng bộ hóa tần số CPU và bộ đếm đồng hồ CPU
Trong một số trường hợp hiếm hoi, hệ thống có thể yêu cầu nhà sản xuất cập nhật để khắc phục sự cố tần số CPU. Cách tốt nhất là kiểm tra hệ thống để tìm bản cập nhật BIOS, vi mã và vi chương trình mới nhất nếu bạn nghi ngờ rằng hệ thống có thể gặp sự cố.
Xem thêm thông tin
Microsoft SQL Server 2000 và các phiên bản trước của SQL Server sử dụng cơ chế thời gian Windows. Cơ chế định thời gian sử dụng các giá trị chính xác mili giây. Thông thường, độ chính xác này là 10 đến 15 ms. Tuy nhiên, độ chính xác có thể lớn đến 55 ms. Các truy vấn SQL Server thường hoàn tất trong khoảng thời gian mili giây hoặc micro giây. Độ chính xác này yêu cầu bộ hẹn giờ có độ phân giải cao. Do đó, các phiên bản SQL Server này báo cáo khoảng thời gian của một số truy vấn là 0 ms. Do đó, rất khó để giám sát hiệu suất và điều chỉnh hiệu suất SQL Server trong các phiên bản SQL Server cũ hơn.
SQL Server 2005 cải thiện độ chính xác bằng cách sử dụng bộ đếm CPU có độ phân giải cao để cung cấp khả năng định giờ micro giây. Khi bạn sử dụng những công nghệ được liệt kê trong phần "Tóm tắt", các giá trị định thời gian được báo cáo có thể không chính xác.
Sự cố này có thể ảnh hưởng đến các đối tượng và tính năng sau:
Theo dõi sự kiện:
Sự kiện Sự chú ý
Các sự kiện trong nút Thủ tục Đã lưu trữ
Các sự kiện trong nút TSQL
Các sự kiện trong nút Đối tượng
Các sự kiện trong nút Giao dịch
Dạng xem quản lý động:
sys.dm_exec_query_stats
sys.dm_exec_requests
sys.dm_exec_sessions
sys.dm_io_pending_io_requests
sys.dm_os_ring_buffers
sys.dm_os_sys_info
sys.dm_io_virtual_file_stats
sys.dm_os_wait_stats
Câu lệnh SET STATISTICS TIME
Bảng hệ thống sysprocesses
Sau khi bạn cài đặt SQL Server 2005 Gói Dịch vụ 2 (SP2), SQL Server sẽ ghi lại thông báo lỗi trong nhật ký lỗi khi SQL Server phát hiện bộ hẹn giờ độ phân giải cao không đồng bộ giữa các CPU. Thông báo lỗi cho biết thời gian hiệu năng có thể không chính xác và người dùng nên thận trọng khi sử dụng dữ liệu hiệu năng.
Nội dung của thông báo lỗi giống với một trong các thông báo lỗi sau đây:
Thông báo lỗi 1
Lưu ý
Bộ đếm dấu thời gian của CPU trên id lập lịch 2 không được đồng bộ hóa với các CPU khác.
Thông báo lỗi 2
Lưu ý
Tần suất tem thời gian của CPU đã thay đổi từ 191469 sang 1794177 tick trên mỗi mili giây. Tần suất mới sẽ được sử dụng
SQL Server sử dụng lệnh Bộ đếm Dấu Thời gian Thực (RDTSC) để lấy số tick CPU 64 bit. Bạn có thể chia giá trị này cho tần số CPU để chuyển đổi giá trị này thành giá trị mili giây. Sự thay đổi thời gian có thể xảy ra khi tần số CPU thay đổi hoặc xảy ra sự thôi.
Nhảy bước CPU
Nhảy bước của CPU được định nghĩa là sự thay đổi có chủ ý về tần số CPU. Bước CPU có thể còn được gọi là công nghệ Intel SpeedStep hoặc AMD PowerNow! công nghệ. Khi thực hiện bước của CPU, tốc độ CPU có thể tăng hoặc giảm với gia số nhỏ nhất là 50 MHz để tiết kiệm năng lượng và giảm tỏa nhiệt. Các CPU nằm trong cùng một nút truy cập bộ nhớ không đồng nhất (NUMA) không điều chỉnh tần số một cách độc lập.
Bảng sau đây minh họa cách thay đổi bước của CPU có thể ảnh hưởng đến việc tính toán thời gian.
| Hành động | RDTSC Ticks | Tick trên mili giây (Tần suất) | Thời gian đồng hồ treo tường |
|---|---|---|---|
| Chạy lô | 1 | 200 | 0 |
| Tần suất Đi xuống | 200 | 100 | 1 mili giây |
| Lô Kết thúc | 500 | 3 mili giây | |
| TỔNG CỘNG | 500 | 4 mili giây |
SQL Server ghi lại các tick RDTSC ở cả tick RDTSC bắt đầu và kết thúc. Sau đó, SQL Server chia các tick cho giá trị tần suất.
Trong ví dụ này, các tính toán thời gian sau đây sẽ xảy ra khi bạn sử dụng giá trị tần số 200 hoặc 100:
Tần số 200: 500/200 = 2,5 ms
Tần số 100: 500/100 = 5 ms
Cả hai tính toán thời gian đều không khớp với thời gian thực tế của đồng hồ treo tường là 4 ms.
Nếu phép tính này được sử dụng trong sự kiện theo dõi RPC:Completed, cột dữ liệu thời lượng và thời gian kết thúc sẽ được báo cáo không chính xác. Sự kiện RPC:Completed ghi lại thời gian đồng hồ tường bắt đầu và số tick CPU. Để có được thời gian có độ phân giải cao hơn so với nguồn cung cấp của Windows trong SQL Server 2005, các cột dữ liệu thời lượng và thời gian kết thúc trong theo dõi SQL Server được tính toán bằng cách sử dụng số tick CPU đã qua. Cột thời gian kết thúc được tính toán bằng cách thêm cột thời gian vào cột thời gian bắt đầu. Trong ví dụ này, cột thời gian kết thúc được tính toán bằng cách thêm không chính xác 2,5 ms hoặc 5 ms vào thời gian bắt đầu.
trôi dạt
Trôi là sự phân kỳ trong giá trị đồng hồ CPU. Các hệ thống có nhiều CPU có thể tạo ra các giá trị đồng hồ CPU khác nhau cho cùng một thời điểm. Mặc dù điều này không phổ biến, nhưng CPU có thể gặp phải tình trạng tách đồng hồ theo thời gian.
Ví dụ sau đây minh họa cách thay đổi độ trôi có thể ảnh hưởng đến kết quả của cột dữ liệu thời lượng trong theo dõi SQL Server. Ví dụ này giả định rằng tần số CPU duy trì ổn định ở mức 200 ticks mỗi mili giây. Bảng sau đây minh họa các sự kiện trong kịch bản này.
| Hành động | CPU đã lên lịch của Windows | CPU 1 RDTSC | CPU 2 RDTSC | Thời gian đồng hồ treo tường |
|---|---|---|---|---|
| Chạy lô | 1 | 100 | 1100 | 0 |
| Lô Kết thúc | 2 | 900 | 1900 | 4 mili giây |
| TỔNG CỘNG | 4 mili giây |
SQL Server ghi lại các tick RDTSC ở cả điểm bắt đầu và điểm kết thúc. Sau đó, SQL Server chia tick RDTSC cho giá trị tần suất. Trong ví dụ này, Windows đã lên lịch chuỗi hội thoại công việc SQL Server trên hai CPU khác nhau. Luồng nhân viên của SQL Server phục vụ lô đầu tiên chạy trên CPU đầu tiên (CPU 1).
Tuy nhiên, thực hiện lô đã bị gián đoạn tại một thời điểm nào đó và SQL Server đã gửi thực hiện lô đến hàng đợi đang chờ xử lý. Khi SQL Server gửi luồng công việc SQL Server phục vụ lô này đến hàng đợi có thể chạy một lần nữa, Windows đã gửi luồng để chạy trên CPU thứ hai (CPU 2). Chuỗi công việc SQL Server đã chạy hoàn tất trên CPU 2. Do sự trôi của CPU, giá trị tick kết thúc được thu thập từ CPU 2 là 1900 thay vì 900. Bạn có thể tránh hành vi này nếu bạn bật mối quan hệ với bộ xử lý SQL Server.
Các tính toán thời gian sau đây được sử dụng trong ví dụ này:
- Giá trị không chính xác nhưng được báo cáo: (1900 – 100 = 1800) / 200 = 9 ms
- Giá trị chính xác: (900 - 100 = 800) / 200 = 4 ms
Giá trị của cột thời lượng cho sự kiện RPC:Completed sẽ được báo cáo là 9 ms thay vì 4 ms. Kết quả này cao hơn gấp đôi giá trị chính xác 4 ms.
Thông báo cảnh báo trôi dạt được thêm vào SQL Server 2005 để cho biết rằng đầu ra hiệu năng được đề cập trước đó có thể không đáng tin cậy. Trong một số tình huống không được phát hiện, SQL Server 2005 SP2 có thể báo cáo thông báo cảnh báo về những điều sau:
- Thông báo cảnh báo trôi sai
- Độ trôi có thể trở thành hàng chục mili giây mà không gây ra hiệu ứng hệ thống đáng chú ý
Bạn phải cẩn thận khi đánh giá đầu ra liên quan đến hiệu suất và khi bạn so sánh đầu ra liên quan đến hiệu suất với thời gian đồng hồ treo tường. Nếu không có dấu hiệu của các vấn đề hiệu suất khác, bạn thường có thể bỏ qua thông báo cảnh báo lệnh. Ví dụ: thông thường, bạn có thể bỏ qua các thông báo cảnh báo trôi trong các trường hợp sau:
- Các quy trình đang chạy như dự kiến.
- Các truy vấn SQL Server không chạy theo kiểu thời gian lạ.
- Bạn không thấy dấu hiệu của các nút thắt cổ chai khác.
Tuy nhiên, trước khi bỏ qua thông báo cảnh báo trôi, chúng tôi khuyên bạn nên liên hệ với nhà sản xuất để đảm bảo rằng không có sự cố RDTSC đã biết nào tồn tại.
Bạn có thể sử dụng cờ theo dõi 8033 (–T8033) để quay lại hành vi báo cáo trong phiên bản phát hành gốc của SQL Server 2005 và trong SQL Server 2005 SP1. Phiên bản phát hành gốc của SQL Server 2005 và SQL Server 2005 SP1 không báo cáo thông báo cảnh báo lệnh. Nếu bạn đang chạy phiên bản phát hành gốc của SQL Server 2005 hoặc SQL Server 2005 SP1 mà không gặp sự cố, thông thường bạn có thể bỏ qua các thông báo.
Tại sao câu lệnh WAITFOR DELAY hoạt động chính xác? Còn các quy trình hệ thống tuần hoàn thì sao?
Cơ chế hết thời gian chờ không bị ảnh hưởng bởi thiết kế độ phân giải cao. SQL Server không sử dụng bộ hẹn giờ độ phân giải cao cho các hoạt động dựa trên bộ hẹn giờ. Một số hoạt động hết thời gian chờ được dựa trên bộ hẹn giờ độ phân giải giảm sử dụng hàm GetTickCount. Những hoạt động hết thời gian chờ này bao gồm hết thời gian chờ khóa, câu lệnh WAITFOR DELAY và phát hiện đình trệ.
Để biết thêm thông tin, hãy bấm vào số bài viết sau đây để xem bài viết trong Cơ sở Kiến thức Microsoft:
938448 Máy chủ chạy Windows Server 2003 có thể gặp phải tình trạng chênh lệch bộ đếm dấu thời gian nếu máy chủ sử dụng bộ xử lý AMD Opteron lõi kép hoặc bộ xử lý AMD Opteron đa bộ xử lý
895980 Các chương trình sử dụng hàm QueryPerformanceCounter có thể hoạt động kém trong Windows Server 2003 và trong Windows XP
Các sản phẩm của bên thứ ba thảo luận trong bài viết này được sản xuất bởi những công ty độc lập với Microsoft. Microsoft không đưa ra sự đảm bảo, dù là ngụ ý hay theo một hình thức khác, về hiệu suất hoặc mức độ tin cậy của những sản phẩm này.