SQL Server telah mengalami kejadian permintaan I / O yang membutuhkan waktu lebih dari 15 detik

16

Pada Produksi SQL Server, kami memiliki konfigurasi berikut:

3 Server Dell PowerEdge R630, digabungkan ke dalam Grup Ketersediaan. Semua 3 terhubung ke unit penyimpanan Dell SAN tunggal yang merupakan array RAID

Dari waktu ke waktu, pada PRIMARY kami melihat pesan yang mirip dengan di bawah ini:

SQL Server telah mengalami 11 kali permintaan I / O yang membutuhkan waktu lebih dari 15 detik untuk diselesaikan pada file [F: \ Data \ MyDatabase.mdf] di database id 8.
Pegangan file OS adalah 0x0000000000001001FBC.
Offset dari I / O panjang terbaru adalah: 0x000004295d0000.
Durasi I / O yang panjang adalah: 37397 ms.

Kami pemula dalam pemecahan masalah kinerja

Apa cara paling umum atau praktik terbaik dalam mengatasi masalah masalah khusus ini terkait dengan penyimpanan? Penghitung kinerja, alat, monitor, aplikasi, dll. Apa yang harus digunakan untuk mempersempit akar penyebab dari pesan seperti itu? Mungkinkah ada Acara yang Diperpanjang yang dapat membantu, atau semacam audit / logging?

Aleksey Vitsko
sumber
Apakah SQL Server berjalan dalam VM pada mesin fisik itu? Jika demikian, Anda perlu memastikan hypervisor diatur dengan benar, dan setiap VM dikonfigurasi dengan benar. Untuk VMware, periksa vmware.com/content/dam/digitalmarketing/vmware/en/pdf/solutions/…
Max Vernon
@ Maxxernon tidak, SQL Server tidak ada di dalam VM; Namun, peran Hyper-V diinstal pada server ini karena mereka hosting beberapa VM kecil (server web IIS) ... Apakah pengaturan hypervisor perlu diperiksa dalam kasus ini?
Aleksey Vitsko

Jawaban:

15

Kami memiliki pengaturan serupa dan baru-baru ini menemukan pesan-pesan ini di log. Kami menggunakan DELL Compellent SAN. Berikut adalah beberapa hal yang perlu diperiksa ketika menerima pesan-pesan ini yang membantu kami menemukan solusi

  • Tinjau penghitung kinerja windows Anda untuk disk yang ditunjuk oleh pesan peringatan, khususnya:
    • Rata-rata disk baca waktu
    • Rata-rata disk tulis waktu
    • Disk baca byte / detik
    • Disk tulis byte / detik
    • Transfer Disk / dtk
    • Rata-rata panjang antrian disk
  • Di atas adalah rata-rata. Jika Anda memiliki banyak file database pada satu drive, rata-rata ini dapat memiringkan hasilnya dan menutupi leher botol pada file database tertentu. Lihat kueri ini dari Paul S. Randal yang mengembalikan latensi rata-rata untuk setiap file dari dmv sys.dm_io_virtual_file_stats. Dalam kasus kami, latensi rata-rata yang dilaporkan dapat diterima, tetapi di bawah sampul kami memiliki banyak file dengan latensi rata-rata> 200 ms.
  • Periksa timingnya. Apakah ada pola? Apakah itu lebih sering terjadi pada waktu tertentu di malam hari? Jika demikian periksa apakah ada pekerjaan pemeliharaan yang sedang berjalan pada saat itu atau aktivitas terjadwal yang dapat meningkatkan aktivitas disk dan membuka leher botol di subsistem IO Anda.
  • Periksa penampil acara windows untuk kesalahan. Jika sakelar atau SAN Anda kelebihan beban atau tidak diatur dengan benar untuk aplikasi Anda, Anda mungkin menemukan beberapa pesan di log ini, dan ada baiknya membawa informasi ini ke admin SAN Anda. Dalam kasus kami, kami menerima kesalahan koneksi iSCSI sering sepanjang hari, mengisyaratkan masalah.
  • Tinjau kode SQL Server Anda. Ketika Anda menerima pesan-pesan ini, Anda seharusnya tidak langsung menganggapnya sebagai masalah subsistem IO dan meneruskannya ke admin SAN Anda. Anda perlu melakukan bagian Anda dan meninjau basis data. Apakah Anda memiliki kueri yang benar-benar buruk yang sering dijalankan melalui banyak data? Pengindeksan buruk? Log transaksi yang berlebihan menulis? Anda dapat menggunakan beberapa kueri sumber terbuka untuk mendapatkan pemeriksaan kesehatan pada database Anda, contoh untuk memeriksa bagaimana rencana kueri Anda terlihat adalah sp_blitzCache
  • Jangan abaikan ini. Hari ini Anda mungkin menerimanya beberapa kali sehari ... lalu beberapa bulan kemudian ketika beban kerja Anda meningkat dan Anda lupa memantaunya, mereka mulai meningkat. Menerima banyak pesan ini dapat mencegah SQL Server mengakses file tertentu, dan jika itu tempdb , itu tidak baik. Dalam kasus kami menjadi sangat buruk sehingga SQL Server dimatikan sendiri.

