Я хотел бы написать "умный монитор" на Java, который отправляет предупреждение в любое время, когда обнаруживает возникающие проблемы с производительностью. Приложение My Java записывает данные в структурированный формат в файл журнала:
<datetime> | <java-method> | <seconds-to-execute>
Итак, например, если у меня был метод Widget#doSomething(String)
, который выполнял 812ms для выполнения, он записывался бы как:
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
По мере того, как производительность начинает ухудшаться (например, во время основной коллекции, во время пиковых нагрузок или если система просто замедляется до обхода), время выполнения метода начинает замедляться; поэтому в самом правом столбце начинают появляться огромные числа (иногда 20-40 секунд для выполнения одного метода).
В колледже - для упражнений по обучению машинам - я написал то, что мой профессор назвал линейным дихотомизатором, который взял простые тестовые данные (рост, вес и пол человека) и "научил", как классифицировать человека как мужчину или женщину исходя из их высоты/веса. Затем, когда у него были все данные по обучению, мы подали ему новые данные, чтобы узнать, насколько точно он может определить пол.
Я думаю, что многомерная версия линейного дихотомизатора называется векторной машиной поддержки (SVM). Если я ошибаюсь, пожалуйста, уточните, и я изменю заголовок моего вопроса на что-то более подходящее. Независимо, мне нужно это приложение, чтобы сделать следующее:
- Запуск в "тестовом режиме", когда я передаю его структурированный файл журнала из моего основного приложения Java (тот, который я хочу отслеживать), и он берет каждую запись в журнале (как показано выше) и использует ее для тестовых данных
- В качестве входных/тестовых данных важны только столбцы
java-method
иseconds-to-execute
; Меня не волнует datetime
- В качестве входных/тестовых данных важны только столбцы
- Запуск в "режиме монитора", где он активно считывает новые данные журнала из файла журнала и использует аналогичные методы "машинного обучения", чтобы определить, наступает ли ухудшение производительности.
Важно отметить, что столбец seconds-to-execute
не является единственным важным фактором здесь, поскольку я видел ужасные тайминги для определенных методов в периоды огромной производительности и действительно отличные тайминги для других методов в моменты, когда сервер казался как будто он собирался умереть и толкнуть маргаритки. Поэтому очевидно, что определенные методы "взвешены" /важнее производительности, чем другие.
Мой вопрос
- Googling для "линейного дихотомизера" или "машины поддержки векторов" превращает некоторые действительно страшные, высокоученые, ультра-мозговые белые бумаги, которые я просто не имею, чтобы потреблять психическую энергию (или время) - если они действительно мои варианты; поэтому я прошу, чтобы было введение мирян в этот материал или отличный сайт/статья/учебник по созданию такой системы в Java?
- Есть ли твердые/стабильные библиотеки Java с открытым исходным кодом? Я смог найти
jlibsvm
иsvmlearn
, но первый из них выглядит чистым бета-состояние, и последнее, похоже, поддерживает только двоичные решения (например, мой старый линейный дихотомизатор). Я знаю там Mahout, но это сидит на вершине Hadoop, и я не думаю, что у меня достаточно данных, чтобы гарантировать время и умственную энергию в настройку моего собственного кластера Hadoop.
Спасибо заранее!