Bagaimana mungkin waktu tunggu lebih tinggi dari waktu jam?


15

Ketika saya melacak menunggu dengan sp_BlitzFirst, saya mendapatkan detail ini:

<?ClickToSeeDetails -- 
For 20 seconds over the last 5 seconds, SQL Server was waiting on this 
particular bottleneck.


 -- ?>

Haruskah itu membaca "selama 20 kali selama 5 detik terakhir?" Menemukan adalah CLR_SEMAPHORE.

Jawaban:


24

Statistik tidak - tunggu dapat (dan lebih sering daripada tidak, akan) total lebih dari waktu fisik yang dihabiskan untuk server itu sendiri.

Bayangkan sebuah situasi di mana 2 utas terpisah menghabiskan detik yang sama untuk beberapa sumber daya - Anda akan memiliki 2 detik waktu tunggu selama 1 detik waktu jam.

Setiap utas memiliki menunggu sendiri - pesan memberitahu Anda bahwa 20 detik waktu tunggu untuk sumber daya tertentu terjadi selama 5 detik terakhir dari waktu jam.

Atau dengan kata lain, setiap inti dapat menjalankan beberapa kueri pada saat yang sama, dan beberapa core dapat menambahkan lebih banyak lagi menunggu. Artinya, unit ini benar-benar thread · detik, bukan detik.


8

Mungkin juga bermanfaat untuk bekerja melalui contoh. Pertimbangkan tiga keadaan paling umum untuk seorang pekerja :

RUNNING = Pekerja saat ini berjalan baik secara nonpreemptive atau preemptively.

RUNNABLE = Pekerja siap berjalan pada penjadwal.

DITANGGUHKAN = Pekerja saat ini ditangguhkan, menunggu acara untuk mengirimkan sinyal.

Pekerja dengan status RUNNINGdapat menghasilkan waktu tunggu. Misalnya, jika pekerja perlu menjalankan kode di OS alih-alih dalam SQLOS maka itu dapat memasukkan menunggu preemptive atau eksternal. Selama waktu itu akan menjalankan kode pada CPU terkait tetapi masih akan menghasilkan waktu tunggu.

Pekerja dengan status RUNNABLEdapat menghasilkan waktu tunggu (sejauh yang saya tahu mereka selalu lakukan). Jika pekerja diberi sinyal bahwa sumber daya tersedia maka dapat mengumpulkan waktu tunggu sinyal berdasarkan pada menunggu terakhir. Jika pekerja kehabisan 4 ms kuantum sebelumnya maka dapat mengumpulkan SOS_SCHEDULER_YIELDwaktu tunggu.

Pekerja dengan status SUSPENDEDdapat menghasilkan waktu tunggu. Pertimbangkan seorang pekerja yang sedang menunggu kunci. Ini akan menghasilkan waktu tunggu hingga diberi tanda bahwa sumber daya kunci yang dibutuhkan tersedia. Beberapa pekerja yang ditangguhkan tidak menghasilkan waktu tunggu, termasuk yang tidak terkait dengan tugas.

Desktop saya memiliki empat core logis, sehingga jumlah pekerja maks default adalah 512 . Ini hampir tidak praktis, tetapi pada mesin ini saya secara teoritis dapat menghasilkan waktu tunggu 512 detik per detik jika saya berhasil membuat setiap pekerja menunggu sesuatu sekaligus. Seiring dengan bertambahnya jumlah pekerja inti / pekerja, jumlah itu bahkan bisa lebih tinggi.

Anda dapat melihat lebih dari satu detik menunggu per detik walaupun Anda tidak menjalankan kueri apa pun terhadap SQL Server. Di mesin saya, kueri berikut tampaknya menghasilkan antara 9-14 baris:

SELECT [state], last_wait_type, wait_started_ms_ticks
FROM sys.dm_os_workers
WHERE [state] IN ('SUSPENDED', 'RUNNABLE')
AND task_address IS NOT NULL
AND wait_started_ms_ticks <> 0
AND wait_started_ms_ticks >= start_quantum;

Saya dapat mengambil snapshot dari total waktu tunggu sejak terakhir kali saya me-restart server dan membandingkannya dengan total baru setelah menunggu sepuluh detik:

DECLARE @start_wait_time_ms BIGINT;

SELECT @start_wait_time_ms = SUM(wait_time_ms)
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

WAITFOR DELAY '00:00:10';

SELECT SUM(wait_time_ms) - @start_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type <> 'WAITFOR';

Terkadang matematika berhasil. Terakhir kali saya menjalankannya, delta adalah 101339 ms. Dengan kata lain, saya memiliki lebih dari 10 detik menunggu per detik hanya dari tugas-tugas sistem.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.