# Проверка лимита памяти Trino Дата: 19 октября 2026 года. Это отчет о проверке; актуальная конфигурация находится в `docker-compose.yml` и `trino/jvm.config`, требования для учащегося — в `START_HERE.md`. ## Что проверяли Trino 478 в контейнере с пределом 2 ГиБ RAM, без swap, с Java heap от 512 МиБ до 1 ГиБ. JVM сама подбирает размер регионов G1; вместо настройки образа `G1HeapRegionSize=32M` для большого heap получен регион 1 МиБ. Среда: Linux x86_64, Docker Engine, cgroup v2, 6 CPU и 11,14 ГиБ памяти, видимых Docker. Остальные сервисы стенда работали одновременно. Общего лимита 8 ГБ для проекта или виртуальной машины в этом прогоне не было. Исходные файлы основного маршрута курса: | Файл | Размер, байт | | --- | ---: | | `yellow_tripdata_2024-01.parquet` | 49 961 641 | | `yellow_tripdata_2024-02.parquet` | 50 349 284 | | `yellow_tripdata_2024-03.parquet` | 60 078 280 | | `taxi_zone_lookup.csv` | 12 331 | Файлы взяты из уже скачанного учебного набора, без выборки или сокращения. ## Сценарий 1. Перед изменением проверены отсутствие активных Spark-приложений и запросов Trino, чтение существующей таблицы `lakehouse.default.spark_trino_smoke`. 2. Пересоздан только Trino. Запуск до `SERVER STARTED` занял около 25 секунд, healthcheck прошел. 3. Созданы отдельная временная схема `trino_memory_` и собственный префикс `validation/trino_memory_/raw/` в MinIO. Таблицы курса не перезаписывались. 4. Spark подготовил bronze и справочник по SQL Модуля 4; фильтры, нормализации, два JOIN со справочником и silver выполнены кодом Модуля 5. Проверки качества этого модуля также прошли. Получены 9 554 778 строк bronze, 9 418 184 строк silver и 265 строк справочника. 5. Через Python-клиент Trino выполнены 11 запросов из Модуля 6: просмотр схем, таблиц и колонок, выборки, подсчет строк, общие метрики, агрегаты по районам и топ-10 зон. Имена таблиц заменены на временные; SQL сохранен. 6. Дополнительно дважды выполнен JOIN всей bronze со справочником зон и группировкой по району: ```sql SELECT z.Borough, count(*) AS trips, avg(b.fare_amount) AS avg_fare FROM b LEFT JOIN z ON b.PULocationID = z.LocationID GROUP BY z.Borough ORDER BY trips DESC; ``` 7. Подсчет строк, общие метрики, агрегаты по районам, топ зон, чтение созданной Spark таблицы итогов и оба JOIN сверены с результатами Spark. Для чисел с плавающей точкой использован допуск `1e-8`. Ошибки Python-клиента Trino пробрасывались наружу, без обработчика исключений из ноутбука. 8. Повторно прочитана прежняя smoke-таблица: результат `1 / from_spark` сохранен. Всего завершились успешно 14 запросов. Временные таблицы удалены с `PURGE`, затем удалены временная схема и собственный raw-префикс. После `PURGE` отдельно удалены восемь пустых маркеров каталогов в собственном warehouse-префиксе. Проверено отсутствие временных объектов; исходные Parquet/CSV на хосте сохранены. ## Измерения | Показатель | Результат | | --- | ---: | | Лимит контейнера (`memory.max`) | 2 147 483 648 байт | | Лимит swap (`memory.swap.max`) | 0 | | Фактический `MaxHeapSize` через `jcmd 1 VM.flags` | 1 073 741 824 байта | | Пик контейнера Trino (`memory.peak`) | 1 340 874 752 байта, около 1,25 ГиБ | | События `oom`, `oom_kill`, `max` в `memory.events` | 0 | | Перезапуски Trino | 0 | | Пик суммы `memory.current` восьми контейнеров | около 5,89 ГиБ | | Пик той же суммы за вычетом `inactive_file` | около 5,44 ГиБ | Суммарная память снималась раз в секунду, получено 165 отсчетов во время подготовки таблиц, запросов и очистки. Пик Trino взят из счетчика cgroup, который учитывает и запуск контейнера. Вычитание `inactive_file` приближает сумму к показателю памяти в `docker stats`; файловый кэш показан отдельно. Агрегаты по silver обработали 9 418 184 строки каждый, что подтверждено статистикой запросов Trino. `count(*)` по bronze использовал метаданные Iceberg; проверкой чтения bronze служил также JOIN со справочником. ## Границы вывода Бюджет Trino 2 ГиБ / heap 1 ГиБ достаточен для проверенных запросов на основном наборе курса при одном учащемся. Измерение не подтверждает работу всех восьми модулей под общим жестким лимитом 8 ГБ. В сумму контейнеров не входят Docker daemon, ядро и другие процессы Linux/WSL2. Docker Desktop, Windows, ARM64, параллельные занятия и расширенный набор Taxi за 12 месяцев не проверялись. Для повторной проверки подними стенд с этой конфигурацией и пройди модули 3–6 на трех месяцах Taxi, добавив JOIN выше. Временная схема нужна, если важно сохранить существующие учебные таблицы. Примененный лимит можно проверить с хоста: ```bash docker inspect --format '{{.HostConfig.Memory}} {{.HostConfig.MemorySwap}}' trino docker compose exec trino jcmd 1 VM.flags docker compose exec trino cat /sys/fs/cgroup/memory.peak docker compose exec trino cat /sys/fs/cgroup/memory.events ``` Последние два пути относятся к cgroup v2; счетчики накапливаются с запуска контейнера. Числа нового прогона могут отличаться.