📢 Load & Performance
886 subscribers
32 photos
3 files
98 links
Избранные материалы о тестировании производительности.
Чат и источник тем: @qa_load
Download Telegram
Сегодня собрал нагрузочный pipeline, где объект тестирования готовится с помощью Java Test Containers (Docker)

https://java.testcontainers.org/

TL;DR; Простые варианты использования в Java Test Containers работают — монтирование файлов, переменные окружения, запуск, остановка

Для всего остального есть Java. Если что-то не описано в документации библиотеки и не работает, то оно не заработает, скорее всего

Мне надо было обложить приложение разными агентами мониторинга. Агенты бывают для x64, arm64, musl, windows, … Я думал, что напишу в коде Dockerfile RUN IF … проверю переменные окружения и настрою то, что нужно. Это не работаем если контейнер собирает библиотека testcontainer, а не команда docker build

Если сделать слои и в каждом слое подготовить нужный агент, то команда копирования из слоя не работает для testcontainer

Но простая команда монтирования внешнего файла работает отлично. Поэтому всю сложную логику (какой агент выбрать, для какой архитектуры, …) делает Java, и потом монтирует нужный файл в оригинальный контейнер с приложением


Библиотека дала возможность сделать микро-стенды для тестов, которые на каждую сборку собираются в CI

в BeforeAll запустить небольшую систему и мониторинг к ней
в другом BeforeAll дождаться старта
нагрузить систему
проверить assertion-ы
в AfterAll все остановить и удалить
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9
Вот так программировали французские короли. У окна. Удобное кресло. Подставка под монитор и видвижная платформа с удобным наклоном для набора кода

А как выглядит ваше рабочее место?
😁165🤣1👨‍💻1
BSOD на Mac розовый 🩷

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

Если запустить все все и запустить еще и нагрузку, так что и сервисы и тест начнут логи писать с огромной скоростью в консоль, то можно получить розовый экран и перезагрузку

Получил 🔤🔤🔤🔤 уже трижды, поэтому выключил все 🥰😌💻, оставил только Terminal — так работает отлично

Думаю что самой странной идеей было выставить лимит в 💻 на 500k строк в консоли с подсветкой, и запустить в трёх вкладках разные процессы, которые пишут логи неистово. И одновременно открыть дамп памяти на анализ

Интересно, что памяти хватало и процессора тоже. Запас был. Может быть дескрипторы файлов заканчивались или еще что-то
Please open Telegram to view this post
VIEW IN TELEGRAM
😁4
Три доклада и десять разговоров за конференцию

Если вы посещаете конференции и думаете, какой доклад или мастер-класс посетить, то мой опыт с фокусом на несколько докладов, вопросами и беседами может пригодиться

Я интроверт и начал активно ходить и выступать на конференциях с 2018 года. За семь лет прошёл путь от 🪫стресса до 🔋заряжения от митапов и конференций

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

А когда-то пробовал посетить максимум событий программы и мало общался. Думал не упустил ли что-то, а еще слушал комментарии других посетителей, они почти всегда были критическими. Это было время стресса

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

🔋И так постепенно пришел к балансу того, чтобы посетить несколько докладов, постараться заранее найти интересных мне людей и поговорить с ними во время конференции. Это давало большой прилив энергии и идей. С фокусом и общением
Please open Telegram to view this post
VIEW IN TELEGRAM
11
Неочевидная оптимизация Grafana досок для Thanos — добавить фильтр по label prometheus

Thanos это один из вариантов долговременного хранилища метрик Prometheus. И типичная архитектура такая, что Thanos один, а Prometheus-ов много. И я наивно полагал, что если выбрать один точный фильтр, то запрос будет быстрым. Оказалось, что если отфильтровать данные сначала по prometheus, а потом по имени сервера instance, то запрос получается быстрее, чем когда фильтрация происходит только по имени сервера

Примеры:

metric{instance="$instance"}
и
metric{prometheus="$prometheus", instance="$instance"}

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

Также довольно простое ускорение — увеличить $__interval для графиков. Например у вас отображается 2600 точек на графике, можно в свойствах панели (Query options) указать "Max data points" = 300 — это не очень мало, но довольно быстро
Viacheslav Smirnov
Сегодня собрал нагрузочный pipeline, где объект тестирования готовится с помощью Java Test Containers (Docker) https://java.testcontainers.org/ TL;DR; Простые варианты использования в Java Test Containers работают — монтирование файлов, переменные окружения…
Docker desktop обновился до последней версии. Но я в файле libraries.gradle не обновил версию библиотеки-клиента org.testcontainers:testcontainers . И Java Test Containers версии 1.21.1 (последняя версия из ветки 1) перестала подключаться к Docker. Так как нет ни одного дефекта про это, то я думал что у меня что-то не так. А причина была в том, что надо обновлять и бибилиотеку тоже до 2.0.2

Спонсор потерянного дня — старая версия библиотеки 🤦‍♂️

Ошибки были вот такие
[Test worker] ERROR org.testcontainers.dockerclient.DockerClientProviderStrategy - Could not find a valid Docker environment. Please check configuration.

🔴 И любые настройки не помогали для Docker Desktop 4.53.0, пока не обновился до testcontainers-java 2.0.2
🟠 Для предыдущей версии 4.52.0 помогало переключиться с docker context docker-linux на docker context default командой
docker cotext use default
🟢 А для версии Docker Desktop 4.51.0 просто работала библиотека testcontainers-java 1.21.1

Версии testcontainers: https://github.com/testcontainers/testcontainers-java/releases
Версии docker-desktop: https://docs.docker.com/desktop/release-notes/
Please open Telegram to view this post
VIEW IN TELEGRAM
😁1
Интересное наблюдение про файловую систему APFS, которая по умолчанию используется в MacOS

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

Возможно, это может нарушить логику некоторых инструментов, которые считают место на диске. Представьте, что есть диск на 100 Гбайт, но на нем 100 файлов по 90 ГБайт

Все это требует дополнительной проверки. Я проверял так

Запустил
iostat -w 2 disk0

и скопировал большой файл

При первом копировании заметил всплеск скорости записи
              disk0       cpu    load average
KB/t tps MB/s us sy id 1m 5m 15m
4.84 9658 45.69 14 17 69 17.06 15.92 12.23
11.66 2606 29.67 15 16 69 16.01 15.72 12.18
132.30 2220 286.83 10 16 74 16.01 15.72 12.18
226.11 1058 233.61 13 14 73 14.89 15.49 12.12
78.92 443 34.14 12 14 74 14.89 15.49 12.12
33.20 1178 38.20 12 16 73 13.94 15.28 12.07
42.61 1060 44.12 17 16 67 12.90 15.05 12.01

А потом повторил копирование, ожидая снова увидеть 233-286 MB/s, но ничего не увидел. Таким образом заподозрил, что копии 2 и больше были "бесплатные"

Посчитал место на диске df -h. Удалил копии 2 и больше и посчитал снова df -h — ничего не изменилось. Тогда удалил все файлы (тестовый файл был архив на 20 ГиБ) — вот тогда место освободилось
Поставил себе openjdk 25 через
brew install openjdk@25

Это обновило мне openjdk@24 до 25, удалив 24. И потребовало починить запуск VisualVM https://visualvm.github.io/

Чтобы починить поставил openjdk@21, выдал права приложению Terminal на доступ к каталогу /Application в Privacy & Security / App Management / Terminal

И указал для VisualVM кастомный путь к JDK через команду в Terminal:

echo visualvm_jdkhome="/opt/homebrew/Cellar/openjdk@21/21.0.9/libexec/openjdk.jdk/Contents/Home" >> /Applications/VisualVM.app/Contents/Resources/visualvm/etc/visualvm.conf

Починилось!

Но openjdk в любом случае крутое обновление. Трассировка вызовов понравилась

Если пропустили workshop "Работа с JDK Flight Recorder из командной строки" от Алексея Рагозина, то можно посмотреть инструкцию и запись вот тут https://training.ragozin.info/ru/webinars/2025-11-JFR-CLI/workshop.html и поделиться потом обратной связью https://forms.gle/VDtmEd85oKTNht4X6 с Алексеем
https://t.me/dive_memo

Рекомендую уютный канал Михаила с ценными заметками про производительность. Он сейчас делает перфоманс аналитику по облаку для анализа данных

Читает и делает заметки в канал выше

Познакомились мы с ним недавно. А вы, может, с ним знакомы уже и работали вместе в ПерфЛабе, Яндексе или еще где
👍5
Вчера был международный день гор — 11 декабря 🏔🌋

Почему это важно для меня? Мои путешествия начались с горного туризма.

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

Заниматься инженерией и производительностью круто. Но если сложно ответить на вопрос, а кто же я, без использования названия компаний, то можно сходить в поход или домой поехать. А почему стоит посмотреть на горы? В горном походе хорошо то, что комаров мало и красиво как нигде.
🔥5👍32
Ускоряем Allure.TestOps

Год назад работал над ускорением вот этой инсталляции
🕚https://qameta.io/our-customers/miro/
▶️3000 tests for each of the 400 pull requests being run every day
которая давала более 1млн новых launch за день

И делал доклад потом
🕚https://polarnik.github.io/Allure.TestOps.SpeedUp/slides.html
🕚https://www.youtube.com/watch?v=Bzs7cAweTLY

По результатам также появился вот этот раздел инструкции
🕚https://docs.qameta.io/allure-testops/install/database/#separating-connection-pools
▶️The analytics pool, if enabled, will be used for some of the read-only aggregated data queries. It is a common practice to use a separate database for analytics, with replication configured between the two databases.
Но честно говоря, именно для той инсталляции, нагрузка от аналитики не была такой огромной, что это требовало отдельной реплики.

Там нагрузка создавалась вставками и обновлениями в огромном количестве (1+ млн в день). А также запросами по API разных данных — интеграциями. И там хорошо помогло
🕚удалить некоторое количество индексов
🕚создавать partial-индексы только на новые данные, где launch >= ..., test_id >= ... — раз в неделю

Индексы все же были нужны, потому что свежие данные по API и через UI использовались. Но именно свежие

При этом удалять старые данные из системы было непроизводительно. Вот этот скрипт
🕚https://github.com/eroshenkoam/allure-testops-utils?tab=readme-ov-file#delete-launches-in-allure-testops
ставит много задач на удаление в очередь задач, а они тяжелые, тяжелее задач на выборку и вставку, поэтому если его запустить, то производительности конец. Его можно запускать по выходным. Если такие дни бывают у вашей системы. Но partial-индексы с фильтром по свежим id будут игнорировать все архивные записи, поэтому их наличие не будет сказываться на скорости
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3
Оказалось, что больше всего в этом году смотрел Heisenbug на YouTube

Иногда это были доклады, на которых был, но хотелось вспомнить детали

Иногда это были просто интересные материалы

Буду очень рад новым мастер-классам и докладам по мониторингу и производительности весной. Да и не я один. Отправляете свои материалы ☺️. Просто идеи бывает сложно конвертировать в отличный материал, а MVP довести до прода — одно удовольствие

Весной будет юбилей конференции. Будет здорово!
🔥13