Производительность GridFS

в 11:17, , рубрики: benchmark, gevent, mongodb, python, метки: , , ,

В интернете не так много статей о производительности GridFS, вот одна из них Serving files out of GridFS которая показывает, что отдача файлов из GridFS медленнее чем с диска в 6 раз.
Но в той статье есть недочет — в тестировании обращение идет к одному файлу, а при этом файл кешируется на уровне nginx либо файловой системы что дает отрыв по сравнению с GridFS. Да и неплохо проверить свежий GridFS, 3 года прошло как никак.
Поэтому я решил провести собственное тестирование, с обращением по разным именам файлов.

Есть 52 тыс файлов — постеры к фильмам, общий объем 2Гб, средняя картинка весит 40кб. Копия файлов на ext4, копия в GridFS.
Виртуалка 512Мб с 1 ядром. Ubuntu server 12.04 LTS 64bit, настройки Nginx/1.4.1 стандартные.
Тест рассчитан на low-cost сервер, для мощных серверов результаты будут другие.

Способы отдачи файлов:
1) Nginx — статика
2) Gevent через nginx
3) 2 x Gevent через nginx (балансировка)
4) Gevent напрямую
5) Gevent через nginx (unix socket)
для пунктов 2-5 использовался http сервер на Python + Gevent который отдавал файлы из GridFS

Способы нагрузки:
1) ol, t2 — Обращение к одному url, 2 потока
2) ol, t10 — Обращение к одному url, 10 потоков
3) t2 — Обращение к разным url, 2 потока
4) t10 — Обращение к разным url, 10 потоков

Производительность GridFS

Детали:
* Все тесты запускались 3 раза, в таблице среднее значение.
* Обращение к разным url для всех тестов происходит по одному списку ссылок, ссылки содержат идентификатор файлов (в GridFS поиск идет по идентификатору)
* В тестах где обращение идет к одному url, размер файла составляет 13.5 kb.
* При отдаче через gevent, происходит кеширование последнего файла, поэтому в тестах где идет обращение на один url, обращение к GridFS не происходит и по сути замеряется скорость отдачи данных из Python.
* Тест «one link» сделан в основном для определения пределов клиента.

Клиент написан на Python, судя по результатам, его мощности хватает минимум на 1450 запрсов в секунду. Увеличение потоков, либо запуск как несколько процессов не дают большую производительность. Отсюда можно судить что сервер был «узким местом», что необходимо для тестирования.

В результате мы получили информацию о том, что производительность GridFS не такая низкая как считалось ранее, по крайней мере на маленьких серверах.

Ещё идеи:
* Попробовать nginx-gridfs
* uwsgi-gridfs
* Отдача файлов через yield
* Попробовать другие proxy сервера
* Попробовать другие ФС (ZFS?)

Так же планирую протестировать на мощном сервере.

Исходники скриптов

Автор: lega

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js