Cách đơn giản để xác định thuật toán tăng đột biến trong các lỗi đã ghi


29

Chúng tôi cần một hệ thống cảnh báo sớm. Tôi đang làm việc với một máy chủ được biết là có vấn đề về hiệu năng khi tải. Lỗi được ghi lại trong cơ sở dữ liệu cùng với dấu thời gian. Có một số bước can thiệp thủ công có thể được thực hiện để giảm tải máy chủ, nhưng chỉ khi ai đó biết về vấn đề này ...

Đưa ra một tập hợp các lỗi xảy ra, làm thế nào tôi có thể xác định bắt đầu tăng đột biến trong các lỗi (trong thời gian thực)? Chúng tôi có thể tính toán định kỳ hoặc trên mỗi lần xảy ra lỗi.

Chúng tôi không quan tâm đến các lỗi thỉnh thoảng, nhưng không có ngưỡng cụ thể. Tôi chỉ có thể thông báo cho ai đó bất cứ khi nào chúng tôi nhận được, nói, ba lỗi trong năm phút, nhưng tôi chắc chắn có cách tốt hơn ...

Tôi muốn có thể điều chỉnh độ nhạy của thuật toán dựa trên phản hồi từ các sysadmin. Hiện tại, họ muốn nó khá nhạy cảm, mặc dù chúng tôi biết rằng chúng tôi có thể mong đợi một số tích cực sai.

Tôi không phải là một nhà thống kê, điều mà tôi chắc chắn là hiển nhiên, và việc thực hiện điều này cần tương đối đơn giản với các công cụ hiện có của chúng tôi: SQL Server và ASP JScript cũ. Tôi không tìm kiếm câu trả lời trong mã, nhưng nếu nó yêu cầu phần mềm bổ sung, có lẽ nó sẽ không hoạt động đối với chúng tôi (mặc dù tôi hoan nghênh các giải pháp không thực tế nhưng lý tưởng như một nhận xét, vì sự tò mò của riêng tôi).


1
Điều này có vẻ hữu ích với mọi người, vì vậy tôi sẽ để lại tiêu đề như hiện tại, nhưng tôi nghĩ "tăng đột biến" là sai lệch. Những gì chúng tôi đã thực sự tìm kiếm là một điểm uốn hoặc tăng tương đối.
dbenton

Câu trả lời:


44

Đã 5 tháng kể từ khi bạn hỏi câu hỏi này, và hy vọng bạn đã tìm ra điều gì đó. Tôi sẽ đưa ra một vài gợi ý khác nhau ở đây, hy vọng rằng bạn sẽ tìm thấy một số sử dụng cho chúng trong các tình huống khác.

Đối với trường hợp sử dụng của bạn, tôi không nghĩ rằng bạn cần xem xét các thuật toán phát hiện đột biến.

Vì vậy, đây là: Hãy bắt đầu với một hình ảnh về các lỗi xảy ra trên dòng thời gian:

Biểu đồ lỗi

Những gì bạn muốn là một chỉ số bằng số, một "thước đo" về tốc độ của các lỗi đang đến. Và biện pháp này có thể được chấp nhận để đập - các hệ thống của bạn sẽ có thể đặt giới hạn kiểm soát với những lỗi nhạy cảm nào chuyển thành cảnh báo.

Biện pháp 1

Bạn đã đề cập đến "gai", cách dễ nhất để tăng đột biến là vẽ biểu đồ trong mỗi khoảng thời gian 20 phút:

Biểu đồ lỗi

Sysadins của bạn sẽ đặt độ nhạy dựa trên độ cao của các thanh, nghĩa là hầu hết các lỗi có thể chấp nhận được trong khoảng thời gian 20 phút.

(Tại thời điểm này, bạn có thể tự hỏi nếu không thể điều chỉnh độ dài cửa sổ 20 phút. Nó có thể và bạn có thể nghĩ về độ dài cửa sổ khi xác định từ cùng nhau trong các lỗi cụm từ xuất hiện cùng nhau .)

