Производительность ухудшается для запросов на основе диапазона в семействе столбцов cassandra, если он реализован с использованием многопоточных вызовов pycassa xget()?
У меня есть типичное семейство широких столбцов с {rowkey -> uuid4+ данными даты и времени в виде столбцов}, для которых я реализовал запрос на основе диапазона, используя вызовы pycassa xget(). Не то чтобы меня мучила низкая производительность с однопоточным кодом, мне было более любопытно понять разницу в производительности, когда вызовы xget () выполняются параллельно, а не последовательно (из цикла for:).
Я использовал "поточную" библиотеку Python для реализации многопоточной версии запросов на основе диапазонов, и производительность фактически значительно снизилась. Теперь я знаю о влиянии Python GIL на многопоточный код, но могу ли я быть уверен, что это вызвано GIL? Может ли это быть что-то еще, что вызывает это?
Заранее спасибо.
Примечание: я не рассматриваю библиотеку "многопроцессорности", потому что не могу позволить себе иметь разные объекты ConnectionPool для каждого подпроцесса.
1 ответ
Я бы попробовал поиграть с разными значениями для buffer_size
карг для xget()
(по умолчанию 1024).
Если проблема связана с GIL, вы увидите, что загрузка процессора будет где-то между ~90% и ~120%. В противном случае вы можете настроить размер ConnectionPool, чтобы убедиться, что для каждого потока доступно хотя бы одно подключение.
Если ничего не помогает, попробуйте профилировать ваше приложение: http://docs.python.org/2/library/profile.html.