Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

Memahami Kerugian Acara dengan Acara yang Diperpanjang

Rekan saya, Erin Stellato, baru-baru ini mengajukan pertanyaan kepada saya tentang di mana dan mengapa kerugian acara dapat terjadi dengan Acara yang Diperpanjang. Pertanyaannya adalah hasil dari komentar yang dibuat seseorang di salah satu postingan blognya yang mengklaim bahwa showplan_xml acara tidak dapat dikumpulkan oleh XE Profiler atau melalui aliran acara "langsung" dari server. Saya kebetulan tahu bahwa ini tidak benar karena saya telah secara rutin menunjukkan dampak kinerja negatif dari penggunaan acara post_query_execution_showplan terhadap beban kerja produksi dengan menambahkan acara di UI dan membuatnya menonton data langsung, jadi ini memulai diskusi yang lebih mendalam tentang bagaimana dan kapan Peristiwa yang Diperpanjang akan membuang peristiwa yang telah dihasilkan selama pengumpulan data.

Ukuran Acara Penting

Acara yang Diperpanjang mengonfigurasi ruang buffer memori internal untuk sesi acara saat dimulai di server, dan konfigurasi opsi sesi acara menentukan seberapa besar buffer memori, dan ukuran maksimum acara yang dapat dikumpulkan oleh sesi acara. Sementara sebagian besar peristiwa yang dihasilkan oleh Peristiwa yang Diperpanjang relatif ringan dan kecil dalam format biner, peristiwa tertentu dapat menghasilkan muatan data yang jauh lebih besar yang harus di-buffer. Opsi sesi acara default menghasilkan konfigurasi sesi dengan tiga buffer memori internal untuk mengadakan acara yang berukuran 1.441.587 byte. Ukuran dan jumlah buffer memori untuk sesi acara dapat ditemukan di sys.dm_xe_sessions DMV sementara sesi STATE=START di server:

SELECT s.name, s.total_regular_buffers, s.regular_buffer_size, s.total_large_buffers, s.large_buffer_size, s.total_buffer_sizeFROM sys.dm_xe_sessions AS s;

Perhatikan bahwa tidak ada buffer besar untuk setiap sesi acara yang ditentukan sistem, dan ukuran buffer besar juga disetel ke nol, yang merupakan konfigurasi default. Buffer besar untuk sesi acara hanya dibuat ketika opsi sesi MAX_EVENT_SIZE dikonfigurasi untuk sesi acara. Nilai default untuk opsi ini adalah 0, yang berarti bahwa kejadian terbesar yang benar-benar dapat dikonsumsi oleh sesi acara adalah ukuran buffer memori biasa, yaitu 1.441.587 byte. Untuk acara tertentu, seperti yang menghasilkan showplan_xml, sebenarnya relatif mudah untuk memiliki ukuran acara yang lebih besar dari ukuran buffer memori default untuk sesi acara. Dalam kasus ini, acara besar sebenarnya akan dibuang oleh sesi acara karena tidak dapat ditempatkan ke dalam buffer memori untuk pengiriman.

Mengontrol Kerugian Peristiwa

Ada tiga opsi sesi khusus yang menentukan seberapa besar acara yang benar-benar dapat dikumpulkan oleh sesi acara, dan satu yang mengontrol bagaimana acara dijatuhkan saat memori buffer untuk sesi acara penuh atau di bawah tekanan. Keempat hal ini penting ketika kita berbicara tentang mengumpulkan acara yang dapat menghasilkan muatan acara besar dan kami ingin meminimalkan kemungkinan kami berpotensi menjatuhkan acara. Contoh sesi acara yang rentan terhadap kehilangan acara karena tekanan memori di ruang buffer untuk sesi acara di bawah ini:

BUAT SESI ACARA [Kunci] PADA SERVER ADD EVENT sqlserver.lock_acquired,TAMBAHKAN ACARA sqlserver.lock_releasedADD TARGET package0.event_file(SET filename=N'Locks',max_file_size=(5),max_rollover_files=(4))WITH (MAX_MEMORY =4096 KB,MEMORY_PARTITION_MODE=NONE,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_EVENT_SIZE=0 KB);

Catatan:Ini bukan sesi acara yang saya sarankan untuk dijalankan pada beban kerja produksi – volume data yang akan dihasilkannya akan signifikan, karena melacak setiap perolehan dan pelepasan kunci.