Vấn đề với phương pháp này cho kịch bản cụ thể của bạn là gì? Chà, biến của bạn là một số nguyên, có thể nhỏ hơn 3. Bạn sẽ không đặt ngưỡng của mình thành 1, vì điều đó chỉ có nghĩa là "mọi lỗi là một cảnh báo" không yêu cầu thuật toán. Vì vậy, các lựa chọn của bạn cho ngưỡng sẽ là 2 và 3. Điều này không mang lại cho hệ thống của bạn nhiều quyền kiểm soát chi tiết.

Biện pháp 2

Thay vì đếm lỗi trong cửa sổ thời gian, hãy theo dõi số phút giữa lỗi hiện tại và lỗi cuối cùng. Khi giá trị này quá nhỏ, điều đó có nghĩa là lỗi của bạn đang trở nên quá thường xuyên và bạn cần đưa ra cảnh báo.

Sự khác biệt về thời gian

Sysadins của bạn có thể sẽ đặt giới hạn ở mức 10 (nghĩa là nếu các lỗi xảy ra cách nhau dưới 10 phút thì đó là một vấn đề) hoặc 20 phút. Có thể 30 phút cho một hệ thống ít nhiệm vụ quan trọng.

Biện pháp này cung cấp sự linh hoạt hơn. Không giống như Biện pháp 1, có một tập hợp nhỏ các giá trị bạn có thể làm việc cùng, giờ đây bạn có một thước đo cung cấp 20-30 giá trị tốt. Sysadins của bạn do đó sẽ có nhiều phạm vi để tinh chỉnh.

Lời khuyên thân thiện

Có một cách khác để tiếp cận vấn đề này. Thay vì nhìn vào các tần số lỗi, có thể dự đoán các lỗi trước khi chúng xảy ra.

Bạn đã đề cập rằng hành vi này đã xảy ra trên một máy chủ duy nhất, được biết là có vấn đề về hiệu suất. Bạn có thể theo dõi một số chỉ số hiệu suất chính trên máy đó và để chúng thông báo cho bạn biết khi nào sẽ xảy ra lỗi. Cụ thể, bạn sẽ xem xét mức độ sử dụng CPU, Sử dụng bộ nhớ và KPI liên quan đến Đĩa I / O. Nếu mức sử dụng CPU của bạn vượt 80%, hệ thống sẽ chậm lại.

(Tôi biết bạn nói rằng bạn không muốn cài đặt bất kỳ phần mềm nào và đúng là bạn có thể làm điều này bằng PerfMon. Nhưng có những công cụ miễn phí ngoài đó sẽ làm điều này cho bạn, như NagiosZenoss .)

Và đối với những người đến đây với hy vọng tìm thấy điều gì đó về phát hiện đột biến trong một chuỗi thời gian:

Phát hiện đột biến trong một chuỗi thời gian

Điều đơn giản nhất bạn nên bắt đầu bằng cách tính trung bình di động của các giá trị đầu vào của bạn. Nếu chuỗi của bạn là , thì bạn sẽ tính trung bình di chuyển sau mỗi lần quan sát là:x1,x2,...

Mk=(1α)Mk1+αxk

trong đó sẽ xác định trọng lượng cho giá trị mới nhất của .x kαxk

Nếu giá trị mới của bạn đã di chuyển quá xa so với trung bình di chuyển, chẳng hạn

xkMkMk>20%

sau đó bạn đưa ra một cảnh báo.

Di chuyển trung bình là tốt đẹp khi làm việc với dữ liệu thời gian thực. Nhưng giả sử bạn đã có một loạt dữ liệu trong một bảng và bạn chỉ muốn chạy các truy vấn SQL dựa trên nó để tìm các gai.

