За лаштунками закритого бета-тестування Skyforge



Сьогодні я хочу розповісти про першої частини закритого бета-тестування (ЗБТ) Skyforge. Це вже не перше ЗБТ, але зате воно стало наймасовішим. Більшість гравців становлять не співробітники компанії і їхні друзі, а шанувальники гри, вибрані випадково з числа зареєстрованих для участі в тесті, а так само ті, що купили або виграли набори раннього доступу. З вечора п'ятниці, 6 лютого, і до кінця вихідних буде організований спеціальний бета-вікенд, під час якого доступ на ЗБТ буде відкрито всім користувачам, що мають акаунт у пошті Mail.Ru. Цей пост носить розповідний характер і передає мою особисту точку зору на що відбувалися до і під час ЗБТ події.

Підготовка до ЗБТ
Перші тести Skyforge проводилися виключно всередині команди розробників, все робили своїми силами. З плином часу гра ставала стабільніше, відповідно, і розширювався коло осіб, допущених до тестування. Спершу ми показали гру колегам по Тільки Team. Потім — ігрового департаменту Mail.Ru Group. Потім — всьому колективу компанії. Починаючи з цього етапу, усі тести вже проводилися окремою командою, командою оперування. Зовнішні тести йшли на стенді, який готувався до проведення ЗБТ і, згодом, ОБТ.

Для того щоб закрите бета-тестування було продуктивним, ми ретельно готували нашу інфраструктуру. Проводили навантажувальні тести на серверах ЗБТ, налаштовували збір різних метрик, прийом крашей, аналіз логів і багато іншого. І ось, коли все було готове, ми відкрили заслінку і впустили перших реальних користувачів.

Перші миті
Як тільки почали заходити гравці, ми відразу стали шукати трансляцію на Twitch, щоб побачити реакцію користувачів, зрозуміти, наскільки добре справляється сервер, та й просто з цікавості. Велика частина студії дивилася трансляцію нічого не підозрює геймера, а якісь поради на правах звичайного користувача йому давав навіть директор з якості. Ми почали отримувати перші звіти з бойових серверів — проблеми з авторизацією на веб-порталі, краши клієнта, помилки підключення окремих гравців. Але, в цілому, старт пройшов успішно: аккаунт-сервер впорався, а сервера ігрової механіки не гальмували. Що, втім, не дивно, тому що потужності заліза, за нашими даними, повинно було вистачити і на куди більшу кількість користувачів.

Патчим на живу
Нам пощастило, що сервер Skyforge написаний на Java. Ця мова нативно підтримує механізм HotSwap, гарячу заміну коду без зупинки програми. Так як серверів у нас досить багато, то ми навіть написали спеціальну утиліту, яка пробігає по них і патчіть. Цей інструмент став нам у пригоді вже під час старту ЗБТ. Коли ми зрозуміли, що у нас є баг при завантаженні користувальницьких аватарок для чатика, то просто закомментировали дану функціональність.



Для користувачів втрата аватарки залишилася майже непоміченою, зате деяких серверів жити стало значно легше. У наступному ж патчі цю функціональність вимкнули відразу.

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

Труднощі клієнта
З точки зору тестування сервера, на щастя, пощастило набагато більше, ніж клієнту. Ми знаємо специфікацію заліза, на якому сервер буде працювати, знаємо точне оточення, самі ставимо налаштування. Клієнтові в цьому плані набагато складніше. В ході розробки у нас є 10-20-30 різних конфігурацій ПК, на якому запускається клієнт. Це комп'ютери самих розробників. Після виходу в світло кількість конфігурацій йде на тисячі. І у кожної з них можуть бути свої особливості: екзотичні драйвери відеокарти та інші компоненти. Тому перша хвиля нових гравців стала жертвою масових крашей і проблем з продуктивністю. Але завдяки нашій системі збору статистики по залізу і продуктивності вдалося оперативно внести необхідні поліпшення. Зараз вся робота команди також спрямована на покращення стабільності і збільшення FPS.



Саме за таким тепловим картками ми оцінюємо FPS гравців на відкритих зонах.

Труднощі сервера
Вихід тестування за межі кола друзів і членів сім'ї познайомив команду сервера з деякими дивацтвами реального світу. Так, наприклад, кілька користувачів страждали із-за особливостей своєї мережевої інфраструктури — новому з'єднанню діставався новий зовнішній IP. Таким чином, коли гравець переміщуватися з однієї карти на іншу, у нього змінювався IP. І ми його чесно відключали від сервера, т. к. вважали цю ситуацію невалидной. Але вже після кількох поставлених тікетів довелося відключити перевірку IP в рамках однієї сесії як надмірно параноїдальну. Інші перевірки валідності користувача ми залишили.

Якщо ви читали статтю про архітектуру нашого сервера, то знаєте, що він складається з безлічі розподілених серверів, кожен з яких живе на своєму хості і виконує певну роль: сервер авторизації, сервер ігрової механіки, сервер баз даних і так далі. При розробці ми намагалися робити так, щоб падіння окремо взятого сервера не було фатальним і більшість користувачів могли продовжувати грати. Але реальність виявилася жорсткішою, ніж ми думали.



