Как тестировать и оптимизировать, когда вы не можете воспроизвести окружающую среду?

17

В прошлом я работал в разных средах. Настольные приложения, игры, встроенные компоненты, веб-службы, задания командной строки, веб-сайты, отчеты по базам данных и так далее. Все эти среды имеют общую черту: независимо от их сложности, независимо от их размера, у меня всегда может быть подмножество или часть приложения на моей машине или в среде разработчика для тестирования.

Сегодня я не. Сегодня я нахожусь в среде, основной задачей которой является масштабируемость. Воспроизведение окружающей среды непомерно дорого. Взяв часть окружения, хотя и правдоподобного (некоторые части должны были бы быть смоделированы или использованы в режиме одного экземпляра, который они не должны делать), это своего рода побеждает цель, поскольку затеняет параллелизм и загрузку, что реальная система встреч. Даже небольшая «тестовая» система имеет свои недостатки. Вещи будут вести себя по-разному, когда у вас есть 2 узла и когда у вас есть 64 узла.

Мой обычный подход к оптимизации (измерить, попробовать что-то, проверить правильность, измерить различия, повторить) на самом деле не работает, так как я не могу эффективно выполнить шаги 2 и 3 для частей проблемы, которые имеют значение (надежность параллелизма и производительность в нагрузка). Этот сценарий не кажется уникальным, хотя. Каков общий подход к выполнению такого рода задач в такой среде?

Есть несколько связанных вопросов:

  • этот вопрос связан с отсутствием аппаратного обеспечения (например, анализаторов спектра), которое можно (относительно) легко эмулировать.
  • этот вопрос касается отслеживания ошибок, которые существуют только в производственных средах, что полезно - но это другой вид деятельности.
Telastyn
источник
1
Краткий ответ: ответы на второй связанный вопрос также применимы. Больше регистрации не только поможет отладке, но также поможет протестировать и оптимизировать. Возможно, вам просто придется регистрировать разные вещи, особенно время выполнения и использование ресурсов.
Док Браун
Можете ли вы мультиплексировать части производственной среды между производством и тестированием?
Патрик
@DocBrown - конечно, но ведение журнала не поможет мне понять, будет ли альтернативная реализация правильной или более производительной в рабочем состоянии, пока она фактически не будет запущена в производство - что, безусловно, слишком поздно.
Теластин
2
Reproducing the environment is prohibitively costly.- Сколько стоит постановочная ошибка производства? Как насчет 2 ошибок? В непредсказуемое время (скорее всего, когда большинство пользователей одновременно загружают систему). Взвесьте это с затратами на настройку минимальной среды воспроизведения - вы, возможно, обнаружите, что она не слишком дорого в конце концов.
Джесс Телфорд
Почему-то у меня такое ощущение, что это просто означает, что система плохо спроектирована, организована. Если система хорошо организована и модульна, настройка тестового примера или сценария оптимизации не была бы prohibitively costly.
InformedA

Ответы:

11

На самом деле это сложно, но я уверен, что во многих сопоставимых ситуациях это в первую очередь организационная проблема. Единственный жизнеспособный подход - это, вероятно, смесь комбинированных мер, а не просто «одна серебряная пуля». Некоторые вещи, которые вы можете попробовать:

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

  • Проверьте то, что вы можете проверить заранее - тщательно, с большим предварительным планированием. Конечно, в производстве все будет иначе, но не во всем . Правильность другой реализации часто можно проверить заранее - если реализация хорошо масштабируется, это другой вопрос. Но планирование может сильно помочь. Тщательно продумайте проблемы, которые ваша тестовая среда может решить для вас, а какие нет. Практически всегда есть вещи, в которых вы, на первый взгляд, верите, что «это нельзя проверить заранее», но если подумать дважды, часто это становится еще более вероятным.

  • Работа в команде. При попытке нового подхода или идеи обсудите это хотя бы с одним человеком из вашей команды. Когда вы реализуете другой алгоритм, настаивайте на проверках кода и обеспечении качества. Чем больше ошибок и проблем вы можете избежать заранее, тем менее серьезные проблемы вам придется решать на производстве.

  • Поскольку вы не можете проверить все заранее, ожидайте появления проблем в производстве. Таким образом, попытайтесь подготовить действительно хорошую резервную стратегию при внедрении нового кода в производство. Если ваш новый код рискует работать медленнее, чем старое решение, или если он имеет риск сбоя, убедитесь, что вы можете перейти на предыдущую версию как можно скорее. Если есть риск уничтожения производственных данных, убедитесь, что у вас есть хорошее резервное копирование / восстановление. И убедитесь, что вы обнаруживаете такие сбои, добавив некоторый механизм проверки в вашу систему.

  • ведите дневник проекта или журнал решений - серьезно. Каждый день вы узнаете что-то новое об окружающей среде, записываете - истории успеха, а также истории неудач. Не делайте один и тот же провал дважды.

Таким образом, суть в том, что когда вы не можете использовать метод проб и ошибок, лучшим вариантом являются консервативный, классический метод предварительного планирования и методы обеспечения качества.

Док Браун
источник
6

Если вы не можете воспроизвести живую среду, неудобная реальность заключается в том, что, что бы вы ни делали, это не будет достаточно проверено.

Так что ты можешь сделать?

Ну, что бы ни масштабировалось, будь то процесс, кластер серверов или том базы данных, должны быть протестированы с нулевым, единым, правилом бесконечности, чтобы выявить потенциальные узкие места / ограничения, будь то ввод-вывод, ЦП, загрузка ЦП, интер -процесс связи и т. д.

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

Говоря об инструментах, разработчик не обязан загружать тестирование системы сверх того, что возможно в их среде разработки. Это должно быть выдвинуто на испытательный отдел или другое третье лицо.

Слон в комнате, конечно, в том, что системы не всегда масштабируются предсказуемым образом!

В прошлой жизни я был администратором баз данных для банковских баз данных с миллиардами строк и вооружен планами выполнения, которые мы обычно могли предсказать, как долго запросы будут занимать свободную базу данных с учетом входных объемов. Однако, как только эти тома достигнут определенного размера, план выполнения изменится, и производительность будет быстро ухудшаться, если запрос / база данных не будут настроены.

Робби Ди
источник
0

Я бы предложил эксперименты.

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

Это тот же цикл теория-эксперимент-мера, к которому вы привыкли, но его установка дороже - поскольку гипотезы должны выполняться в производстве - и в зависимости от вашего объема получение значительных данных из производства также может быть медленным.

orip
источник