Solusi kami adalah memutakhirkan sakelar kami ke sakelar SAN. Ya, ini adalah semua poin untuk dibahas dalam SQL Server. Apa yang membuat kami menemukan itu adalah bahwa kami menerima sekitar 1500 kesalahan putuskan pdu iSCSI di penampil acara aplikasi Windows di SQL Server setiap hari. Itu mendorong penyelidikan oleh admin SAN kami ke sakelar.

Segera setelah peningkatan, kesalahan iSCSI hilang dan rata-rata latensi turun menjadi sekitar 50 ms untuk semua file, dan itu berkorelasi dengan kinerja yang lebih baik dalam aplikasi. Dengan mengingat hal-hal ini mudah-mudahan Anda dapat menemukan solusi Anda.

kevinnwhat
sumber
1
Jadi kejadian sistem, bukan dalam SQL Server, membawa Anda ke resolusi, benar? Dapatkah Anda menawarkan bantuan pemecahan masalah yang mencakup melakukan mempersempit jika masalah adalah sesuatu yang internal ke SQL Server, di tingkat OS, tingkat Filesystem, atau tingkat jaringan area penyimpanan?
Sean Gallardy
Itu benar, Sean. Saya mungkin dapat menambahkan beberapa informasi seperti yang Anda sarankan, saya akan memperbarui jawaban saya setelah saya menyatukannya.
kevinnwhat
26

Ini jauh lebih jarang masalah disk, dan jauh lebih sering masalah jaringan. Anda tahu, N di SAN?

Jika Anda pergi ke tim SAN Anda dan mulai berbicara tentang disk yang lambat, mereka akan menunjukkan kepada Anda grafik mewah dengan 0 milidetik latensi di atasnya dan kemudian arahkan stapler pada Anda.

Sebaliknya, tanyakan tentang jalur jaringan ke SAN. Dapatkan kecepatan, jika multipathing, dll. Dapatkan angka dari mereka tentang kecepatan yang seharusnya Anda lihat. Tanyakan apakah mereka memiliki tolok ukur sejak server disiapkan.

Kemudian Anda dapat menggunakan Crystal Disk Mark atau diskpd untuk memvalidasi kecepatan tersebut. Jika mereka tidak berbaris, sekali lagi, kemungkinan besar jaringan.

Anda juga harus mencari log kesalahan Anda untuk pesan yang berisi "FlushCache" dan "saturation", karena itu juga bisa menjadi tanda pertentangan jaringan.

Satu hal yang dapat Anda lakukan untuk menghindari hal-hal itu sebagai DBA adalah memastikan bahwa pemeliharaan Anda dan tugas berat data lainnya (seperti ETL) tidak terjadi pada saat yang bersamaan. Itu pasti dapat memberi banyak tekanan pada jaringan penyimpanan.

Anda mungkin juga ingin memeriksa jawaban di sini untuk saran lebih lanjut: Pos pemeriksaan lambat dan peringatan I / O 15 detik pada penyimpanan flash

Saya membuat blog tentang topik serupa di sini: Dari Server Ke SAN

Erik Darling
sumber
8

Mengapa menyimpan data pada SAN? Apa gunanya? Semua kinerja basis data terkait dengan Disk I / O dan Anda menggunakan 3 server dengan hanya satu perangkat untuk I / O di belakangnya. Itu tidak masuk akal ... dan sayangnya sangat umum.

Saya menghabiskan hidup saya menghadapi platform perangkat keras yang dirancang buruk di mana orang hanya mencoba untuk merancang komputer skala besar. Semua kekuatan CPU di sini, semua disk di sana ... semoga tidak ada yang namanya RAM jarak jauh. Dan yang paling menyedihkan adalah mereka mengkompensasi kurangnya efisiensi dari desain ini dengan server besar yang harganya sepuluh kali lebih banyak dari yang seharusnya. Saya melihat infra $ 400k lebih lambat dari laptop $ 1k.

