mengapa io_stall_writes_ms jauh lebih tinggi untuk tempdb?

11

Kami memiliki file data pengguna dan sistem pada drive disk yang sama. (Io_stall_write_ms / (1.0 + num_of_writes)) di bawah 2 untuk file pengguna tetapi file tempdb biasanya lebih dari 400. Saya melihat itu pada beberapa server dan saya ingin tahu apakah ada alasan untuk menulis ke tempdb lebih lama dari file data database biasa.

SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result, 
io_stall_write_ms, num_of_writes, 
fs.database_id, 
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]

Terima kasih,


sumber
1
Menggunakan snapshot atau RCSI? tempdb pada array / drive yang sama dengan file data / log? Berapa banyak yang menulis ke tempdb dibandingkan dengan file lain? Statistik itu sendiri agak tidak berarti tanpa konteks di mana itu terjadi.
Mark Storey-Smith

Jawaban:

17

Jawaban Singkat: Melihat kedai IO yang lebih tinggi mungkin atau mungkin tidak menjadi masalah dalam dirinya sendiri. Anda perlu melihat informasi lebih lanjut untuk menyelesaikan jika Anda memiliki masalah. Tampaknya memang agak tinggi, tetapi apakah Anda menderita? Jika demikian, itu mungkin karena sistem IO Anda tidak menangani beban dengan benar (karena tidak bisa, karena Anda memiliki semuanya di satu drive atau alasan lain) atau Anda melakukan terlalu banyak di TempDB (mengubah masalah pertama - kinerja IO - mungkin merupakan perbaikan yang lebih mudah dan lebih efisien, tetapi pertama-tama tentukan jika Anda memiliki masalah)

Diskusi / jawaban yang lebih panjang:

Ada dua pertanyaan yang dimainkan di sini -

1.) Apa yang harus saya lakukan ketika saya melihat Warung IO tinggi?

Pertama, "tinggi" ada di mata yang melihatnya. Jika Anda bertanya kepada 10 DBA apa "terlalu tinggi" untuk warung IO Anda mungkin akan mendapatkan 2-3 jawaban berbeda dengan angka di dalamnya, 5-6 jawaban "Itu tergantung" dan satu tatapan kosong. Asumsi saya adalah rata-rata 400 ms berpotensi terlalu tinggi di sini, terutama ketika DB lain 2ms atau lebih rendah untuk waktu tunda rata-rata.

Terlepas dari database mana yang melihat warung tinggi, Anda harus mendekatinya dengan cara yang sama. Kios IO adalah seperti apa itu ... Permintaan IO memakan waktu lebih lama dari yang diharapkan .. Mengulur. Ini terjadi. Mereka terjadi setiap saat dalam suatu sistem dengan sumber daya dibagikan dan sumber daya terbatas (benar-benar semua sistem kami). Mereka menjadi masalah ketika kios menjadi masalah kinerja atau menyebabkan mereka. Jadi saya percaya bahwa Anda melihat di sini sebagai bagian proaktif dari pemantauan atau karena Anda mengalami masalah kinerja yang Anda selesaikan. Kami juga tidak ingin tersesat hanya di warung IO. Kami melihat potongan puzzle dan bukan gambaran besarnya. Mungkin merepotkan untuk hanya melihat statistik menunggu atau statistik file karena SQL terakhir kali dinyalakan kembali karena Anda melihat setiap saat dan beberapa jendela pemeliharaan atau jendela beban berat dapat membuat konter miring. Jadi pastikan Anda melihat gambar lengkapnya.

