SQL Server Cache Flush dan Disk I / O


11

Kami sibuk memuat pengujian sistem OLTP yang kami kembangkan di .NET 4.0 dan menjalankan SQL Server 2008 R2 di belakang. Sistem ini menggunakan antrian SQL Server Broker Layanan, yang sangat performan, tetapi kami mengalami tren aneh saat memproses.

Permintaan proses SQL Server pada kecepatan terik selama 1 menit, diikuti oleh ~ 20 detik peningkatan aktivitas penulisan disk. Grafik berikut menggambarkan masalah.

SQL OLTP System - Penghitung Kinerja

Yellow = Transactions per second
Blue   = Total CPU usage
Red    = Sqlsrv Disk Write Bytes/s
Green  = Sqlsrv Disk Read Bytes/s

Selama pemecahan masalah, kami mencoba yang berikut ini tanpa perubahan signifikan pada polanya:

  • Berhenti SQL Server Agent.
  • Membunuh hampir semua proses yang sedang berjalan lainnya (No A / V, SSMS, VS, Windows Explorer, dll.)
  • Menghapus semua basis data lainnya.
  • Nonaktifkan semua penghitung waktu percakapan (kami tidak menggunakan pemicu apa pun).
  • Pindah jauh dari pendekatan antrian pesan ke desain pemantauan tabel sederhana / kasar.
  • Digunakan beban berbeda dari ringan ke berat.
  • Memperbaiki semua deadlock.

Tampaknya seolah-olah SQL Server mungkin membangun cache dan menulisnya ke disk pada interval waktu tertentu, tapi saya tidak dapat menemukan apa pun online untuk mendukung teori ini.

Selanjutnya, saya berencana untuk memindahkan solusi ke lingkungan pengujian khusus kami untuk melihat apakah saya dapat mereplikasi masalah. Bantuan apa pun untuk sementara akan sangat dihargai.

Pembaruan 1 Seperti yang diminta, dengan ini grafik yang mencakup Halaman / Sec Checkpoint , Page Life Expectancy , dan beberapa penghitung latensi disk.

SQL OLTP System - Penghitung Kinerja - Pos Pemeriksaan

Tampaknya seolah-olah Titik Pemeriksaan (garis biru muda) adalah penyebab berkurangnya kinerja (garis kuning) yang kami amati. ^

Latensi disk tetap relatif konsisten selama pemrosesan dan harapan masa pakai halaman tampaknya tidak memiliki efek yang terlihat. Kami juga menyesuaikan jumlah ram yang tersedia untuk SQL Server, yang juga tidak memiliki efek besar. Mengubah model pemulihan dari SIMPLEmenjadi FULLjuga membuat sedikit perbedaan.

Perbarui 2 Dengan mengubah "Interval Pemulihan" sebagai berikut, kami telah berhasil mengurangi interval di mana pos-pos pemeriksaan terjadi:

EXEC sp_configure 'show advanced options',1
GO 

RECONFIGURE
GO

EXEC sp_configure 'recovery interval', '30'
GO

RECONFIGURE 
GO

EXEC sp_configure 'show advanced options',0
GO
RECONFIGURE

Saya tidak yakin apakah ini praktik yang buruk?


1
Tambahkan halaman pos pemeriksaan / penghitung detik. Dan uji lagi dan perlihatkan grafik. Dan sementara transaksi Anda turun dan menulis naik - apakah Anda melihat masalah kinerja? Saya juga akan menambahkan beberapa penghitung latensi disk - rata-rata / baca dan rata-rata / tulis
Mike Walsh

Dan ketika Anda memposting grafik berikutnya dapat Anda sertakan angka. Grafik itu tidak menunjukkan skala apa pun.
Mike Walsh

5
Dan satu hal lagi (maaf!) ​​- Apa memori di server ini? Bisakah Anda menambahkan penghitung usia harapan hidup juga? Dapatkah Anda menggambarkan pengaturan fisik (memori, pengaturan IO, apakah Anda membagi log dan file data, dll)
Mike Walsh

2
Model pemulihan mana yang menjadi basis data? Ini terlihat seperti pemeriksaan otomatis ketika log transaksi terisi. Perhatikan bahwa meskipun database berada di FULLatau BULK_LOGGED, itu tetap berlaku seolah-olah itu masuk SIMPLEsampai Anda mengambil cadangan penuh.
Jon Seigel

2
Jon - Checkpointing akan tetap terjadi terlepas dari model pemulihan. Sederhana: satu-satunya perbedaan adalah apa yang terjadi pada data dalam log setelah pos pemeriksaan dalam model pemulihan .. Secara penuh itu tetap dalam log dan perlu didukung. Secara sederhana dapat dipotong (atau ditandai untuk pemotongan .. digunakan kembali) tetapi pos pemeriksaan masih harus terjadi.
Mike Walsh

Jawaban:


11

Orang lain telah menunjukkan penyebabnya: SQL Server mengakumulasi pembaruan dalam memori (di buffer pool) dan hanya membuangnya secara berkala (di pos pemeriksaan). Dua opsi yang disarankan (-k dan interval pos pemeriksaan) saling melengkapi:

Tapi saya tidak menanggapi hanya untuk memuntahkan komentar baik yang Anda terima sejauh ini :)

