Подтвердить что ты не робот

Почему чтение CouchDB так медленно? (1,5 МБ/с или около того)

У меня работает сервер CouchDB (1.1.1), который содержит много документов в диапазоне размеров 400-600 КБ.

Если я получаю полный документ из базы данных (а не из представления, только необработанного документа), то для завершения требуется 200-400 мс, что соответствует примерно 1,5 МБ/с.

Если я пишу те же данные в сырые файлы на диске, они загружаются в 10-20 мс (около 25-50 МБ/с).

Я ожидал бы, что у CouchDB будут некоторые накладные расходы, но порядок (и некоторые) кажется сумасшедшим для того, что по существу читается!

Может кто-нибудь пролить свет на то, почему это может быть так?

Обновление: как указано ниже, время от curl:

# time curl http://localhost:5984/[dbname]/[documentname]

real    0m0.684s
user    0m0.004s
sys     0m0.020s

Выбранный документ был 642842 байта. Я тестировал его как на стандартном жестком диске 1 ТБ, так и на экземпляре EC2 (том EBS) с аналогичными результатами.

4b9b3361

Ответ 1

Я думаю, что это несколько факторов.

  • Вы загружаете HTTP, который в основном является протоколом с более высокой задержкой. В частности, вы создаете TCP-соединение с нуля, используя curl. (Веб-браузеры и большинство клиентских программ поддерживают пул постоянных соединений HTTP/1.1 keepalive.) Но в сущности CouchDB выбирает "медленный" протокол, потому что он настолько универсален и настолько стандартен.
  • Ваши документы имеют больший размер для CouchDB. Большинство документов представляют собой одно- или двузначные КБ, а не тройные. CouchDB кодирует/декодирует, что JSON в одном большом gulp (т.е. Не передает потоки с диска).
  • Не только EC2 (даже EBS) i/o менее, чем идеальный для базы данных (он сам имеет высокую задержку), но он также может колебаться, поскольку ваши соседи генерируют неизвестные всплывающие окна ввода/вывода, с которыми вы конкурируете.
  • CouchDB - это файловая система поверх файловой системы. Файл .couch похож на файловую систему. Таким образом, вы умножаете неэффективность. Файл .couch и метаданные требуют случайного ввода/вывода для хранения; и чтение документа требует случайного ввода-вывода в файле .couch. Вы можете увидеть, как эффекты задержки диска умножаются. Вместо сравнения чтения документа и чтения файла файловой системы вы можете сравнить чтение документа или чтение эквивалентной строки MySQL.

Заметьте, я не говорю, что CouchDB на самом деле быстро и ваши результаты неверны. Совсем наоборот: CouchDB работает медленнее, чем ожидают многие люди. В какой-то степени у него есть возможности для улучшения и оптимизации; но в первую очередь CouchDB решил, что эти затраты стоят того, чтобы принести больше пользы.

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

Тем не менее, CouchDB - это база данных, специфичная для домена, и поэтому может показаться, что вы ищете другой инструмент.

Ответ 2

Как вы извлекаете документ? Если вы используете какой-то код, пожалуйста, включите этот код и любые библиотеки, которые вы используете.

Или просто используйте curl для получения документа. Например, я просто сделал time curl http://localhost:5984/bwah/foo и получил документ в .017s. Важно отметить, что я на машине с SSD.

Кроме того, делать одно чтение недостаточно, чтобы предложить пропускную способность, которую вы можете ожидать от CouchDB или любого серверного программного обеспечения. Вам нужно сделать много запросов, а затем посмотреть, что среднее и среднее время.