Jika kita memulai sesi ini dan kemudian menjalankan generator Beban Kerja Online AdventureWorks Books yang tersedia di blog saya terhadap instance SQL Server, sesi akan dengan cepat mulai menjatuhkan acara karena pembuatan acara yang cepat dan penundaan buffer flushing ke target event_file yang dikonfigurasi. Jumlah acara yang telah dijatuhkan oleh sesi acara dapat dilacak di sys.dm_xe_sessions DMV jika opsi sesi acara telah dikonfigurasi dengan EVENT_RETENTION_MODE =ALLOW_SINGLE_EVENT_LOSS. Jika sesi acara dikonfigurasi dengan EVENT_RETENTION_MODE=ALLOW_MULTIPLE_EVENT_LOSS maka seluruh buffer memori acara dapat dihapus dan hanya menghitung berapa banyak buffer yang dijatuhkan dan bukan jumlah peristiwa individual yang ditampung setiap buffer.

SELECT s.name, s.total_regular_buffers, s.regular_buffer_size, s.total_large_buffers, s.large_buffer_size, s.dropped_event_count, s.dropped_buffer_count, s.largest_event_dropped_sizeFROM ASsys.ses. 

Di sini, kita dapat melihat bahwa 100.521 peristiwa dijatuhkan dan ukuran terbesar dari peristiwa yang dijatuhkan adalah 176 byte, yang lebih kecil dari ukuran ruang buffer reguler kami, jadi kami hanya menekan tekanan ruang memori buffer normal. Namun, jika kami membuat sesi acara yang mengumpulkan dua acara showplan (lihat artikel ini mengapa hal ini akan berdampak negatif pada kinerja dan tidak boleh dilakukan pada server produksi), bersama dengan batch yang memulai dan menyelesaikan acara dan menghasilkan beberapa rencana, kami dapat memicu kerugian acara karena ukuran acara.

BUAT SESI ACARA [DropsEvents] PADA SERVER ADD EVENT sqlserver.query_post_execution_showplan,TAMBAHKAN ACARA sqlserver.query_pre_execution_showplan,TAMBAHKAN ACARA sqlserver.sql_batch_completed,TAMBAHKAN ACARA sqlserver.sql_batch> 

Di sini, kita dapat melihat bahwa terbesar_event_dropped_size lebih besar dari regular_buffer_size kita, jadi ini berarti kita perlu mengubah konfigurasi buffer sesi kita. Jika kami meningkatkan MAX_MEMORY untuk sesi acara, itu dapat meningkatkan ukuran buffer reguler kami. Nilai defaultnya hanya 4MB, dari situlah ukuran buffer 1,4MB yang ditunjukkan di atas berasal. Jika kita mengubah ini menjadi 64MB untuk sesi acara, ukuran_buffer_reguler akan berukuran 22.4MB yang akan mengakomodasi acara yang dijatuhkan sebesar 3,7MB. Opsi lainnya adalah menyetel opsi MAX_EVENT_SIZE yang menyediakan ukuran_buffer_besar untuk acara besar dan dibagi dua untuk sesi.

BUAT SESI ACARA [CollectsEvents] PADA SERVER ADD EVENT sqlserver.query_post_execution_showplan,ADD EVENT sqlserver.query_pre_execution_showplan,TAMBAHKAN EVENT sqlserver.sql_batch_completed,TAMBAHKAN EVENT sqlserver.sql_batch=65_starting_sql_batch=65MODE_MEWIRY_batch=65_starting. 

Jadi di sini kita dapat melihat dua buffer besar dengan ukuran 33.6MB dan setelah menjalankan rencana yang sama menghasilkan beban kerja lagi, kita tidak memiliki peristiwa yang dijatuhkan untuk sesi CollectsEvents baru kita, tetapi kita telah menggandakan peristiwa yang dijatuhkan untuk sesi DropsEvents menggunakan default.

Jadi, begitulah; mengapa acara tertentu mungkin tidak dikumpulkan oleh sesi acara, bagaimana cara mengatasi masalah saat acara dihentikan, dan cara menentukan apakah ukuran acara yang menyebabkan masalah. Banyak sesi yang saya lihat dalam penggunaan aktual pada sistem klien memiliki default untuk opsi sesi acara, terutama yang menyangkut memori. Ini adalah salah satu area yang, setelah Anda memahami mekanisme buffering yang digunakan oleh Peristiwa yang Diperpanjang, dan kemudian mempertimbangkan ukuran peristiwa yang berpotensi dihasilkan, Anda akan mulai membuat perubahan dalam cara opsi sesi ditentukan untuk meminimalkan potensi peristiwa dijatuhkan karena batas ruang memori atau kendala ukuran acara.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Operator SQL IN untuk Pemula

  2. 4 Metode Konversi Data SQL dan Kasus Penggunaan yang Luar Biasa

  3. Kait DBCC_OBJECT_METADATA

  4. SQL FLOAT:3 Poin yang Akan Membantu Anda Menghindari Kesalahan Matematika yang Aneh

  5. Panduan untuk Menyebarkan TimescaleDB dengan Docker