diff --git a/case-study-template.md b/case-study-template.md new file mode 100644 index 0000000..fdb5fa5 --- /dev/null +++ b/case-study-template.md @@ -0,0 +1,49 @@ +## Case-study оптимизации + +### Актуальная проблема +В нашем проекте много тестов, прохождение которых занимается много времени. +В данный момент мы используем [turbo_tests](https://github.com/serpapi/turbo_tests), чтобы CI занимал вменяемое время, сейчас это примерно 5,5 минут. +Я решил посмотреть возможные проблемы. + +### Формирование метрики +Для того чтобы отслеживать изменения, я решил написать `rake task` в котором будет вычисляться время выполнения `turbo_tests` (в 5 потоков), сохраняться в InfluxDB, используя [influxer](https://github.com/palkan/influxer) для отправки данных, и выводить это на график в Chronograf, используя [sandbox](https://github.com/influxdata/sandbox) +При первом запуске получилось примерно 6 минут. +``` +Finished in 6 minutes 7 seconds (files took 6.67 seconds to load) +23269 examples, 0 failures, 757 pending +``` + +### Feedback-Loop +Для того, чтобы иметь возможность быстро проверять гипотезы я решил использовать часть тестов которые я хорошо знаю и которые с обычным запуском через `rspec` проходят сейчас за 25 секунд. + +### Вникаем в детали системы, чтобы найти главные точки роста +Для того, чтобы найти "точки роста" для оптимизации я воспользовался `test-prof`. + +Используя настройки TEST_RUBY_PROF и TEST_STACK_PROF (в формате json и сервисом speedscope.app) выявить какие либо проблемы не получилось. +FDOC показал несколько лишних созданных фабрик. +А вот FPROF показал кое что интересное. +``` +name total top-level total time time per call top-level time + + card 769 516 7.4789s 0.0097s 4.8298s + card_token 769 42 1.9425s 0.0025s 0.1034s +``` +Он показал что мы вместе с `card` создаем `card_token`, который хранит в себе некоторую дополнительную информацию, а данную информацию мы никак не используем в текущих тестах. +Так же был построен flamegraph +Factories before + +Проблема оказалось в том, что при создании `card` был добавлен `after(:build)` в котором создавался `card_token`. Данное создание вынес в дополнительный `trait :with_card_coken`. +Ещё раз запустил тесты, они как и ожидалось не упали и прошли за 20 секунд. +flamegraph теперь стал таким +Factories after + +Но, запустив все тесты, некоторые упали, и оказалось их было не так много. +После правки всех тестов и они стали проходить за примерно 4,5 минуты. +``` +Finished in 4 minutes 26.9 seconds (files took 7.01 seconds to load) +23269 examples, 0 failures, 757 pending +``` + +### Результаты +Получилось использовать `test-prof` в рабочем проекте, но, CI с правками не показал каких либо изменений (запускается в 20 потоков). +turbo_tests graph diff --git a/factory-flame-after.png b/factory-flame-after.png new file mode 100644 index 0000000..5a39e07 Binary files /dev/null and b/factory-flame-after.png differ diff --git a/factory-flame-before.png b/factory-flame-before.png new file mode 100644 index 0000000..5764c75 Binary files /dev/null and b/factory-flame-before.png differ diff --git a/turbo_tests_graph.png b/turbo_tests_graph.png new file mode 100644 index 0000000..724b9a5 Binary files /dev/null and b/turbo_tests_graph.png differ