LINUX.ORG.RU

big lock

 


0

1

положим есть несколько физических машин. на каждой стоит nginx. на эти машины идут интенсивные http запросы от множества фронтендов в которых они шлют некие цифры в uint_64. эти запросы ловят fastcgi приложения. каждому fastcgi приложению нужно не просто обработать запрос, но и посчитать что это был скажем 10 миллиардный запрос. отсюда вопрос: как бы вы боролись с big lock в этой задаче? где бы хранили этот счетчик? боюсь скажем memcached с cas не лучшее решение в данном случае. положим запросов реально лавина, рисуется что-то типа insert куда-то (типа не блокируемая очередь) и count в стороннем воркере. как бы это сделали вы и какими инструментами хранения? fastcgi возможно будет на c++

★★
Ответ на: комментарий от nikolnik

а оно агрегировать умеет? типа count?

quester ★★
() автор топика

как бы вы боролись с big lock в этой задаче?

Я бы упростил задачу так, чтобы централизованный счётчик не требовался.

Deleted
()
Ответ на: комментарий от Deleted

Я бы упростил задачу так, чтобы централизованный счётчик не требовался.

Я бы то-же, но в данном случае это исключено

quester ★★
() автор топика
Ответ на: комментарий от quester

А можешь детально описать всю задачу целиком? Может коллективный разум ЛОРа что-нибудь подскажет.

Deleted
()

«каждому fastcgi приложению нужно не просто обработать запрос, но и посчитать что это был скажем 10 миллиардный запрос.»

не совсем корректно я написал: имеется ввиду что стороннему приложению требуется знать сколько уже запросов было через fastcgi

quester ★★
() автор топика

count в стороннем воркере

его можно сливать в memcached отложено, допустим раз в минуту, внезапно, кол-во запросов станет равным количеству потоков на всех машинах.

Deleted
()
Ответ на: комментарий от Deleted

его можно сливать в memcached отложено, допустим раз в минуту, внезапно, кол-во запросов станет равным количеству потоков на всех машинах.

А в какую очередь это класть перед тем как сливать? Блокировка самого fastcgi в ожидании конечно не вариант

quester ★★
() автор топика
Ответ на: комментарий от quester

не надо никуда класть, сам поток fcgi может хранить, ониж не дохнут по окончании запроса. Пусть поток сливает раз в минуту, или если ему конец пришел.

Deleted
()
Последнее исправление: Deleted (всего исправлений: 1)
Ответ на: комментарий от Deleted

А можешь детально описать всю задачу целиком? Может коллективный разум ЛОРа что-нибудь подскажет.

Да вроде достаточно детально. Зачем нужен именно глобальный счетчик сказать не могу - секрет. Но обычно я то-же стараюсь переформулировать задачи таким образом чтобы от такого вообще уходить. Это не тот случай.

quester ★★
() автор топика
Ответ на: комментарий от quester

не совсем корректно я написал: имеется ввиду что стороннему приложению требуется знать сколько уже запросов было через fastcgi

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

Сервисы сбора данных могут либо складывать эти значения в лог, либо суммировать сразу.

Стороннее приложение может запрашивать значение у одного или нескольких сервисов сбора данных и выбирать то значение, которое кажется более реалистичным.

При таком подходе можно регулировать баланс между производительностью и точностью результата. Абсолютно точный результат без глобальной блокировки не получить ИМХО.

Deleted
()
Ответ на: комментарий от Deleted

не надо никуда класть, сам поток fcgi может хранить, ониж не дохнут по окончании запроса. Пусть поток сливает раз в минуту, или если ему конец пришел.

Да действительно. Во я туплю. У меня подобное решение уже реализовано в разных проектах. Вообщем задача сводится к разложению big lock на lock fastcgi потока. Спасибо!

quester ★★
() автор топика
Ответ на: комментарий от Deleted

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

Да спасибо, что-то я затупил!

quester ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.