Tetapi ketika saya menduga saya memiliki masalah kinerja disk atau melihat sesuatu dalam kueri seperti ini, saya biasanya mengikuti proses yang terlihat seperti:

  1. Lihatlah statistik menunggu di server. @swasheck membagikan tautan yang bagus sebagai komentar dalam jawaban di bawah ini. Ini membawa Anda ke posting Paul Randal tentang melihat dan menganalisis statistik tunggu di SQL Server. Pergi kesana. Apa jenis menunggu yang Anda lihat? Apakah Anda melihat menunggu terkait dengan kinerja IO ( PAGEIOLATCH_*, IO_COMPLETION, WRITELOG, dll?). Jika Anda melakukan ini adalah indikasi lain bahwa Anda memiliki beberapa masalah kinerja terkait IO, seperti halnya kios IO. Tapi itu memberi Anda bentuk perjanjian lain di sini.
  2. Lihatlah kinerja IO. Secara khusus, lihat ke dalam perfmon di Physical Disk:Avg Disk Sec/Readdan Avg Sec Disk Sec/Writecounter. Ini mengukur latensi Anda. Tonton penghitung ini selama periode waktu yang disimpan ke file log kinerja. Apa yang Anda lihat rata-rata? Jika Anda melihat angka lebih dari 0,020 detik (20 ms) ini bisa menjadi masalah. Jika Anda melihat angka lebih dari 40-50ms, rata-rata atau lebih tinggi merupakan indikasi masalah yang lebih jelas. Juga lihat paku Anda? Seberapa tinggi mereka pergi dan berapa lama mereka bertahan? Jika Anda melihat lonjakan ke dalam ratusan ms dan mereka bertahan selama puluhan atau skor detik atau lebih dan / atau sering terjadi Anda lebih cenderung memiliki masalah dengan kinerja IO Anda untuk beban kerja Anda.
  3. Lihatlah pengaturan IO Anda. Apa itu? Disk lokal? SAN? Array penyimpanan? Seperti apa seluruh dan TIO yang harus Anda lihat dari ini? Apakah itu cukup untuk apa yang Anda coba lakukan? Anda mungkin terlalu kecil ukuran IO Anda untuk beban kerja Anda. Jangan hanya melihat spindel fisik Anda, pengaturan RAID, dll. Lihatlah jalur Anda ke disk Anda. Apakah Anda mendorong semuanya melalui tautan 1GB tunggal yang Anda bagikan dengan banyak lalu lintas lainnya? Dapatkah Anda melihat metrik kinerja disk dari perspektif penyimpanan.

( Catatan: untuk analisis statistik tunggu ini dan analisis perfmon - lihat berbagai periode dan jenis penggunaan. Apakah Anda memiliki statistik penggunaan yang berbeda di malam hari daripada yang Anda lakukan di siang hari? Jendela pemrosesan batch? Jendela perawatan di mana Anda membangun kembali banyak indeks? Lihatlah alat-alat ini selama masing-masing periode ini dan pahami apa yang Anda lihat untuk masing-masing periode)

Pertimbangan kinerja IO lain di sini -

  • Anda mengatakan DB sistem dan DB Pengguna dibagikan. Apakah ini produksi? Jika demikian, itu tidak selalu merupakan skenario terbaik. Apakah Anda juga berbagi file log dan file data pada drive yang sama? Itu juga bukan skenario terbaik. Apa lagi yang membagikan penyimpanan ini? Di dunia di mana Anda khawatir tentang spindle dan grup raid dan disk dan harus membuat keputusan tentang siapa yang mendapatkan disk berkinerja terbaik, saya cenderung (sebagai aturan umum .. yang tidak bagus untuk dimiliki di dunia DB tapi yang ini cenderung benar) berjalan dengan yang tercepat dan paling berdedikasi untuk TempDB (lebih lanjut tentang itu di bawah), lalu file log, lalu file data. Di dunia di mana Anda memiliki tumpukan disk pada perangkat seperti NetApp, Dell Equal Logic atau EMC VNX, dll. Anda tidak

2.) Apa beberapa alasan TempDB bisa lebih tinggi?

Jadi TempDB adalah database dan dapat memiliki warung IO seperti database lain seperti yang baru saja saya bahas. Tapi apa saja alasan TempDB bisa membaca lebih tinggi? (tidak lengkap, saya menyambut penambahan atau pemikiran dalam suntingan, jawaban atau komentar lain) -

  1. Karena kode Anda - Apakah Anda sering menggunakan TempDB dalam kode Anda? Banyak tabel temp dan variabel tabel dibuat dan dihancurkan? Melakukan banyak hal di TempDB seperti ini? Itu tidak buruk atau bagus tentu saja, tetapi Anda mungkin melihat itu dan memahami pola penggunaan TempDB Anda.
  2. TempDB adalah pekerja keras bersama - TempDB adalah salah satu database yang digunakan sebagai ruang sementara untuk objek sementara yang ditentukan pengguna dan berbagai tabel kerja dan operasi yang digunakan oleh seluruh instance SQL Anda. Berapa banyak DB pengguna? Jenis pekerjaan apa yang Anda lihat secara umum? TempDB adalah salah satu sumber daya untuk berbagi semua hal.
  3. Kueri tidak efisien dan memori tidak mencukupi - Mungkin ada kueri yang tidak menggunakan indeks cukup ketat atau sedang melakukan pemindaian besar dan operasi pengurutan. Operasi hash besar, dan memori pada server tidak cukup untuk ini. Operasi ini akan "tumpah" ke TempDB sebagai meja kerja di belakang layar. Terkadang ini dapat dihindari dengan melihat rencana kueri Anda dan pengindeksan atau penyetelan kueri. Kadang-kadang itu terjadi (lebih pada beban kerja gudang, saya temukan). Jika Anda memiliki cukup memori, ini bisa membantu, tetapi kueri ini masih bisa sering terjadi. Lihat ini juga.
  4. Apakah Anda menggunakan tingkat Isolasi Snapshot yang Dibaca Baca dengan jumlah pembaruan yang adil di sistem Anda? Ini juga dapat menghasilkan peningkatan aktivitas TempDB.

