5 мифов о производительности баз данных и python

38
@maxmaxmaxmax МАКСИМ КЛИМИШИН CTO GVMachines Inc. Базы данных , python и пять заблуждений о производительности

Upload: max-klymyshyn

Post on 14-Aug-2015

220 views

Category:

Software


2 download

TRANSCRIPT

Page 1: 5 мифов о производительности баз данных и Python

@maxmaxmaxmaxМАКСИМ КЛИМИШИНCTO GVMachines Inc.

Базы данных, python и пять заблуждений о производительности

Page 2: 5 мифов о производительности баз данных и Python

Сегодня поговорим о

Topic

‣ Python

‣ Почему X не быстрее Y

‣Оптимизации в базах данных

‣Оптимизации и Python

Page 3: 5 мифов о производительности баз данных и Python

При чем тут python

Page 4: 5 мифов о производительности баз данных и Python

Базы данных и Python

При чем тут Python

‣ Надо хранить плоские данные

‣ Связанные данные

‣ Графы

‣ Состояния

‣ Следить на консистентностью

‣ Совершать выборки

Page 5: 5 мифов о производительности баз данных и Python

Наша платформа

При чем тут Python

‣ CouchDB

‣ Solr

‣ Redis

Page 6: 5 мифов о производительности баз данных и Python

При чем тут Python

‣ Уперлись в скорость создания индекса CouchDB

‣ Постепенно мигрируем с CouchDB в Redis

‣ Активно используем Redis для очередей

‣ Активно используем для Pub/Sub

Наш опыт

Page 7: 5 мифов о производительности баз данных и Python

Заблуждение №1: База X быстрее базы Y

Page 8: 5 мифов о производительности баз данных и Python

Алгоритмы

База X быстрее Y

‣ B-tree – O(log n) / most of DBs

‣ Hash – O(1) – O(n) / most of DBs

‣ Log-structured merge-tree – O(log n) / Cassandra

‣ K-D tree – O(log n) – O(n) / Postgres/graph DBs

‣ Boyer–Moore string search algorithm – O(n)

Page 9: 5 мифов о производительности баз данных и Python

Если коротко, то выше головы не прыгнешь

База X быстрее Y

Page 10: 5 мифов о производительности баз данных и Python

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

База X быстрее Y

https://ru.wikipedia.org/wiki/Полный_перебор

Page 11: 5 мифов о производительности баз данных и Python

Заблуждение №2: Проверенная временем–

 значит быстрая

Page 12: 5 мифов о производительности баз данных и Python

Базовые алгоритмы поиска не менялись.

Новая – значит говно

Page 13: 5 мифов о производительности баз данных и Python

1961 – QuickSort 1968 – Binary Tree 1972 – B-Tree

Новая – значит говно

Page 14: 5 мифов о производительности баз данных и Python

Заблуждение №3: В памяти – значит

быстрая

Page 15: 5 мифов о производительности баз данных и Python

Хочу напомнить, что RAM – это очень круто!

База X быстрее Y

SSD

Page 16: 5 мифов о производительности баз данных и Python

Все упирается в ограничения:

В памяти – значит быстро

‣ CPU speed

‣ RAM speed

‣ Disk speed

Page 17: 5 мифов о производительности баз данных и Python

А именно

В памяти – значит быстро

‣ CPU speed – scheduled by OS, depends on LA

‣ RAM speed – fragmentation

‣ Storage speed – fragmentation, latency, depends on type and LA

Page 18: 5 мифов о производительности баз данных и Python

Серьезный прирост производительности in-memory баз данных происходит потому, что вы убираете целое

измерение при работе с данными

В памяти – значит быстро

Page 19: 5 мифов о производительности баз данных и Python

Заблуждение №4: Больше железа – все

будет быстрее

Page 20: 5 мифов о производительности баз данных и Python

Не все так просто

Железо и все дела

‣ Частота одного ядра CPU ограничена сверху

‣ Скорость памяти ограничена типом

‣ Скорость диска ограничена типом

Page 21: 5 мифов о производительности баз данных и Python

Железо и все дела

Представим, что доступ к одному юниту равен 1ms

Page 22: 5 мифов о производительности баз данных и Python

Железо и все дела

‣ для извлечения 1000 записей понадобится 1s, нормас

‣ 100K – 100s, долго

‣ 1M – ~16m!!!

Page 23: 5 мифов о производительности баз данных и Python

Железо и все дела

16 долбанных минут, Карл!

Page 24: 5 мифов о производительности баз данных и Python

Заблуждение №5: Распределенная – значит быстрая

Page 25: 5 мифов о производительности баз данных и Python

Серьезный прирост производительности in-memory баз данных происходит потому, что убирается целое измерение

Шардим и лала

Page 26: 5 мифов о производительности баз данных и Python

Падение производительности распределеных баз данных

происходит потому, что добавляется новое, ненадежное измерение при

работе с данными.

Шардим и лала

Page 27: 5 мифов о производительности баз данных и Python

Что влечет за собой ряд проблем

Шардим и лала

‣ Consistency or availability

‣ Split-brain scenarios

‣ Conflicts resolution/merging (optimistic replication)

‣ Quorum-based reads/writes

‣ Manual/auto sharding configuration etc.

Page 28: 5 мифов о производительности баз данных и Python

В частности с репликацией

Шардим и лала

‣ Будут возникать конфликты

‣ Вопрос только в том

1. Когда их разруливать

2. Кто их будет разруливать

Page 29: 5 мифов о производительности баз данных и Python

Например

Шардим и лала

‣ Amazon Dynamo разруливает на этапе чтения и предоставляет это приложению

‣ А Apache CouchDB на этапе записи и last write win + отложенный механизм разруливания конфликтов

Page 30: 5 мифов о производительности баз данных и Python

Оптимизации в БД

Page 31: 5 мифов о производительности баз данных и Python

Как решается вопрос с чтением

Оптимизации

‣ Построение индекса при записи (Postgres, Redis с хранимыми процедурами)

‣ Устаревшие результаты (stale)

‣ Асинхронное создание/предвычисление индекса (вариант stale с внешним индексером)

‣ Шардинг, множественный запрос к нодам шард

Page 32: 5 мифов о производительности баз данных и Python

Как решается вопрос с записью

Оптимизации

‣ контроль над системным вызовом fsync для процесса БД

‣Отложенное создание индекса до первого чтения (CouchDB)

‣Отложенное создание индекса до (commit явно или по таймауту, Solr)

Page 33: 5 мифов о производительности баз данных и Python

Оптимизации в Python-е

Page 34: 5 мифов о производительности баз данных и Python

Как решается вопрос с чтением

Оптимизации

‣ Read on writes (SQLAlchemy)

‣ Кеширование ответов БД

‣ Асинхронные запросы к БД

‣ Асинхронное кеширование

Page 35: 5 мифов о производительности баз данных и Python

Оптимизации

‣ Py3x – yield from, asyncio

‣ Py2x – gevent, threads pool

‣ For both – solid C implementations

Page 36: 5 мифов о производительности баз данных и Python

Проблема с чтением в основном связана с внутренней организацией

структур данных Python и множества прослоек по пути между чистым запросом и чистым ответом

Оптимизации

Page 37: 5 мифов о производительности баз данных и Python

Как решается вопрос с записью

Оптимизации

‣ Read on writes (SQLAlchemy)

‣ Pub/sub и асинхронная запись/очереди

‣ Прямая запись в БД с отложенным/асинхронным созданием индекса (CouchDB)

Page 38: 5 мифов о производительности баз данных и Python

Спасибо.

Thanks!

@maxmaxmaxmax