Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Hiểu sự kiện mất mát với sự kiện mở rộng

Đồng nghiệp của tôi, Erin Stellato, gần đây đã hỏi tôi một câu hỏi về vị trí và lý do tại sao việc mất sự kiện có thể xảy ra với Sự kiện mở rộng. Câu hỏi là kết quả của nhận xét mà ai đó đã đưa ra trên một trong các bài đăng trên blog của cô ấy khẳng định rằng showplan_xml Các sự kiện không thể được thu thập bởi XE Profiler hoặc thông qua luồng "trực tiếp" của các sự kiện từ máy chủ. Tôi tình cờ biết rằng điều này không đúng vì tôi đã thường xuyên chứng minh các tác động tiêu cực đến hiệu suất của việc sử dụng sự kiện post_query_execution_showplan chống lại khối lượng công việc sản xuất bằng cách thêm sự kiện vào giao diện người dùng và để nó xem dữ liệu trực tiếp, vì vậy điều này bắt đầu thảo luận sâu hơn về cách thức và thời điểm Sự kiện mở rộng sẽ hủy một sự kiện đã được tạo trong quá trình thu thập dữ liệu.

Các vấn đề về quy mô sự kiện

Sự kiện mở rộng định cấu hình không gian đệm bộ nhớ trong cho một phiên sự kiện khi nó được khởi động ban đầu trên máy chủ và cấu hình của các tùy chọn phiên sự kiện xác định dung lượng bộ đệm bộ nhớ và kích thước tối đa của sự kiện mà phiên sự kiện có thể thu thập. Mặc dù hầu hết các sự kiện được tạo bởi Sự kiện mở rộng tương đối nhẹ và nhỏ ở định dạng nhị phân, nhưng các sự kiện cụ thể có thể tạo ra một khối lượng dữ liệu lớn hơn nhiều phải được lưu vào bộ đệm. Các tùy chọn phiên sự kiện mặc định dẫn đến cấu hình phiên có ba bộ đệm bộ nhớ trong để lưu giữ các sự kiện có kích thước 1.441.587 byte. Kích thước và số lượng bộ đệm bộ nhớ cho một phiên sự kiện có thể được tìm thấy trong DMV sys.dm_xe_sessions trong khi phiên STATE =START trên máy chủ:

 CHỌN 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; 

Lưu ý rằng không có bộ đệm lớn nào cho mỗi phiên sự kiện do hệ thống xác định và kích thước bộ đệm lớn cũng được đặt thành 0, đây là cấu hình mặc định. Bộ đệm lớn cho phiên sự kiện chỉ được tạo khi tùy chọn phiên MAX_EVENT_SIZE được định cấu hình cho phiên sự kiện. Giá trị mặc định cho tùy chọn này là 0, có nghĩa là sự kiện lớn nhất mà phiên sự kiện có thể thực sự sử dụng là kích thước của bộ đệm bộ nhớ thông thường, là 1.441.587 byte. Đối với một số sự kiện nhất định, chẳng hạn như những sự kiện tạo ra showplan_xml, thực sự tương đối dễ dàng để có kích thước sự kiện lớn hơn kích thước bộ đệm bộ nhớ mặc định cho phiên sự kiện. Trong những trường hợp này, sự kiện lớn sẽ thực sự bị phiên sự kiện loại bỏ vì nó không thể được đặt vào bộ đệm bộ nhớ để gửi đi.

Kiểm soát mất mát sự kiện

Có ba tùy chọn phiên cụ thể xác định mức độ lớn của một sự kiện mà một phiên sự kiện có thể thực sự thu thập và một tùy chọn kiểm soát cách sự kiện bị loại bỏ khi bộ nhớ đệm cho phiên sự kiện bị đầy hoặc bị áp lực. Tất cả bốn điều này đều quan trọng khi chúng ta đang nói về việc thu thập các sự kiện có thể tạo ra khối lượng sự kiện lớn và chúng tôi muốn giảm thiểu khả năng chúng tôi có thể bỏ qua một sự kiện. Dưới đây là một phiên sự kiện mẫu dễ bị mất sự kiện do áp lực bộ nhớ trong vùng đệm cho phiên sự kiện:

 TẠO PHIÊN BẢN SỰ KIỆN [Khóa] TRÊN MÁY CHỦ THÊM SỰ KIỆN sqlserver.lock_acquired, THÊM SỰ KIỆN sqlserver.lock_releasedADD MỤC TIÊU package0.event_file (SET filename =N'Locks ', max_file_size =(5), max_rollover_files =(4) =4096 KB, MEMORY_PARTITION_MODE =KHÔNG, EVENT_RETENTION_MODE =ALLOW_SINGLE_EVENT_LOSS, MAX_EVENT_SIZE =0 KB); 

Lưu ý:Đây không phải là phiên sự kiện mà tôi khuyên bạn nên chạy trên khối lượng công việc sản xuất - khối lượng dữ liệu mà nó tạo ra sẽ rất đáng kể, vì nó đang theo dõi mọi khóa thu được và phát hành.

Nếu chúng tôi bắt đầu phiên này và sau đó chạy trình tạo Khối lượng công việc trực tuyến AdventureWorks Books có sẵn trên blog của tôi dựa trên phiên bản của SQL Server, phiên sẽ nhanh chóng bắt đầu giảm các sự kiện do tạo sự kiện nhanh và sự chậm trễ trong quá trình tải bộ đệm đến đích event_file được cấu hình. Có thể theo dõi số lượng sự kiện đã bị giảm bởi một phiên sự kiện trong DMV sys.dm_xe_sessions nếu các tùy chọn phiên sự kiện đã được định cấu hình với EVENT_RETENTION_MODE =ALLOW_SINGLE_EVENT_LOSS. Nếu phiên sự kiện được định cấu hình với EVENT_RETENTION_MODE =ALLOW_MULTIPLE_EVENT_LOSS thì toàn bộ bộ nhớ đệm của các sự kiện có thể bị loại bỏ và nó chỉ đếm số lượng bộ đệm đã bị loại bỏ chứ không phải số lượng sự kiện riêng lẻ mà mỗi bộ đệm chứa.

 CHỌN 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_size 

Ở đây, chúng ta có thể thấy rằng 100.521 sự kiện đã bị loại bỏ và kích thước lớn nhất của sự kiện đã bị loại bỏ là 176 byte, nhỏ hơn kích thước của không gian đệm thông thường của chúng tôi, vì vậy chúng tôi chỉ đang đạt áp lực không gian bộ nhớ đệm thông thường. Tuy nhiên, nếu chúng tôi tạo một phiên sự kiện thu thập hai trong số các sự kiện trong kế hoạch (xem bài viết này để biết lý do tại sao điều này sẽ ảnh hưởng tiêu cực nghiêm trọng đến hiệu suất và không nên thực hiện trên máy chủ sản xuất), cùng với các sự kiện bắt đầu và hoàn thành hàng loạt và tạo ra một số sự kiện lớn hơn kế hoạch, chúng tôi có thể kích hoạt mất sự kiện do quy mô sự kiện.

 TẠO PHIÊN BẢN SỰ KIỆN [DropsEvents] TRÊN MÁY CHỦ THÊM SỰ KIỆN sqlserver.query_post_execution_showplan, THÊM SỰ KIỆN sqlserver.query_pre_execution_showplan, THÊM SỰ KIỆN sqlserver.sql_batch_completed, ADD EVENT sql 

Ở đây, chúng ta có thể thấy rằng kích thước lớn nhất_event_dropped_size lớn hơn kích thước thường_bộ đệm của chúng ta, vì vậy điều này có nghĩa là chúng ta cần thay đổi cấu hình bộ đệm phiên của mình. Nếu chúng tôi tăng MAX_MEMORY cho phiên sự kiện, điều đó có thể tăng kích thước bộ đệm thông thường của chúng tôi. Giá trị mặc định chỉ là 4MB, đó là kích thước bộ đệm 1,4MB hiển thị ở trên. Nếu chúng tôi thay đổi giá trị này thành 64MB cho phiên sự kiện, thì regular_buffer_size sẽ có kích thước 22,4MB, phù hợp với sự kiện bị giảm 3,7MB của chúng tôi. Tùy chọn khác là đặt tùy chọn MAX_EVENT_SIZE, tùy chọn cung cấp cỡ lớn_buffer_size cho các sự kiện lớn và được chia đôi cho phiên.

 TẠO PHIÊN BẢN SỰ KIỆN [CollectsEvents] TRÊN MÁY CHỦ THÊM SỰ KIỆN sqlserver.query_post_execution_showplan, THÊM SỰ KIỆN sqlserver.query_pre_execution_showplan, THÊM SỰ KIỆN sqlserver.sql_batch_completed_post_execution_showplan, ADD EVENT sqlserver.query_pre_ex mạt hạng 

Vì vậy, ở đây chúng tôi có thể thấy hai bộ đệm lớn với kích thước 33,6MB và sau khi chạy lại cùng một kế hoạch tạo khối lượng công việc, chúng tôi không có sự kiện bị giảm nào cho phiên CollectsEvents mới của mình, nhưng chúng tôi đã tăng gấp đôi số sự kiện bị giảm cho phiên DropsEvents của mình bằng cách sử dụng giá trị mặc định.

Vì vậy, bạn có nó; tại sao một số sự kiện nhất định có thể không được phiên sự kiện thu thập, cách xử lý sự cố khi các sự kiện bị gián đoạn và cách xác định xem đó có phải là quy mô của sự kiện đang gây ra sự cố hay không. Nhiều phiên mà tôi thấy trong thực tế sử dụng trên các hệ thống máy khách có các tùy chọn mặc định cho phiên sự kiện, đặc biệt là khi liên quan đến bộ nhớ. Đây là một lĩnh vực mà sau khi bạn hiểu cơ chế đệm được Sự kiện mở rộng sử dụng và sau đó xem xét quy mô của các sự kiện có thể được tạo ra, bạn sẽ bắt đầu thực hiện các thay đổi về cách xác định các tùy chọn phiên để giảm thiểu khả năng xảy ra các sự kiện bị loại bỏ do giới hạn không gian bộ nhớ hoặc hạn chế về kích thước sự kiện.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tạo và triển khai nhiều phiên bản cơ sở dữ liệu thông qua ảnh chụp nhanh lược đồ

  2. Cải thiện giải pháp trung bình hàng đầu / giảm dần hàng đầu

  3. Hướng dẫn Xây dựng và Triển khai Máy chủ Cơ sở dữ liệu Chung

  4. Cách làm tròn một số thành số nguyên gần nhất trong SQL

  5. Tạo một tập hợp hoặc trình tự không có vòng lặp - phần 3