Производительность ухудшается для запроса на основе диапазона в широком семействе столбцов cassandra при реализации с использованием многопоточных вызовов pycassa xget()?

У меня есть типичное широкое семейство столбцов с {rowkey--> uuid4+дата и данные временных рядов в виде столбцов}, для которых я реализовал запрос на основе диапазона, используя вызовы pycassa xget(). Не то чтобы меня мучила низкая производительность однопоточного кода, мне было скорее любопытно понять разницу в производительности, когда вызовы xget() выполняются параллельно, а не последовательно (изнутри цикла for:).

Я использовал библиотеку python «threading» для реализации многопоточной версии запроса на основе диапазона, и производительность значительно снизилась. Теперь я знаю о влиянии Python GIL на многопоточный код, но могу ли я как-то быть уверенным, что это на самом деле вызвано GIL? Может быть, это вызвано чем-то другим?

Заранее спасибо.

Примечание. Я не рассматриваю библиотеку «многопроцессорность», потому что не могу позволить себе иметь разные объекты ConnectionPool для каждого подпроцесса.


person rocknaxe    schedule 12.11.2013    source источник


Ответы (1)


Я бы попробовал поиграть с разными значениями buffer_size kwarg для xget() (по умолчанию 1024).

Если проблема заключается в GIL, вы увидите загрузку ЦП где-то между ~90% и ~120% для процесса. В противном случае вы можете настроить размер ConnectionPool, чтобы убедиться, что для каждого потока доступно хотя бы одно соединение.

Если ничего не помогло, попробуйте профилировать свое приложение: http://docs.python.org/2/library/profile.html.

person Tyler Hobbs    schedule 12.11.2013