Я хотел бы написать «умный монитор» на Java, который отправляет предупреждение каждый раз, когда он обнаруживает возникающие проблемы с производительностью. Мое приложение Java записывает данные в структурированном формате в файл журнала:
<datetime> | <java-method> | <seconds-to-execute>
Так, например, если бы у меня был метод Widget#doSomething(String)
, выполнение которого заняло 812 мс, он был бы зарегистрирован как:
2013-03-24 11:39:21 | Widget#doSomething(String) | 812
Когда производительность начинает снижаться (например, во время крупного сбора данных, во время пиковых нагрузок или если система просто замедляется до обхода), время выполнения метода начинает замедляться; поэтому самый правый столбец начинает видеть огромные числа (иногда 20-40 секунд для выполнения одного метода).
В колледже — для упражнения по машинному обучению — я написал то, что мой профессор назвал линейным дихотомизатором, который брал простые тестовые данные (рост, вес и пол человека) и «узнавал», как категоризировать человека. как мужчина или женщина в зависимости от их роста/веса. Затем, когда у него были все данные для обучения, мы снабдили его новыми данными, чтобы увидеть, насколько точно он может определить пол.
Я думаю, что многомерная версия линейного дихотомизатора называется машина опорных векторов (SVM). Если я не прав, то уточните, и я изменю название своего вопроса на что-то более подходящее. Несмотря ни на что, мне нужно это приложение, чтобы выполнять следующие действия:
- Run in a "test mode" where I feed it the structured log file from my main Java app (the one I wish to monitor) and it takes each log entry (as shown above) and uses it for test data
- Only the
java-method
andseconds-to-execute
columns are important as inputs/test data; I don't care about the datetime
- Only the
- Запуск в «режиме мониторинга», где он активно считывает новые данные журнала из файла журнала и использует аналогичные методы «машинного обучения», чтобы определить, не надвигается ли снижение производительности.
Важно отметить, что столбец seconds-to-execute
— не единственный важный фактор здесь, так как я видел ужасные тайминги для определенных методов в периоды потрясающей производительности и действительно отличные тайминги для других методов в периоды, когда казалось, что сервер вот-вот выйдет из строя. умереть и толкнуть маргаритки. Таким образом, очевидно, что некоторые методы являются "взвешенными"/более важными для производительности, чем другие.
Мой вопрос
- Поиск в Google «линейного дихотомизатора» или «машины опорных векторов» выдает несколько действительно страшных, высоко академических, ультрамозговых официальных документов, которые у меня просто нет ни умственной энергии (ни времени), чтобы их прочесть — если они действительно не являются моими единственными. опции; поэтому я спрашиваю есть ли введение в этот материал для непрофессионалов или отличный сайт/статья/руководство по созданию такой системы на Java?
- Существуют ли надежные/стабильные библиотеки Java с открытым исходным кодом? Мне удалось найти только
jlibsvm
иsvmlearn
, но первый, похоже, находится в чистом бета-состоянии, а второй, похоже, поддерживает только бинарные решения (как мой старый линейный дихотомизатор). Я знаю, что есть Mahout, но он находится поверх Hadoop, и я не думаю, что у меня достаточно данных чтобы гарантировать время и умственную энергию для настройки моего собственного кластера Hadoop.
Заранее спасибо!