Статьи

OptaPlanner — Как быстро ведется регистрация?

Сколько стоит ведение журнала трассировки / отладки в производстве? Какова производительность при записи в файл? В этих тестах я сравниваю влияние производительности на уровни ведения журналов ( error , warn , info , debug , trace ) и добавление журналов (консольное приложение, файловое приложение) в нескольких реальных случаях использования OptaPlanner .

Методология сравнения

  • Реализация ведения журнала: SFL4J 1.7.2 с Logback 1.0.9 (Logback — духовный преемник Log4J 1)
  • Конфигурация журнала ( logback.xml ):
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
 
  <appender name="appender" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d [%t] %-5p %m%n</pattern>
    </encoder>
  </appender>
 
  <logger name="org.optaplanner" level="info"/>
 
  <root level="warn">
    <appender-ref ref="appender"/>
  </root>
 
</configuration>

Что приводит к выводу, как это:

1
2
3
4
2015-02-23 08:07:35,310 [main] INFO  Solving started: time spent (18), best score (uninitialized/0hard/0soft), environment mode (REPRODUCIBLE), random (JDK with seed 0).
2015-02-23 08:07:35,363 [main] INFO  Construction Heuristic phase (0) ended: step total (6), time spent (71), best score (0hard/-5460soft).
2015-02-23 08:07:35,641 [main] INFO  Local Search phase (1) ended: step total (1), time spent (349), best score (0hard/-5460soft).
2015-02-23 08:07:35,652 [main] INFO  Solving ended: time spent (360), best score (0hard/-5460soft), average calculate count per second (905), environment mode (REPRODUCIBLE).
  • Аргументы VM: -Xmx1536M -server
    Программное обеспечение: Linux 3.2.0-59-generic-pae
    Аппаратное обеспечение: Intel® Xeon® CPU W3550 @ 3.07GHz
  • Каждый прогон решает 13 проблем планирования с OptaPlanner . Каждая проблема планирования длится 5 минут. Он начинается с 30-секундного прогрева JVM, который сбрасывается.
  • Решение проблемы планирования не требует ввода-вывода (за исключением нескольких миллисекунд во время запуска для загрузки ввода). Один процессор полностью насыщен. Он постоянно создает много недолговечных объектов, и GC собирает их впоследствии.
  • Тесты измеряют количество баллов, которое можно рассчитать за миллисекунду. Чем выше, тем лучше. Расчет баллов для предлагаемого решения по планированию нетривиален: он включает в себя множество вычислений, в том числе проверку на конфликты между каждым объектом и любым другим объектом.

Чтобы воспроизвести эти тесты локально, соберите optaplanner из исходного кода и запустите основной класс GeneralOptaPlannerBenchmarkApp .

Уровни ведения журнала: error , warn , info , debug и trace

Я запускал один и тот же набор тестов несколько раз с другим уровнем ведения журнала OptaPlanner :

1
<logger name="org.optaplanner" level="error|warn|info|debug|trace"/>

Все остальные библиотеки (включая Drools ) были настроены на ведение журнала предупреждений. Детальность ведения журнала в OptaPlanner сильно различается на уровне:

  • error и warn : 0 строк
  • info : 4 строки на тест, поэтому менее 1 строки в минуту .
  • debug : 1 строка за шаг, поэтому примерно 1 в секунду для поиска по Табу и более для позднего принятия
  • trace : 1 строка за ход, поэтому от 1к до 120к в секунду

Это необработанные контрольные цифры, измеряемые в подсчете вычисления среднего балла в секунду (чем выше, тем лучше):

Уровень ведения журнала Облако 200с Облако 800с Машина Б1 Машина B10 Курс с7 Курс с8 Экзамен S2 Экзамен S3 Медсестра М1 Медсестра mh1 Sport nl14
ошибка 66065 61866 119230 32759 6282 8370 10330 7121 4001 3718 1248
предостерегать 66943 62191 122678 32688 6297 8303 10517 7182 3942 3660 1278
Информация 67393 63192 123734 32461 6188 8299 10330 7108 3944 3654 1252
отлаживать 60254 55938 118917 32735 6054 8062 10310 7104 3904 3586 1244
след 25159 25214 40346 20629 5585 7347 9229 6642 3360 3138 1156
Масштаб набора данных 120k 1920k 500k 250000k 217k 145k 1705k 1613k 18k 12k 4k
Алгоритм Позднее принятие Позднее принятие Табу Поиск Табу Поиск Позднее принятие Позднее принятие Табу Поиск Табу Поиск Табу Поиск Табу Поиск Табу Поиск

Я игнорирую разницу между ошибкой, предупреждением и регистрацией информации: разница не более 4%, прогоны воспроизводимы на 100%, и я не использовал компьютер во время бенчмаркинга, поэтому я полагаю, что в разнице можно обвинить компиляция точки доступа JIT или удача процессора.

Сколько стоит включение ведения журнала отладки или трассировки в производительности (в отличие от ведения журнала информации)?

loggingLevelSlowerThanInfo

