Непрерывные системы
Время невозможно измерить в днях подобно тому, как деньги измеряются в песо и сентаво. Один песо равен другому песо, в то время как ценность каждого дня и даже каждого часа сильно разнится.Хорхе Луис Борхес, Хуан Муранья
В эпоху персональных компьютеров программное обеспечение было поставлено на конвейер (как песо и сентаво): уйма разновидностей, отчеканенные миллионами копий и выпущенные в оборот без какой-либо возможности собрать информацию о них. С другой стороны, каждая из них так же хороша, как и предыдущая. Если вы оптимизируете свою копию, то производительность увеличится во всех последующих. При условии, что пользователи обновятся до актуальной версии, конечно.
Но есть и другой вид программ, который стал набирать обороты 10-15 лет назад. Приложения в интернете больше похожи на электростанции. Это уникальный и сложный инструмент, который сплетен по сети с себе подобными, часть которых составляют люди.
В интернете у всех всегда одна и та же версия, это стало настолько круто, что начало прямо-таки вытеснять собой обычные приложения. Поэтому мы избавились от всех наработок, которые копились годами и переписали практически все под браузеры. Это все привнесло в мир программирования что-то новое. Чтобы понять, что именно, нам нужно перестать думать категориями компьютерных технологий и исследовать все происходящие процессы.
Когда самым главным компонентом вашей программы является весь мир и люди, его населяющие, вы не можете просто так исследовать ее у себя на компьютере. С другой стороны, никогда еще не было так просто собирать данные об использовании своего продукта. Вместо того чтобы выпускать по обновлению в год, вы можете делать незначительные изменения прямо на ходу и наблюдать эффект.
Есть и гибридные модели — мобильные приложения. Они совмещают в себе как старую, так и новую модель. Но в этот раз будем считать, что у нас на всех телефонах установлены автоматические обновления.
Точечные проверки на производительность совсем не работают в такой модели. Если вам нужно что-то измерить, придется измерять его постоянно. А потому вам необходим режим постоянного измерения в реальном времени. Эксперименты по производительности становятся настолько же простыми, как и поиск ошибок в программе с помощью специального программного обеспечения. Также такой режим избавляет вас от необходимости вообще что-либо предугадывать. Если вы упустили что-то сегодня — не беда. Вы всегда сможете начать завтра все сначала. Гибкость измерений и анализа является главным преимуществом.
Самое интересное, большинство сетевых приложений подвержены цикличности. Давайте посмотрим это на примере реальной электростанции. Первые часы после полуночи нагрузка ничтожно мала. Потом просыпаются люди. Будильники и радио начинают включаться (все в одно и то же время), потом электроплиты, офисные здания и фабрики. Работают лифты. Люди переезжают из одной части города в другую и начинают потреблять электричество там. Звенят звонки в школах. Отопление регулируется по погоде. Если нарисовать график недельного потребления электроэнергии, он будет выглядеть примерно так:
Больше всего нагрузки приходится на понедельник, когда все идут в школы и на работу. Пиковые часы приходятся на полдень, когда используется электричества вдвое больше чем, например, в 2 часа утра. Есть еще один мини-пик в 7 часов вечера, когда все приходят с работы домой. Легко заметить, что средний показатель за неделю практически бесполезен. Как и плотины, электростанции рассчитаны на пиковые нагрузки, а не на средние, и должны тщательно учитывать возможные колебания. Тоже происходит и с приложениями в сети.
Эти дневные и недельные циклы оказывают очень заметный эффект на устройства, программы и ваши измерения. Вот недельный график среднего уровня загрузки ЦП на запрос для приложения в интернете. Каждый раз, когда компьютер нагревается, это изнашивает его компоненты и сокращает срок его работы. Другие замеры тоже будут показывать цикличность в той или иной мере.
Поведение людей тоже в какой-то мере циклично. Они проверяют почту утром, а вечером играют в игры и смотрят фильмы. А что на счет банковских приложений? Пользователи, скорее всего, используют их круглосуточно. Тем не менее, пики сосредотачиваются ближе к пятницам, средине месяца и ближе к концу месяца. Банковские переводы смещаются чаще всего на день или два из-за задержки самих банков.
Так что учитывайте это в своих анализах, когда имеете дело с циклами. Когда сравниваете два показателя, лучше сравнивать их в один и тот же день недели и час. Быстрый тест в полночь, скорее всего, не покажет ничего. Запуск же тестов один за другим в один и тот же пик будет намного информативнее. Вот где нам может очень пригодиться A/B тестирование.
Отложенные вычисления
Есть несколько ловких трюков, которые помогут нам выжать из циклов все. Например, лучший способ снизить среднюю нагрузку — это выключать какие-то «тяжелые» функции в приложении на один час в неделю. На очень большом промежутке времени это не так глупо, как звучит. Еще один вариант — смещать задачи из пикового времени. Вам и правда так нужно делать рассылку прямо сейчас или это может подождать? Предварительные расчеты и кэширование данных звучат довольно дорого, при этом компьютерное время практически бесплатно.
Некоторые компании берут в долгосрочную аренду парк серверов для своих повседневных нужд, но в пиковые часы докупают мощности отдельно. Нельзя сказать, что почасовая аренда — дешевое удовольствие, это может с треском просадить ваш бюджет. Но если исследования показывают, что это оправданно, вы с таким походом даже сможете сэкономить. Естественно, учитывая, что вы на самом деле провели исследование.