High / I / O Disk từ máy chủ sql hay là High / I / O làm chậm máy chủ sql?


18

Tôi đã tranh cãi với một DBA và một vài kẻ phần cứng về các vấn đề hiệu năng trên máy chủ SQL của chúng tôi. Thông thường mọi thứ đều ổn, tuy nhiên trong vài tuần qua chúng tôi đã có sự tăng vọt lớn trong máy chủ sql. Rõ ràng là SQL Server đang chờ trên I / O trên đĩa. Nhưng tôi tiếp tục nhận được thông báo rằng đó là SQL Server đang yêu cầu I / O cao bất thường. Đó không phải là trường hợp. Tôi có thể thấy từ những gì đang chạy mà không có gì khác thường, và tất cả các DBA quan tâm là những gì gây ra sự ngăn chặn và vân vân, điều đó là vô ích. Ví dụ, điều chính chúng ta thấy sao lưu là hoạt động trên cơ sở dữ liệu ASPState, mà chúng ta đang sử dụng để quản lý Trạng thái phiên ASP trên các máy chủ web. Các hoạt động này thường không bao giờ được nhìn thấy trên các kết quả hoạt động của Sp_who2 vì chúng xảy ra quá nhanh. Cơ sở dữ liệu ở chế độ phục hồi đơn giản và ghi nhật ký là bắt chước. Tuy nhiên, trong những lần tăng vọt này, chúng ta có thể thấy rất nhiều thao tác chọn và cập nhật trên cơ sở dữ liệu bị chặn hoặc chờ đợi. Tôi chắc chắn những gì đang xảy ra là ai đó hoặc một số công việc đang chạy thứ gì đó gây ra việc sử dụng đĩa băng trên các mảng đột kích được sử dụng cho các tệp dữ liệu và nhật ký cơ sở dữ liệu đó. Vấn đề đang chứng minh điều đó, vì không ai muốn thừa nhận họ đang làm điều gì đó đang giết chết trang web của chúng tôi.

Câu hỏi của tôi là bộ đếm hiệu suất hoặc bất cứ thứ gì tôi có thể đăng nhập sẽ giúp hiển thị rằng máy chủ SQL đang chờ trên I / O, nhưng không phải vì nó yêu cầu nhiều hơn bình thường, thay vào đó, việc sử dụng đĩa là bận để đáp ứng các yêu cầu từ máy chủ sql nhanh như bình thường?


3
Trạng thái chờ đợi nào bạn thực sự nhìn thấy, Mạng I / O? tức là bạn đang sử dụng SAN?
Eric Higgins

Kiểm tra xem bạn có bất kỳ truy vấn nào đang chi phối việc sử dụng tài nguyên trên máy chủ DB không. Nếu có, hãy thử điều chỉnh những cái đó. Nếu bạn không có bất kỳ truy vấn nào có hành vi xấu, thì chờ đợi PAGEIOLATCH cao thường cho biết hệ thống của bạn bị ràng buộc I / O. Ngoài ra, như @EricHiggins nói, SAN thường chậm và gây ra các vấn đề về hiệu suất với cơ sở dữ liệu.
Mối quan tâmOfTunbridgeWells

Đó là một mảng NETAPP được kết nối với máy chủ sql với HBA sợi Qlogic.
Edgey

Tôi biết đây là một câu hỏi tương đối cũ và điều này sẽ không trực tiếp khắc phục sự cố của bạn ... nhưng chúng tôi đã chuyển sang aspnet_state.exe cho trạng thái phiên và thấy rất nhiều máy chủ SQL của chúng tôi. Nó không được ghi chép tốt nhưng khá dễ cài đặt.
MattGWagner

Vì vậy, cuối cùng bạn / DBA đã làm gì và vấn đề là gì?
Mukus

Câu trả lời:


19

Có một cái nhìn vào quầy perfmon sau đây:

Máy chủ SQL điều khiển một số lượng lớn yêu cầu IO sẽ được chứng thực bằng số lần quét cao, tăng lượt tra cứu trang và đọc trang và chờ đợi chốt trang cao. Rất đáng để thửsys.dm_exec_query_stats các mục có số lần đọc vật lý cao. Họ có thể nhanh chóng xác định thủ phạm.

Nói chung, tiếp cận vấn đề như một vấn đề xử lý sự cố hiệu năng, tuân theo một phương pháp như Chờ đợi và Xếp hàng là cách tiếp cận đúng. DBA của bạn dường như đang làm điều đúng đắn vì vậy bạn nên lắng nghe anh ấy.


Tôi không có vấn đề gì với DBA, anh ấy là một trong những DBA giỏi nhất tôi từng làm việc cùng. Và anh ấy đưa cho tôi một danh sách các thủ tục lưu trữ bị chặn cao. Nhưng như tôi đã đề cập, một trong những procs đang gây ra nhiều sự ngăn chặn là "TempUpdateStateItemLong", đây là một Proc được sử dụng bởi kho lưu trữ trạng thái SQL hte. Đó là một MS Proc và nó chỉ cập nhật một bảng duy nhất bởi sessionID là khóa chính được lập chỉ mục trên bảng. Ngoài ra, nhiều nhất bảng này có 2000-3000 hồ sơ, vì vậy các cập nhật thực sự không mất thời gian.
Edgey

