Перейти к содержанию

Бенчмарк

akadze против двух других очередей задач на Postgres для Python, на одной машине и одном Postgres. Скрипт — bench/compare.py; прежде чем верить цифрам с чужого ноутбука, запустите его сами.

Условия

  • PostgreSQL 16 в Docker, хост 12 CPU / 15 ГБ, Python 3.13, клиент на том же хосте.
  • akadze main после 0.6.0 (с пробуждением при освобождении слота), PgQueuer 1.6.0, Procrastinate 3.10.0.
  • Каждой библиотеке — своя чистая база. Задания — пустые async-функции: измеряется очередь, а не работа.
  • Один процесс воркера, 20 заданий одновременно: akadze Worker(slots=20) с пулом на 25 соединений (почему) и poll_interval по умолчанию; PgQueuer batch_size=10, max_concurrent_tasks=20; Procrastinate concurrency=20. PgQueuer и Procrastinate здесь опрашивают базу каждые 50 мс, чаще, чем по умолчанию.
  • Медиана 3 прогонов.

Результаты

akadze PgQueuer Procrastinate
Поставить 10 000 заданий одним пакетом 0,10 с 0,16 с 0,37 с
Поставить 1 000 заданий, каждое в своей транзакции 4,2 с 3,1 с 3,5 с
Выполнить 10 000 заданий из очереди 19,6 с 8,5 с 70 с
Заданий в секунду при выполнении ~510 ~1 170 ~140

Как читать

  • Пакетная постановка быстрее всего в akadze: enqueue_many пишет по тысяче строк на запрос.
  • Выполнение примерно в 2,3 раза медленнее, чем у PgQueuer. Каждый запуск в akadze перечитывает свою строку перед стартом (fencing против rescue), записывает исход в своей транзакции с хуками и идёт через SQLAlchemy; PgQueuer забирает и завершает задания пачками через asyncpg напрямую. Пропускная способность одного воркера — сегодняшняя цена этих гарантий и следующее место для улучшений.
  • Цифры — для пустых заданий. Задание, которое 200 мс ждёт ответа API, ограничивает 20 слотов сотней заданий в секунду, и собственные накладные расходы очереди там весят гораздо меньше.
  • Что не измерялось: лимиты, fair claim (см. Как работает claim), несколько воркеров, сетевая задержка до базы.

Запуск:

pip install -r bench/requirements.txt
BENCH_DSN=postgresql://user:pass@localhost:5432 python bench/compare.py 3

BENCH_N, BENCH_M и BENCH_CONCURRENCY меняют число заданий и параллельность. Скрипт удаляет и создаёт свои базы.