2016-05-12 3 views
0

У меня проблема с клиентом gRPC C++, который вызывает вызовы с облаком Google Bigtable. Эти вызовы иногда зависают, и только если установлен крайний срок вызова, возвращается вызов. Существует проблема с командой gRPC: https://github.com/grpc/grpc/issues/6278 с трассировкой стека и предоставлена ​​часть журнала трассировки gRPC.gRPC C++ клиентские вызовы против Bigtable иногда зависает

Звонок, который чаще всего зависает, - это ReadRows Поток для чтения. Я видел MutateRow звонок висит несколько раз, но это довольно редко.

gRPC tracing показывает, что есть какой-то ответ, возвращающийся с сервера, однако этот ответ, кажется, недостаточен для того, чтобы клиент gRPC продолжал.

Я потратил немало времени на отладку кода, никаких очевидных проблем, обнаруженных до сих пор на стороне клиента, не наблюдалось повреждение памяти. Это однопоточное приложение, одновременно выполняющее один вызов, параллелизм на стороне клиента не является подозреваемым. Клиент работает в ядре Google Engine Engine, поэтому сеть, вероятно, тоже не проблема. Клиент gRPC постоянно обновляется с главной сетью github.

Любые предложения будут оценены. Если кто-то отлаживает идеи, которые также будут хороши. Использование valgrind, gdb, сокращение приложения до подмножества с воспроизводимыми результатами не помогло до сих пор, я не смог выяснить, в чем проблема. Проблема случайна и появляется иногда.

Дополнительное примечание от 17 мая 2016 года Было высказано предположение, что повторные попытки могут помочь решить проблему. К сожалению, повторные попытки не очень хорошо работают для нас, потому что нам придется переносить это на логику приложения. Мы можем легко перепробовать обновления, а это MutateRow звонки, и мы делаем это, это не потоковые вызовы и легко повторить попытку. Однако, как только итерация результатов запроса БД началась приложением, если он не выполняется, повторная попытка означает, что приложение должно повторно отправить запрос и снова запустить итерацию результатов. Это проблематично. Всегда можно рассмотреть изменение, которое заставило бы наши приложения читать весь результирующий набор сразу, а затем на уровне приложений итерации могут выполняться в памяти. Затем можно обрабатывать повторные попытки. Но это проблематично по всем причинам, таким как отставание памяти и задержки приложений. Мы хотим обработать результаты запроса БД, как только они появятся, а не когда все они находятся в памяти. При зависании вызова также добавляется тайм-аут к задержке вызова. Таким образом, повторные попытки итераций результатов очень дорогостоящие до такой степени, что они непрактичны.

+0

Долгосрочные чтения определенно проблематичны. Клиент Java Bigtable отслеживает увиденное, а затем создает новый запрос, начиная с последних увиденных строк. Это тонкая проблема. Не стесняйтесь связаться со мной в sduskis at goog le dot com. –

+0

Это не длинные запросы. Ошибки, которые я вижу, - это, как правило, первые прочитанные вызовы потока. И это не длинные сеансы. Я вижу эти сбои в течение минуты или двух тестового приложения. – ay60

ответ

0

У нас возникли проблемы с gRPC на разных языках. Команда gRPC расследует.

+0

Любой прогресс в расследовании? Любые предложения относительно того, что мы можем сделать для смягчения проблемы? Были предложены повторы, но повторные попытки не очень хорошо работают для нас с потоковыми вызовами. – ay60

+0

У нас были некоторые внутренние дискуссии. Является ли зависание, связанное с закрытием соединений и проблемой страшного max_age? Если это так, руководство должно создать структуру повтора, которая повторяет puts/gets. Вот один из классов java, которые мы используем как часть наших повторных попыток: https://github.com/GoogleCloudPlatform/cloud-bigtable-client/blob/master/bigtable-client-core/src/main/java/com/google/ cloud/bigtable/grpc/async/AbstractRetryingRpcListener.java –

+0

Нет, это не проблема max_age.Я вижу, что это происходит через несколько минут после операции, и это случайное явление. – ay60