Как управлять переменными сеанса в веб-кластере?

Компиляторам разрешается предполагать, что базовое значение bool не испорчено, поэтому оптимизирующие компиляторы могут избежать ветвления.

Если мы посмотрим на сгенерированный код для этого искусственного теста,

int with_if_bool(bool a, int b) {
    if(a){b++;}
    return b;
}

int with_if_char(unsigned char a, int b) {
    if(a){b++;}
    return b;
}

int without_if(bool a, int b) {
    b += a;
    return b;
}

clang воспользуется этим фактом и сгенерирует точно такой же код без ветвей, который суммирует a и b для версии bool и вместо этого генерировать фактические сравнения с нулем в случае unsigned char (хотя это все еще код без ветвей):

with_if_bool(bool, int): # @with_if_bool(bool, int)
  lea eax, [rdi + rsi]
  ret
with_if_char(unsigned char, int): # @with_if_char(unsigned char, int)
  cmp dil, 1
  sbb esi, -1
  mov eax, esi
  ret
without_if(bool, int): # @without_if(bool, int)
  lea eax, [rdi + rsi]
  ret

gcc вместо этого будет обрабатывать bool так же, как если бы он был unsigned char, не используя его свойства, генерируя код, аналогичный случаю unsigned char clang.

with_if_bool(bool, int):
  mov eax, esi
  cmp dil, 1
  sbb eax, -1
  ret
with_if_char(unsigned char, int):
  mov eax, esi
  cmp dil, 1
  sbb eax, -1
  ret
without_if(bool, int):
  movzx edi, dil
  lea eax, [rdi+rsi]
  ret

Наконец, Visual C ++ будет обрабатывать версии bool и unsigned char одинаково, точно так же, как gcc, хотя и с более наивным кодовым кодом (он использует условное перемещение вместо выполнения арифметики с регистром флагов, который IIRC Традиционно был менее эффективным, не знаю, для нынешних машин).

a$ = 8
b$ = 16
int with_if_bool(bool,int) PROC ; with_if_bool, COMDAT
  test cl, cl
  lea eax, DWORD PTR [rdx+1]
  cmove eax, edx
  ret 0
int with_if_bool(bool,int) ENDP ; with_if_bool

a$ = 8
b$ = 16
int with_if_char(unsigned char,int) PROC ; with_if_char, COMDAT
  test cl, cl
  lea eax, DWORD PTR [rdx+1]
  cmove eax, edx
  ret 0
int with_if_char(unsigned char,int) ENDP ; with_if_char

a$ = 8
b$ = 16
int without_if(bool,int) PROC ; without_if, COMDAT
  movzx eax, cl
  add eax, edx
  ret 0
int without_if(bool,int) ENDP ; without_if

Во всех случаях ветви не генерируются; единственное отличие состоит в том, что на большинстве компиляторов генерируется более сложный код, который зависит от cmp или test, создавая более длинную цепочку зависимостей.

При этом я бы беспокоился об этом виде микрооптимизации только в том случае, если вы фактически выполняете свой код под профилировщиком, а результаты указывают на этот конкретный код (или на какой-то жесткий цикл, который его включает); в общем, вы должны написать разумный, семантически правильный код и сосредоточиться на использовании правильных алгоритмов / структур данных. Микрооптимизация наступает позже.


В моей программе это не сработает, поскольку на самом деле это операция типа: b+=(a==c)

blockquote>

Это должно быть еще лучше для оптимизатора Так как у него даже нет никаких сомнений относительно того, откуда исходит bool - он может просто принять решение прямо из регистра флагов. Как вы можете видеть , здесь gcc производит довольно схожий код для двух случаев, clang точно такой же, в то время как VC ++, как обычно, создает нечто более условное (a cmov) в if случай. [тысяча сто тридцать-один]

9
задан Stefano d'Antonio 20 October 2016 в 08:39
поделиться

8 ответов

Расширять ответ @yogman.

Memcached является чистым великолепием! Это - высокопроизводительный и распределенный объектный кэш.

И даже при том, что я упомянул, распределил, это в основном столь же просто как запуск одного экземпляра на одном из Ваших запасных/неактивных серверов, Вы настраиваете его как в IP, порте и насколько поршень для использования и Вы сделаны.

memcached -d -u www -m 2048 -l 10.0.0.8 -p 11211

(Выполнения memcached в режиме демона, как пользователь www, 2 048 МБ (2 ГБ) RAM на IP 10.0.0.8 с портом 11211.)

С тех пор Вы просите у memcached данные и если данные еще не кэшируются, Вы вытягиваете его от первоисточника и храните его в memcached. Я уверен, что Вы знакомы с основами кэша.

В кластерной среде можно соединить memcached's в кластер и копировать кэш через узлы. Memcached работает на Linux, Unix и Windows, запустите его где угодно, Вы имеете запасную RAM и начинаете использовать свои ресурсы.

API для memcached должны быть общедоступными. Я говорю, должен, потому что я только знаю о Perl, Java и PHP. Но я уверен, что, например, у людей Python имеют средства усилить его также. Существует memcached Wiki, в случае, если Вы нуждаетесь в указателях или сообщаете мне в комментариях, если я бредил слишком много.;)

7
ответ дан 4 December 2019 в 08:54
поделиться

Существует 3 способа сохранить состояние сеанса в ASP.NET. Первое в процессе, где переменные хранятся в памяти. Второе должно использовать сервис состояния сеанса путем помещения следующего в web.config файл:

<sessionState
    mode="StateServer"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString="data source=127.0.0.1;user id=sa;password="
    cookieless="false"
    timeout="20" />