Intinya adalah - TempDB digunakan dalam banyak cara, dan tidak mengejutkan saya sama sekali untuk melihatnya sebagai salah satu basis data tersibuk Anda, jika bukan yang tersibuk. Itu juga tidak mengejutkan saya ketika saya melihatnya memiliki jumlah kios rata-rata tertinggi dan tertinggi dari semua basis data di situs klien. Ini adalah sifat dari beban kerjanya kadang-kadang. Melihat beberapa hal yang saya sebutkan di sini tentu dapat membantu Anda menentukan apakah angka-angka ini menunjukkan masalah dan jika demikian, bagaimana cara lebih dalam menyelesaikannya.

Mike Walsh
sumber
-4

TempDB dibagikan di antara semua database pada instance. Jadi kadang-kadang bisa ada pertengkaran dalam TempDB untuk halaman-halaman tertentu: SGAM , GAM , dan PFS . Singkatnya, halaman-halaman ini melacak apa yang telah digunakan di TempDB sejauh ini, dan di mana ruang tersedia untuk penggunaan baru.

Biasanya, ini ditangani dengan menambahkan beberapa file data ke TempDB. Ada beberapa filosofi yang berbeda mengenai jumlah yang benar, tetapi semua setuju Anda harus memiliki lebih dari satu.

Berikut beberapa pertanyaan untuk dijalankan ...

Yang ini akan menunjukkan kepada Anda berapa banyak file yang dimiliki TempDB dan di mana mereka berada.

-- tempdb layout
use tempdb
go
exec sp_helpfile
go

Yang ini akan menunjukkan berapa banyak CPU dan core yang Anda miliki.

-- cores and hyperthreading
select cpu_count, hyperthread_ratio 
from sys.dm_os_sys_info
go

Yang ini akan menunjukkan kepada Anda berapa banyak NUMA simpul dan inti per NUMA simpul yang Anda miliki.

-- numa nodes and schedulers
select node_id, online_scheduler_count
from sys.dm_os_nodes
order by node_id
go

Yang ini akan menunjukkan kepada Anda halaman mana yang sedang menunggu di TempDB.

-- see if anything is waiting on tempdb
select * 
from sys.dm_os_waiting_tasks
where resource_description like '2:%'
go

Berikut adalah artikel yang sedikit lebih mendalam tentang masalah pertikaian halaman.

OK, jadi sekarang bagian filosofi ... :-)

Bagi saya sendiri, jika saya menggunakan sistem SMP , saya hanya ingin file sebanyak setengah dari total core .

Jika saya menggunakan sistem NUMA , maka saya hanya ingin file sebanyak core per node NUMA .

Namun, saya jarang melihat peningkatan karena memiliki lebih dari empat file untuk TempDB. Jadi saya biasanya mulai dengan empat dan memonitor pertengkaran seperti yang dijelaskan dalam artikel yang saya tautkan.

Jika saya terus melihat masalah, maka saya akan menambahkan dua lagi. Periksa lagi, tambahkan lagi, dan ulangi sampai pertengkaran hilang.

Steven
sumber
5
-1 Maaf, ada porsi FUD yang adil di sini juga. Pertikaian GAM / SGAM / PFS bermanifestasi sebagai pertikaian gerendel, ini tidak akan menghasilkan menunggu IO yang diperpanjang, yang merupakan fokus dari pertanyaan OP.
Mark Storey-Smith
3
Ini terdengar seperti regurg blog yang bagus. Masalah terbesar, pada titik ini, adalah bahwa semuanya mengenai poros yang sama. IO hampir selalu merupakan hambatan terbesar dalam sistem basis data apa pun dan ketika Anda menggumpal semuanya pada disk yang sama (mungkin spindel yang sama) maka total menunggu Anda akan meroket. Saya benar-benar merekomendasikan pencarian Google / Bing untuk 'Waits and Queues' sehingga bottleneck IO ini dapat diverifikasi dan dikuantifikasi. Dengan begitu OP dapat kembali ke pemilik layanan dan mendorong $$ untuk disk dan downtime untuk menggunakannya.
swasheck
2
mulai di sini
swasheck
2
@ Mark - Terima kasih atas klarifikasi. Saya menghargai umpan baliknya.
Steven