Tôi muốn đề nghị:

  1. Tính giá trị trung bình của chuỗi thời gian của bạn
  2. Tính độ lệch chuẩn σ
  3. Cô lập các giá trị lớn hơn trên giá trị trung bình (bạn có thể cần điều chỉnh hệ số đó là "2")2σ

Nhiều thứ thú vị hơn về chuỗi thời gian

  1. Nhiều chuỗi thời gian trong thế giới thực thể hiện hành vi tuần hoàn. Có một mô hình được gọi là ARIMA giúp bạn trích xuất các chu kỳ này từ chuỗi thời gian của bạn.

  2. Di chuyển trung bình có tính đến hành vi theo chu kỳ: Holt và Winters


Cảm ơn câu trả lời thấu đáo và giáo dục. Cuối cùng chúng tôi đã viết một thủ tục được lưu trữ để ghi lại từng lỗi vào cơ sở dữ liệu và trả về số lỗi trong X cuối cùng (chúng tôi đã giải quyết trong 5) phút. Nếu con số đó vượt quá ngưỡng của chúng tôi, Y, một email cảnh báo đã được gửi. Chúng tôi điều chỉnh ngưỡng bằng thử nghiệm cho đến khi chúng tôi hài lòng với nó. Nếu tôi làm việc đó, tôi sẽ kết hợp đề xuất của bạn về việc đếm thời gian giữa các lỗi để có độ chi tiết cao hơn.
dbenton

8
Hội trường danh vọng trả lời, vỗ tay . Tham gia cộng đồng này chỉ để nâng cao điều này.
wesanyer

3

+1 để kiểm soát quá trình thống kê, có một số thông tin hữu ích ở đây trên Bước phát hiện .

Đối với SPC, không quá khó để viết một bản thực thi Quy tắc điện phương Tây hoặc Quy tắc Nelson .

Chỉ cần tạo một USP trong máy chủ SQL sẽ lặp qua một tập dữ liệu và ping từng điểm theo các quy tắc sử dụng các điểm lân cận của nó. Có thể tổng hợp số lỗi theo giờ (tùy theo nhu cầu của bạn).


Loại này liên quan đến một câu hỏi tôi đã đăng trên Stack Overflow một thời gian trước (vừa viết một câu trả lời nhanh nếu nó giúp): Biểu đồ kiểm soát quy trình thống kê trong SQL Server 2008 R2


2

Tìm kiếm các thuật toán phát hiện trực tuyến sẽ là một sự khởi đầu.

Thêm thông tin về luồng stackover: Dection đỉnh của tín hiệu đo

Một triển khai python của một thói quen phát hiện đỉnh ngây thơ sẽ được tìm thấy tại github


Tôi đã tìm kiếm các thuật toán phát hiện trực tuyến , và hầu hết tìm thấy các bài báo học thuật nằm trên đầu tôi. Họ có thể giữ câu trả lời, nhưng không vượt qua bài kiểm tra "đơn giản" cá nhân của tôi. Sửa lỗi cho tôi nếu tôi sai, nhưng tôi không nghĩ rằng tôi đang tìm kiếm một thuật toán phát hiện cực đại. Một khi các lỗi đã lên đến đỉnh điểm, có vẻ như theo định nghĩa, tôi đã bỏ lỡ cơ hội của mình để cải thiện vấn đề tồi tệ nhất. Xin lỗi nếu việc sử dụng "tăng đột biến" của tôi là khó hiểu. Tôi đoán tôi cần dự đoán sự gia tăng lỗi liên tục hoặc xác định một bước tiến lớn.
dbenton

1

Bạn có thể muốn xem xét kiểm soát quá trình thống kê. Hoặc theo dõi chuỗi thời gian. Có rất nhiều công việc theo hướng này, và câu trả lời tối ưu có lẽ phụ thuộc rất nhiều vào chính xác những gì bạn đang làm (bạn có cần lọc ra các mùa vụ hàng năm hoặc hàng tuần trước khi phát hiện ra sự bất thường, v.v.).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.