Sayangnya, yang Anda lihat adalah perilaku pemrosesan antrian yang sangat tipikal . Apakah Anda menggunakan antrian Broker Layanan atau memilih untuk menggunakan tabel sebagai pendekatan antrian , sistem ini sangat rentan terhadap perilaku semacam ini. Ini karena pemrosesan berbasis antrian adalah menulis berat, bahkan lebih berat menulis daripada pemrosesan OLTP. Baik enqueue dan dequeue primitif adalah operasi tulis dan hampir tidak ada operasi baca. Sederhananya, pemrosesan antrian akan menghasilkan paling banyak menulis (= halaman paling kotor, dan sebagian besar log) dibandingkan dengan beban kerja lainnya, bahkan OLTP (mis. TPC-C suka beban kerja).

Sangat penting, penulisan beban kerja antrian mengikuti pola sisipan / hapus: setiap baris yang disisipkan dihapus dengan sangat cepat. Ini penting untuk dibedakan dari pola append-only dari beban kerja insert heavy (ETL). Anda pada dasarnya memberi makan hantu tugas pembersihan penuh, dan Anda dapat dengan mudah berlari lebih cepat. Pikirkan apa artinya itu:

  • enqueue adalah sisipan, itu akan membuat halaman kotor
  • dequeue adalah delete, itu akan mengotori halaman yang sama lagi (mungkin beruntung dan menangkap halaman sebelum pos pemeriksaan, jadi itu akan menghindari double-flush, tetapi hanya jika beruntung)
  • hantu pembersihan akan membersihkan halaman, membuatnya kotor lagi

Ya, itu benar-benar berarti bahwa Anda akhirnya dapat menulis halaman tiga kali ke disk, dalam tiga permintaan IO yang berbeda, untuk setiap pesan yang Anda proses (kasus terburuk). Dan itu juga berarti bahwa IO acak dari pos-pos pemeriksaan akan benar - benar acak karena titik tulis halaman akan dikunjungi oleh orang-orang yang bergerak lagi antara dua pos pemeriksaan (dibandingkan dengan banyak beban kerja OLTP cenderung mengelompokkan tulisan di beberapa 'hot spot', bukan antrian ...).

Jadi, Anda memiliki tiga titik tulis ini, berlomba untuk menandai halaman yang sama kotor berulang kali. Dan itu sebelum kita mempertimbangkan pemisahan halaman, pemrosesan antrian mana yang mungkin rentan juga karena urutan kunci yang dimasukkan. Sebagai perbandingan, beban kerja OLTP 'tipikal' memiliki rasio baca / tulis yang jauh lebih seimbang dan distribusi penulisan OLTP di seluruh sisipan / pembaruan / penghapusan, seringkali dengan pembaruan (perubahan 'status') dan sisipan mengambil bagian terbesar. Menulis pemrosesan antrian secara eksklusif menyisipkan / menghapus dengan, menurut definisi, 50/50 split.

Beberapa konsekuensi mengikuti:

  • Pos pemeriksaan menjadi masalah yang sangat panas (tidak lagi mengejutkan bagi Anda)
  • Anda akan melihat fragmentasi berat (fragmentasi per-se tidak akan berarti banyak karena Anda tidak akan melakukan pemindaian jarak jauh, tetapi efisiensi IO Anda menderita dan pembersihan hantu memiliki lebih banyak pekerjaan, memperlambatnya lebih lambat)
  • IO throughput penyimpanan acak MDF Anda akan menjadi hambatan Anda

Rekomendasi saya datang dalam 3 huruf: S, S dan D. Pindahkan MDF Anda ke penyimpanan yang dapat menangani IO acak cepat. SSD. Fusion-IO jika Anda memiliki uang. Sayangnya ini adalah salah satu gejala yang tidak dapat diatasi dengan RAM yang lebih murah ...

Edit:

Seperti yang ditunjukkan oleh Mark, Anda memiliki dua disk logis yang didukung oleh satu disk fisik. Mungkin Anda mencoba mengikuti praktik terbaik dan memecah log pada D: dan data pada C: tetapi sayangnya tidak berhasil, C dan D adalah disk yang sama . Di antara pos-pos pemeriksaan Anda mencapai throughput yang berurutan, tetapi segera setelah pos pemeriksaan dimulai, kepala disk mulai bergerak dan jumlah log masuk Anda runtuh, mencatat seluruh hasil aplikasi. Pastikan Anda memisahkan log DB sehingga tidak terpengaruh oleh data IO (disk terpisah).


2
Namun, akan menarik untuk mengetahui mengapa IO yang dikendalikan oleh checkpoint menyebabkan dampak dramatis pada penghitung aplikasi. Idealnya aplikasi harus membajak ke depan sementara pos pemeriksaan melakukan tugasnya. Tentu saja, saya menganggap Anda tidak berbagi jalur akses penyimpanan LDF dan MDF (jika Anda melakukannya, maka Anda layak mendapatkannya ...). Mungkin Anda memiliki beberapa poin pertengkaran yang tidak perlu dalam aplikasi.
Remus Rusanu

Jawaban Remus dilakukan dengan sangat baik.
Mark Storey-Smith

3
Melihat penghitung perfmon yang terdaftar, saya menduga Anda mungkin benar pada data dan log berada di drive atau array yang sama.
Mark Storey-Smith

@ MarkStorey-Smith: Saya pikir Anda benar, OP memiliki C:dan D:disk logis yang didukung oleh disk fisik yang sama. Saya ragu bahwa disk fisik adalah baterai dari 100 gelendong bergaris pendek, jadi ini mungkin penyebab utamanya.
Remus Rusanu

Ya, tes ini dilakukan pada mesin pengembang lokal saya, yang hanya memiliki satu drive. Terima kasih atas bantuannya semua.
André Hauptfleisch
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.