Perangkat lunak SQL server adalah perangkat lunak yang sangat canggih, dirancang untuk memanfaatkan setiap bit perangkat keras, inti CPU, cache CPU, TLB, RAM, pengontrol disk, cache hard drive ... Mereka hampir mencakup semua logika sistem file. Mereka dikembangkan pada komputer biasa dan mengacu pada sistem kelas atas. Karena itu server SQL harus memiliki disk sendiri. Menginstalnya di SAN seperti "meniru" komputer, Anda kehilangan semua optimisasi kinerja. SAN adalah untuk menyimpan cadangan, file yang tidak dapat diubah, dan file yang baru saja Anda tambahkan data (log).

Administrator pusat data cenderung meletakkan semua yang mereka bisa di SAN karena cara ini mereka hanya memiliki satu kumpulan penyimpanan untuk dikelola, lebih mudah daripada merawat penyimpanan di setiap server. Ini adalah pilihan "Saya tidak ingin melakukan pekerjaan saya", dan pilihan yang sangat buruk, karena mereka harus berurusan dengan masalah kinerja dan semua perusahaan menderita karenanya. Cukup instal perangkat lunak pada perangkat keras yang dirancang untuk itu. Tetap sederhana. Peduli I / O bandwidth, cache dan konteks switch overhead, ressource jitter (terjadi ketika ressource dibagikan). Anda pada akhirnya akan mempertahankan 1/10 perangkat untuk daya output mentah yang sama, menghemat banyak sakit kepala tim ops Anda, mendapatkan kinerja yang membuat pengguna akhir Anda bahagia dan lebih produktif, menjadikan perusahaan Anda tempat yang lebih baik untuk bekerja, dan menghemat banyak energi (planet ini akan berterima kasih).

Anda mengatakan dalam komentar, Anda mempertimbangkan untuk menempatkan SSD di server Anda. Anda tidak akan mengenali pengaturan Anda dengan SSD khusus, dibandingkan dengan SAN Anda akan mendapatkan peningkatan 500x bahkan dengan data dan file log transaksi pada drive yang sama. Keadaan SQL Server akan memiliki SSD terpisah cepat untuk data dan transaksi log pada saluran pengontrol perangkat keras yang berbeda (kebanyakan server motherboard memiliki beberapa). Tetapi dibandingkan dengan pengaturan Anda saat ini, kita berbicara tentang sci-fi di sana. Coba saja SSD.

bokan
sumber
1
Itu membuat saya berpikir lagi tentang ide untuk membeli drive SSD khusus untuk setiap replika (untuk file data, mungkin juga untuk file log), daripada ketiga menggunakan SAN yang sama. Saya secara bertahap mengecek semua item yang diposting orang lain di atas, juga tentu saja
Aleksey Vitsko
2

Oke, untuk siapa saja yang tertarik,

Kami memecahkan masalah di Pertanyaan beberapa bulan yang lalu hanya dengan menginstal drive SSD yang terpasang langsung ke masing-masing dari 3 server, dan memindahkan data DB dan mencatat file dari SAN ke drive SSD tersebut

Berikut ringkasan tentang apa yang saya lakukan untuk meneliti masalah ini (menggunakan rekomendasi dari semua posting, pertanyaan ini), sebelum kami memutuskan untuk menginstal drive SSD:

1) mulai mengumpulkan counter PerfMon untuk drive berikut di ketiga server:

Disk F:adalah disk logis berdasarkan SAN, berisi file data MDF
Disk I:disk logis berdasarkan SAN, berisi file log LDF
Disk T:yang langsung terpasang SSD, didedikasikan hanya untuk tempDB

Gambar di bawah ini adalah nilai rata-rata yang dikumpulkan selama periode 2 minggu

Penghitung Kinerja Disk

Disk I: (LDF)memiliki IO yang sangat kecil dan Latency sangat rendah, jadi Disk I: dapat diabaikan
Anda dapat melihat bahwa Disk T: (TempDB)IO lebih besar dibandingkan dengan Disk F: (MDF), dan memiliki Latensi yang jauh lebih baik pada saat yang sama - 0 ms

Jelas ada sesuatu yang salah dengan Disk F: di mana file data berada, ia memiliki Latensi tinggi dan Rta Tulis Disk Antrian, meskipun IO rendah

2) Memeriksa Latensi untuk basis data individual menggunakan kueri dari situs web ini

https://www.brentozar.com/blitz/slow-storage-reads-writes/

Beberapa basis data aktif di server Utama memiliki latensi baca 150-250 ms dan latensi tulis 150-450 ms
Yang menarik, file basis data master dan msdb telah membaca latensi hingga 90 ms yang mencurigakan mengingat kecilnya data dan rendahnya IO - indikasi lain ada yang salah dengan SAN

3) Tidak ada timing spesifik

Selama yang "SQL Server telah mengalami kejadian ..." pesan muncul
Tidak ada pemeliharaan atau disk yang tinggi ETL berjalan ketika pesan-pesan yang login

4) Windows Event Viewer