Уровень ведения журнала Облако 200с Облако 800с Машина Б1 Машина B10 Курс с7 Курс с8 Экзамен S2 Экзамен S3 Медсестра М1 Медсестра mh1 Sport nl14
отлаживать -10,59% -11,48% -3,89% 0,84% -2,17% -2,86% -0,19% -0,06% -1,01% -1,86% -0,64%
след -62,67% -60,10% -67,39% -36,45% -9,74% -11,47% -10,66% -6,56% -14,81% -14,12% -7,67%
Масштаб набора данных 120k 1920k 500k 250000k 217k 145k 1705k 1613k 18k 12k 4k
Алгоритм Позднее принятие Позднее принятие Табу Поиск Табу Поиск Позднее принятие Позднее принятие Табу Поиск Табу Поиск Табу Поиск Табу Поиск Табу Поиск

Регистрация трассировки почти в 4 раза медленнее! Влияние ведения журнала отладки намного меньше, но все же заметно во многих случаях. Сценарии использования, использующие Late Acceptance (балансировка облачных вычислений и планирование курса), которые, следовательно, делают больше ведения журнала отладки, по-видимому, имеют более высокую потерю производительности (хотя это может быть в глазах смотрящего).

Но подождите секунду! В этих тестах используется консольный приложение. Что если они используют файловый аппендер, как в производстве?

Регистрация дополнений: добавление в консоль или файл

На рабочем сервере добавление в консоль часто означает потерю информации журнала, когда она попадает в /dev/null . Также во время разработки консольный буфер IDE может переполниться, что приведет к потере строк журнала. Одним из способов избежать этих проблем является настройка файлового приложения. Чтобы сэкономить место на диске, я использовал приложение для добавления файлов, которое сжимает старые файлы журналов в zip-файлы размером 5 МБ:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
<appender name="appender" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>local/log/optaplanner.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
      <fileNamePattern>local/log/optaplanner.%i.log.zip</fileNamePattern>
      <minIndex>1</minIndex>
      <maxIndex>3</maxIndex>
    </rollingPolicy>
    <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
      <maxFileSize>5MB</maxFileSize>
    </triggeringPolicy>
    <encoder>
      <pattern>%d [%t] %-5p %m%n</pattern>
    </encoder>
  </appender>

Это необработанные контрольные цифры, измеренные снова при подсчете среднего значения в секунду (чем выше, тем лучше):

Регистрация приложений и уровня Облако 200с Облако 800с Машина Б1 Машина B10 Курс с7 Курс с8 Экзамен S2 Экзамен S3 Медсестра М1 Медсестра mh1 Sport nl14
Информация о консоли 67393 63192 123734 32461 6188 8299 10330 7108 3944 3654 1252
Информация о файле 66497 63065 123758 33195 6302 8338 10467 7238 4022 3706 1256
Консольная отладка 60254 55938 118917 32735 6054 8062 10310 7104 3904 3586 1244
Отладка файла 55248 52261 122144 31220 6223 8241 10482 7118 3945 3589 1238
Трассировка консоли 25159 25214 40346 20629 5585 7347 9229 6642 3360 3138 1156
Трассировка файлов 10162 10708 12528 9555 4416 5167 6764 5532 2789 2678 1101

Сколько стоит файл appender по производительности (по сравнению с консольным приложением)?

fileAppendingSlowerThanConsoleAppending

Уровень ведения журнала Облако 200с Облако 800с Машина Б1 Машина B10 Курс с7 Курс с8 Экзамен S2 Экзамен S3 Медсестра М1 Медсестра mh1 Sport nl14
Информация -1,33% -0,20% 0,02% 2,26% 1,84% 0,47% 1,33% 1,83% 1,98% 1,42% 0,32%
отлаживать -8,31% -6,57% 2,71% -4,63% 2,79% 2,22% 1,67% 0,20% 1,05% 0,08% -0,48%
след -59,61% -57,53% -68,95% -53,68% -20,93% -29,67% -26,71% -16,71% -16,99% -14,66% -4,76%

Для регистрации информации это не имеет большого значения. Для ведения журнала отладки есть заметное замедление для меньшинства случаев. Регистрация трассировки выполняется почти в 4 раза медленнее! И это соответствует нашему предыдущему наблюдению: в худшем случае (переназначение компьютера B1) регистрация трассировки в файл на 90% медленнее, чем запись информации в консоль.

Вывод

Как и вся диагностическая информация, регистрация ведется за счет снижения производительности. Хорошие библиотеки тщательно выбирают уровень регистрации каждого оператора, чтобы сбалансировать диагностические потребности, многословность и влияние на производительность.

Вот моя рекомендация для пользователей OptaPlanner : В разработке используйте по умолчанию debug (или trace ) с консольным приложением, чтобы вы могли видеть, что происходит. В производстве по умолчанию используйте ведение журнала warn (или info ) с файловым приложением, чтобы сохранить важную информацию.

Ссылка: OptaPlanner — Как быстро ведется регистрация? от нашего партнера JCG Джеффри Де Смета в блоге OptaPlanner .