Іноді сервера падають цілими стійками. Перший раз нам «пощастило», коли повністю знеструмилася стійка з порталом і декількома серверами ігрової механіки. Ми вважали, що гравці поведуть себе так: ті, кому не пощастило опинитися на знеструмлених серверах, спокійно перезаходят в гру і продовжують грати далі, щоправда, втративши прогрес проходження персональних карток, які залишилися на померлою механіці. На жаль, так як виключення було нештатним і хости механік зникли повністю, сервер-координатор не отримав повідомлення про розрив з'єднання. Особисто для мене це було не саме очікуване поведінка TCP keep-alive. Виявилося, що keep-alive починає відправляти пакети з неактивним TCP-з'єднань після закінчення деякого (за замовчуванням — дуже тривалого) таймауту. Це зроблено для того, щоб не захаращувати канал, коли все добре. В принципі, можна було виставити значення часу очікування для кожного підключення індивідуально, але для цього потрібні були брудні хакі. Тому ми домовилися зробити своє рішення: простий механізм пінг-понг опитування серверів. Його плюс в тому, що адміни на віддалених територіях не зможуть його випадково відключити, на відміну від TCP keep-alive, а ми можемо відключати сервери, які пішли, наприклад, в серію Full GC.

Після того як ми обговорили цю ідею, домовилися реалізувати її до ОБТ. Все-таки не кожен день хости знеструмлюються.



Коли ми в режимі реального часу побачили зазначений вище графік, то подумали, що різке падіння кількості активних користувачів — це ознака закінчення робочого дня. Але виявилося, що впав хост з механікою номер 13. Два падіння за тиждень — це все ще збіг. Але вже значна частина команди сервера вивчає логи, де і що можна поліпшити в консерваторії. І ось тут, в останню п'ятницю року, за кілька годин до корпоративу, хост з механікою номер 13 падає знову. А попереду Новий Рік і 12 днів свят, які хочеться провести далеко від роботи. Вирішили-таки відключити нещасливу механіку. І з тих пір подібних інцидентів більше не було. Але щоб Новий Рік пройшов спокійніше і падіння окремих механік не призводило до термінових профілактичних робіт, ми в той же корпоративний вечір приготували першу версію фікса. Тестували ми її по-чесному: запускали на локальних ПК розподілену версію сервера і висмикували провід живлення з механічної частини. Фікс був визнаний робітникам і пішов на бойові під час останніх профілактичних робіт 2014 року. Новорічні свята у підсумку пройшли спокійно.

Помилка 107
107 — саме такий код у помилки перевищення тайм-ауту при підключенні до сервера. Ця помилка, на жаль, отримала широку популярність серед гравців, що беруть участь в ЗБТ. І з нею пов'язано відразу кілька досить цікавих фактів.

Баг, або навіть баги, призводять до помилки 107, були внесені в мережевий движок досить давно — за кілька місяців до старту ЗБТ. І першими про таймаут спіткнулися боти. Але тоді був дефіцит часу, то я не зміг розібратися з причинами, але в ботах в підсумку просто відключили всілякі таймаут. В результаті баг, до нещастя, доїхав до бойових.

Далі ми стали свідками того, як кілька активних користувачів можуть створити ілюзію важливості тієї чи іншої проблеми. Помилка 107, як показало дослідження, могла виникнути тільки у користувачів, які мають пінг в районі ~3 мс, причому разом з обробкою в коді, як на сервері, так і на клієнті. На жаль, фікс тільки погіршив ситуацію: зникнення помилки було відзначено у дуже невеликого відсотка користувачів, зате вона з'явилася у набагато більшого числа гравців.

Це були користувачі, які грають в Skyforge через 3G/4G-модеми та/або слабкі ПК. Ми ніяк не могли повторити цей новий баг локально. На щастя, у нас є боти. Ми включили в них таймаут і полагодили код їх обробки, відразу ж отримавши просто вал помилок 107. Далі полагодити баг було вже справою техніки. Після видачі фікса на бойову популярність помилки 107 зійшло майже нанівець. Зараз є всього 1 незакрита скарга.

Насправді було відразу кілька причин помилок 107:
  • дуже гарний мережеве підключення і швидкий клієнт (пінг < 3 мс);
  • нестабільний і/або поганий пінг (3G — і 4G-модеми);
  • повільні клієнти або занадто велика загальна завантаженість системи (копіювання файлів);
  • щасливі володарі CD/DVD-ROM (при старті клієнт збирає статистику про залізо).
Урок помилки 107 в черговий раз показав, як важливо досліджувати не до кінця зрозуміле поведінка в системі. А також — як важливо мати на руках об'єктивну статистику по поширенню тих чи інших помилок у гравців. Така статистика, до речі, має з'явитися вже до старту ОБТ.

Суха статистика:

X — Реєстрацій всього
0.96*X — Z1. Острів Данкит
0.84*X — Z2. Розкопки Исолы
0.58*X — Z3. Ланберский ліс
0.37*X — Z4. Острів Наори
0.11*X — Z5. Миленские печери

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

На правах укладення
Закрите бета-тестування — це один з найважливіших етапів перед запуском гри для широкої аудиторії. На мій погляд, наша команда впоралася з минулим етапом ЗБТ цілком гідно. Хочу подякувати всіх користувачів, що взяли і беруть участь в ЗБТ, ваші репорти допомагають зробити гру краще. А також запрошую всіх на стрес-уікенд. Сподіваюся, що разом у нас вийде змусити сервер тріщати по швах :)

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.