Đây là một nơi tốt để bắt đầu. Chúng tôi vẫn đang chạy SQL Server 2000, chúng tôi đang trong quá trình nâng cấp nhưng điều đó sẽ không xảy ra trong vài tháng nữa, vì vậy tôi không có bộ đếm chờ PAge IO Latch để xem xét. Cảm ơn một lần nữa.
Edgey

Lưu ý rằng việc chặn per-se không có nghĩa là IO cao. Đó có thể là sự tranh chấp khóa và điều đó sẽ ảnh hưởng đến bảng bất kể kích thước, đặc biệt nếu trình tối ưu hóa chọn kế hoạch quét bảng.
Remus Rusanu

Và cũng kiểm tra Quy trình cho IO Data Bytes/secvà xem nếu một số quy trình khác đang dọn đĩa.
Remus Rusanu

12

Để bắt đầu sử dụng truy vấn Chẩn đoán của Glenn Berry và SP_Whoisactive của Adam Machanic để tìm hiểu điều gì đang thực sự xảy ra.

Trước tiên hãy xem tệp cơ sở dữ liệu nào có nút cổ chai IO nhất bằng cách chạy truy vấn này (Truy vấn của Glenn Berry)

SELECT  DB_NAME(fs.database_id) AS [Database Name] ,
        mf.physical_name ,
        io_stall_read_ms ,
        num_of_reads ,
        CAST(io_stall_read_ms / ( 1.0 + num_of_reads ) AS NUMERIC(10, 1)) AS [avg_read_stall_ms] ,
        io_stall_write_ms ,
        num_of_writes ,
        CAST(io_stall_write_ms / ( 1.0 + num_of_writes ) AS NUMERIC(10, 1)) AS [avg_write_stall_ms] ,
        io_stall_read_ms + io_stall_write_ms AS [io_stalls] ,
        num_of_reads + num_of_writes AS [total_io] ,
        CAST(( io_stall_read_ms + io_stall_write_ms ) / ( 1.0 + num_of_reads
                                                          + num_of_writes ) AS NUMERIC(10,
                                                              1)) AS [avg_io_stall_ms]
FROM    sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
        INNER JOIN sys.master_files AS mf WITH ( NOLOCK ) ON fs.database_id = mf.database_id
                                                             AND fs.[file_id] = mf.[file_id]
ORDER BY avg_io_stall_ms DESC
OPTION  ( RECOMPILE );

Sau đó chạy truy vấn này để xem mười sự kiện hàng đầu mà máy chủ của bạn đang chờ đợi (truy vấn của Jonathan Kehayias ). Bạn cũng sẽ tìm thấy truy vấn tương tự từ các truy vấn chẩn đoán Glenn Berry.

SELECT TOP 10
        wait_type ,
        max_wait_time_ms wait_time_ms ,
        signal_wait_time_ms ,
        wait_time_ms - signal_wait_time_ms AS resource_wait_time_ms ,
        100.0 * wait_time_ms / SUM(wait_time_ms) OVER ( ) AS percent_total_waits ,
        100.0 * signal_wait_time_ms / SUM(signal_wait_time_ms) OVER ( ) AS percent_total_signal_waits ,
        100.0 * ( wait_time_ms - signal_wait_time_ms )
        / SUM(wait_time_ms) OVER ( ) AS percent_total_resource_waits
FROM    sys.dm_os_wait_stats
WHERE   wait_time_ms > 0 -- remove zero wait_time
        AND wait_type NOT IN -- filter out additional irrelevant waits
( 'SLEEP_TASK', 'BROKER_TASK_STOP', 'BROKER_TO_FLUSH', 'SQLTRACE_BUFFER_FLUSH',
  'CLR_AUTO_EVENT', 'CLR_MANUAL_EVENT', 'LAZYWRITER_SLEEP', 'SLEEP_SYSTEMTASK',
  'SLEEP_BPOOL_FLUSH', 'BROKER_EVENTHANDLER', 'XE_DISPATCHER_WAIT',
  'FT_IFTSHC_MUTEX', 'CHECKPOINT_QUEUE', 'FT_IFTS_SCHEDULER_IDLE_WAIT',
  'BROKER_TRANSMITTER', 'FT_IFTSHC_MUTEX', 'KSOURCE_WAKEUP',
  'LAZYWRITER_SLEEP', 'LOGMGR_QUEUE', 'ONDEMAND_TASK_QUEUE',
  'REQUEST_FOR_DEADLOCK_SEARCH', 'XE_TIMER_EVENT', 'BAD_PAGE_PROCESS',
  'DBMIRROR_EVENTS_QUEUE', 'BROKER_RECEIVE_WAITFOR',
  'PREEMPTIVE_OS_GETPROCADDRESS', 'PREEMPTIVE_OS_AUTHENTICATIONOPS', 'WAITFOR',
  'DISPATCHER_QUEUE_SEMAPHORE', 'XE_DISPATCHER_JOIN', 'RESOURCE_QUEUE' )
ORDER BY wait_time_ms DESC

Một khi bạn có thông tin này trong tay, việc khắc phục sự cố sẽ dễ dàng hơn nhiều.

BTW bạn có thể tìm thấy nhiều bài viết về cách sử dụng sp_whoisactive để khắc phục sự cố tại đây.


1
Tôi chỉ sử dụng kịch bản cuối cùng trong danh sách này - ass kick của nó.
the_good_pony

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.