Kami memiliki aplikasi yang menanyakan basis data SQL secara berkala sepanjang hari. Ada periode nol atau hanya aktivitas ringan, diselingi dengan permintaan individu untuk jumlah data yang relatif besar. Ketika permintaan itu masuk, tujuan utama adalah untuk mengirimkan data dengan cepat, dan tujuan kedua adalah melakukan hal itu secara efektif. Karena sifat aplikasi, sangat tidak mungkin bahwa data / indeks akan di-cache dalam RAM dari permintaan sebelumnya (pengguna yang berbeda, bekerja pada bagian data yang berbeda).
Untuk sistem yang mengalami penggunaan yang relatif stabil, saya telah mendengar aturan praktis untuk mengamati panjang antrian disk dan menjaga jumlah itu relatif kecil. Ini secara khusus akan berjalan di AWS, di mana saya telah melihat aturan praktis bahwa panjang antrian disk 1 per 100 IOPS masuk akal.
Bagaimana saya bisa memperkirakan persyaratan IO untuk sistem seperti itu? Apakah panjang antrian disk merupakan indikator yang dapat diandalkan saat menangani kueri individual yang bursty? Apakah ada metrik lain yang harus saya pertimbangkan?
sumber
Jawaban:
Metrik utama yang selalu saya pertimbangkan untuk IO di SQL Server bukanlah IOP atau Panjang Antrian Disk, tetapi throughput disk (dtk / baca dan dtk / tulis). Secara keseluruhan, basis data bukan tentang berapa banyak operasi yang dapat Anda lemparkan ke disk, tetapi seberapa cepat operasi tersebut selesai. Aturan umum adalah memiliki kurang dari 20 ms / operasi (meskipun lebih rendah selalu lebih baik). Detail lebih lanjut dapat ditemukan di artikel ini .
Panjang Antrian Disk adalah stat palsu dan tidak lagi relevan. Masalahnya adalah bahwa nilainya mengukur antrian untuk satu drive, tetapi sekarang kita hidup di zaman RAID, SAN, dan penyimpanan terdistribusi lainnya, tidak ada cara untuk menerjemahkan nilai ini dengan benar ke angka yang berarti. Tempat awal yang bagus untuk metrik kinerja adalah poster dari Quest / Dell ini yang memberi Anda banyak hal dan penjelasan mengapa atau mengapa itu tidak penting. Anda tidak harus menggunakan semuanya, tetapi itu adalah permulaan.
Untuk menguji IO Anda, Anda harus memahami beban kerja Anda pada puncaknya. Berapa banyak transaksi dan berapa banyak yang di-cache? Kecuali Anda tahu dan telah mengukur ini, sangat sulit untuk menilai. Anda bisa membuat beban kerja dan menggunakan alat-alat seperti SQLIO untuk menguji penyimpanan Anda, tetapi Anda akan membutuhkan pola beban kerja untuk membangun tes yang tepat.
Akhirnya, catatan tentang AWS: Setahu saya, Amazon tidak akan menjamin kinerja IO di AWS. Ini terutama karena penyimpanan adalah sumber daya bersama yang besar dan tidak mungkin untuk mengukur pola Anda dan tetangga Anda pada area penyimpanan tertentu (lihat masalah Noisy Neighbor ).
Rekomendasi saya adalah mengalokasikan memori sebanyak mungkin. SQL Server hanya akan mendorong hal-hal keluar dari memori jika berada di bawah tekanan dan ruang di buffer pool (berdasarkan LRU-K). Jadi jika Anda buffer pool dapat menyimpan sebagian besar database dalam memori, Anda dapat mengurangi beberapa kinerja yang meledak-ledak. Juga, pertimbangkan taktik yang dapat membuat objek cache "hangat". Akhirnya, awasi SQL 2014 dan fitur Hekaton baru .
sumber