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.
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.
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 SIMPLE
menjadi FULL
juga 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?
sumber
FULL
atauBULK_LOGGED
, itu tetap berlaku seolah-olah itu masukSIMPLE
sampai Anda mengambil cadangan penuh.Jawaban:
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:
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:
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).
sumber
C:
danD:
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.