Tidak menunjukkan entri lain yang akan mengisyaratkan masalah, kecuali "SQL Server telah mengalami kejadian ..."

5) Mulai memeriksa 10 pertanyaan teratas

Dari sp_BlitzCache (cpu, membaca, dll.), Dan mempercepat jika mungkin
Tidak ada super IO pertanyaan berat yang akan mengocok banyak data dan berdampak besar pada penyimpanan, meskipun
pengindeksan dalam basis data tidak masalah, saya mempertahankannya

6) Kami tidak memiliki tim SAN

Kami hanya memiliki 1 sysadmin yang membantu pada kesempatan
Network path ke SAN - multipathed, masing-masing dari 3 server memiliki 2 kabel jaringan yang mengarah ke switch dan kemudian ke SAN, dan seharusnya 1 Gigabyte / detik

7) Tidak ada hasil CrystalDiskMark

Atau hasil uji benchmark lainnya dari ketika server yang pengaturan, jadi saya tidak tahu apa kecepatan harus menjadi, dan tidak mungkin untuk patokan pada saat ini untuk melihat apa kecepatan saat ini adalah, karena akan berdampak Produksi

8) Atur sesi Extended Events pada acara pos pemeriksaan untuk database yang dimaksud

Sesi XE membantu menemukan bahwa selama pesan "SQL Server mengalami kejadian ...", pos pemeriksaan terjadi sangat lambat (hingga 90 detik)

9) Log Kesalahan SQL Server

Entri "FlushCache" "Saturasi" yang terkandung
Ini seharusnya muncul ketika waktu pos pemeriksaan untuk database yang diberikan melebihi pengaturan interval pemulihan

Detail menunjukkan bahwa jumlah data yang ingin diperiksa oleh checkpoint kecil dan butuh waktu lama untuk menyelesaikannya, dan kecepatan keseluruhannya sekitar 0,25 MB / detik ... aneh

10) Akhirnya, gambar ini menunjukkan bagan pemecahan masalah penyimpanan:

Langkah-Langkah Pemecahan Masalah IO Disk Lambat

Tampaknya kita hanya memiliki "Masalah Perangkat Keras: - Bekerja dengan admin sistem / vendor perangkat keras untuk memperbaiki kesalahan konfigurasi SAN, driver lama / rusak, pengontrol, firmware, dll."

Dalam pertanyaan lain "Lambat periksa ..." Lambat periksa dan 15 I peringatan I / O pada penyimpanan flash Sean memiliki daftar yang sangat bagus dari item apa yang harus diperiksa pada tingkat perangkat keras dan perangkat lunak untuk memecahkan masalah

Sysadmin kami tidak dapat memeriksa semua hal dari daftar, jadi kami hanya memilih untuk membuang beberapa perangkat keras pada masalah ini - itu tidak mahal sama sekali

Resolusi:

Kami memesan drive SSD 1 TB dan dipasang langsung ke server

Karena kami memiliki Grup yang Tersedia, memigrasikan file data DB dari SAN ke SSD pada replika sekunder, kemudian gagal, dan memigrasikan file pada mantan primer. Ini memungkinkan untuk total downtime minimum - kurang dari 1 menit

Sekarang setiap server memiliki salinan data DB lokal, dan pencadangan penuh / diff / log dilakukan ke SAN yang disebutkan di atas.
Tidak ada lagi pesan "SQL Server telah mengalami kejadian ..." di log Windows Event Viewer, dan kinerja cadangan, pemeriksaan integritas, indeks membangun kembali, permintaan dll telah meningkat secara signifikan

Berapa banyak kinerja dalam hal IO latency telah meningkat sejak kami memigrasikan file DB ke SSD?

Untuk mengevaluasi dampak, kinerja yang digunakan log Monitor Kinerja Windows 2 minggu sebelum migrasi dan 4 minggu setelah migrasi:

Metrik Latensi Disk Monitor Kinerja Windows

Juga di bawah ini adalah perbandingan statistik latensi tingkat DB (digunakan statistik file virtual yang ditangkap SQL Server sebelum dan sesudah migrasi)

Statistik File Virtual SQL Server

Ringkasan

Migrasi dari SAN ke SSD lokal yang terpasang langsung sangat bermanfaat.
Itu berdampak besar pada latensi penyimpanan dan meningkat rata-rata lebih dari 90% (terutama operasi WRITE), dan kami tidak memiliki lonjakan 20-50 detik di IO lagi

Pindah ke SSD lokal menyelesaikan tidak hanya masalah kinerja penyimpanan tetapi juga keamanan data yang saya khawatirkan (jika SAN gagal, ketiga server kehilangan data mereka pada saat yang sama)

Aleksey Vitsko
sumber