|
23 | 23 | Вот как я построил `feedback_loop`: профилирование - изменение кода - тестирование – бенчмаркинг – откат при отсутствии разницы от оптимизации/сохранение результатов
|
24 | 24 |
|
25 | 25 | ## Вникаем в детали системы, чтобы найти главные точки роста
|
26 |
| -Для того, чтобы найти "точки роста" для оптимизации я воспользовался rack mini profiler |
| 26 | +Для того, чтобы найти "точки роста" для оптимизации я воспользовался rack mini profiler, bullet |
27 | 27 |
|
28 | 28 | Вот какие проблемы удалось найти и решить
|
29 | 29 |
|
30 | 30 | ### Ваша находка №1
|
31 |
| -- rack mini profiler показал, что N+1 проблему `SELECT "buses".* FROM "buses" WHERE "buses"."id" = $1 LIMIT $2; ` + `SELECT "services".* FROM "services" INNER JOIN "buses_services" ON "services"."id" = "buses_services"."service_id" WHERE "buses_services"."bus_id" = $1;` в `trips/_services.html.erb` (на 1004 рейса 690 sql buses + services) |
| 31 | +- bullet показал, что N+1 проблему `SELECT "buses".* FROM "buses" WHERE "buses"."id" = $1 LIMIT $2; ` + `SELECT "services".* FROM "services" INNER JOIN "buses_services" ON "services"."id" = "buses_services"."service_id" WHERE "buses_services"."bus_id" = $1;` |
32 | 32 | - делаю `.preload(bus: :services)` для `trips`
|
33 | 33 | - метрика снизилась до 6 секунд
|
34 | 34 | - количество sql запросов для `trips/index.html.erb` сократилось до 12
|
35 | 35 |
|
36 |
| -### Ваша находка 2 |
| 36 | +### Ваша находка № 2 |
37 | 37 | - rack mini profiler (и логи веб сервера) показал, что основное время тратится на рендеринг шаблонов `trips/index.html.erb 2091.1
|
38 | 38 | 4917.9`.
|
39 | 39 | - рендереринг всех коллекций через `render partial:`
|
40 |
| -- метрика снизилась до 1 секунды |
| 40 | +- метрика снизилась до 600мс |
41 | 41 | - `Rendering: trips/index.html.erb 716.2 975.7`
|
42 | 42 |
|
43 |
| -### Ваша находка 3 |
44 |
| -- rack mini profiler показал, что основное время занимает запрос в сервисы (около 400мс). |
45 |
| -- вместо habtm делаю промежуточную таблицу, для нее и делаю eager loading вмсто services. в контроллере достаю весь и собираю хэш-справочник (id=>name) сервисов и использую его во вью. |
46 |
| -- метрика особенно не снизилась |
47 |
| -- запрос пропал из логов профилировщика (вместо него показывается запрос в сервисы, около 25мс, что 8 раз меньше) |
48 |
| - |
49 |
| -### Ваша находка 4 |
| 43 | +### Ваша находка № 3 |
50 | 44 | - rack mini profiler показал, что производится и запрос по count, и идентичный по выборке данных.
|
51 | 45 | - меняю count на length.
|
52 | 46 | - метрика особенно не снизилась
|
53 | 47 | - запрос count пропал из логов профилировщика
|
54 | 48 |
|
55 |
| -### Ваша находка № 5 |
56 |
| -- rack mini profiler показал, что долго выполняются запросы `SELECT "buses_services".* FROM "buses_services" WHERE "buses_services"."bus_id" IN ($1, <...>` (делаю explain, он показывает `Seq Scan on buses_services` как основную точку роста),`` |
57 |
| -- Добавляю индекс на `bus_id` |
58 |
| -- как изменилась метрика |
59 |
| -- как изменился отчёт профилировщика - исправленная проблема перестала быть главной точкой роста? |
60 |
| - |
61 |
| - |
| 49 | +### Ваша находка № 4 |
| 50 | +- rack mini profiler показал, что долго выполняются запрос ` SELECT "trips".* FROM "trips" WHERE "trips"."from_id" = $1 AND "trips"."to_id" = $2 ORDER BY "trips"."start_time" ASC` (делаю explain, он показывает `Seq Scan on trips` как основную точку роста), |
| 51 | +- Добавляю индекс на связку `from_id`/`to_id`/`start_time` |
| 52 | +- метрика особенно не снизилась |
| 53 | +- время работы запроса снизилось с 18 до 2.5мс |
62 | 54 |
|
63 | 55 | ## Результаты
|
64 | 56 | В результате проделанной оптимизации наконец удалось обработать файл с данными.
|
65 |
| -Удалось улучшить метрику системы с *того, что у вас было в начале, до того, что получилось в конце* и уложиться в заданный бюджет. |
| 57 | +Удалось улучшить метрику системы с 13.3с до 0.6с. |
66 | 58 |
|
67 | 59 | ## Защита от регрессии производительности
|
68 | 60 | Для защиты от потери достигнутого прогресса при дальнейших изменениях программы *о performance-тестах, которые вы написали*
|
0 commit comments