Как Вы видите в атрибуте stateConnectionString, сервис состояния сеанса может быть расположен на другом компьютере.

Третья опция состоит в том, чтобы использовать централизованную базу данных SQL. Чтобы сделать это, Вы помещаете следующее в свой web.config:

<sessionState
    mode="SQLServer"
    stateConnectionString="tcpip=127.0.0.1:42424"
    sqlConnectionString=
     "data source=SERVERHAME;user id=sa;password="
    cookieless="false"
    timeout="20"
/>

Больше деталей обо всех этих опциях описано здесь: http://www.ondotnet.com/pub/a/dotnet/2003/03/24/sessionstate.html

6
ответ дан 4 December 2019 в 08:54
поделиться

С Hazelcast можно или использовать распределенную карту Hazelcast, чтобы сохранить и совместно использовать сессии через кластер или позволить менеджеру по Веб-приложению Hazelcast сделать все для Вас. Проверьте документы для деталей. Hazelcast является распределением/делить, супер облегченным и легким, бесплатным решением для распределения данных для Java.

С уважением,

- talip

http://www.hazelcast.com

3
ответ дан 4 December 2019 в 08:54
поделиться

Получите машину Linux и настройте http://www.danga.com/memcached. Его скорость непобедима по сравнению с другими подходами. (например, cookie, сформируйте скрытые переменные, базы данных),

4
ответ дан 4 December 2019 в 08:54
поделиться

Как со всеми видами вещи, "это зависит".

Существуют различные решения и подходы.

Как упомянуто, существует понятие централизованного хранилища для состояния сеанса (база данных, memcached, совместно используемая файловая система, и т.д.).

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

Другой метод является прикреплением сервера. Когда клиент поражает кластер в первый раз, некоторый механизм (обычно подсистема балансировки нагрузки, выходящая на кластер), прикрепляет клиент к определенному серверу. В типичной клиентской продолжительности жизни тот клиент проведет их все время на единственной машине.

Для механизма обработки отказа каждая машина кластера соединяется с другой машиной, и таким образом, любые изменения сессии совместно используются с парной машиной. Если клиенты прикрепили обнаружение машины проблема, клиент поразит другую машину. На данном этапе, возможно, из-за cookie, новая машина видит, что это не исходная машина для клиента, таким образом, это проверяет с помощью ping-запросов и исходную машину и парную машину для клиентских данных сессии.

В той точке клиент может быть прикреплен к новой машине.

Различные платформы делают это по-разному, включая наличие никакого состояния сеанса вообще.

3
ответ дан 4 December 2019 в 08:54
поделиться

В ASP.NET можно сохранить данные сессии к базе данных SQL Server, которая характерна для всех веб-серверов в кластере.

После того, как настроенный (в web.config для Вашего сайта), платформа обрабатывает все постоянство для Вас, и можно получить доступ к данным сессии как нормальным.

0
ответ дан 4 December 2019 в 08:54
поделиться

Как Will сказал, большинство подходов выравнивания нагрузки будет использовать своего рода неподвижность в пути распределение предстоящих запросов от того же клиента, значения, уникальный клиент поразит тот же сервер, если тот фактический сервер не понизится.

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

Даже самый простой способ выравнивания нагрузки (вокруг - rubin поиски DNS) сделает своего рода неподвижность, так как большинство браузеров будет кэшировать фактический поиск и для этого продолжать идти в первую запись, которую это получило, AFAIK.

Это обычно - время выполнения, которое ответственно за sessiondata, в для примера PHP возможно определить Ваш собственный обработчик сессии, который может сохранить данные в базу данных, например. По умолчанию PHP хранит sessiondata на файлах, и могло бы быть возможно совместно использовать эти файлы на SAN или эквиваленте для совместного использования данных сессии. Это было просто теорией, которую я имел, но никогда не обходил для тестирования, так как мы решили, что выпуск сессий не был очень важен и не хотел ту единую точку отказа.

0
ответ дан 4 December 2019 в 08:54
поделиться

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

Поддержите таблицу сессии в базе данных, которая генерирует уникальный идентификатор для каждой записи. В первый раз Вы хотите сохранить сессию определенные данные, генерировать запись в Вашей таблице сессии и сохранить значения сессии в нем. Получите уникальный идентификатор новой сессии, записывают и переписывают все ссылки в Вашем веб-приложении для отправки уникального идентификатора как части querystring.

На каждой последующей странице, где Вам нужны данные сессии, запросите таблицу сессии с уникальным идентификатором, переданным в querystring.

Пример:

Полагайте, что Ваш веб-сайт имеет 4 страницы: Login.asp, welcome.asp, taskList.asp, newtask.asp

То, когда пользователь входит в систему с помощью страницы login.asp после проверки пользователя, создайте запись в таблице сессии и сохраните необходимую сессию определенные значения (позволяет, говорят что дата/время входа в систему пользователя этого примера). Получите новый уникальный идентификатор записи сессии (позволяет, говорят, что уникальный идентификатор является abcd).

Добавьте все ссылки в своем веб-сайте с уникальным идентификатором как указано ниже:

  • welcome.asp? sessionId=abcd
  • tasklist.asp? sessionId=abcd
  • newtask.asp? sessionId=abcd

Теперь, если в какой-либо из вышеупомянутых веб-страниц Вы хотите показать дату/время входа в систему пользователя, просто необходимо запросить таблицу сессии с sessionID параметром (abcd в этом случае) и дисплей пользователю.

Так как уникальное значение, определяющее сессию, является частью URL, любой из Ваших веб-серверов, служащих пользователю, сможет отобразить корректную дату/временную стоимость входа в систему.

Надеюсь, это поможет.

1
ответ дан 4 December 2019 в 08:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: