Лучший способ улучшить производительность (и включать так или иначе обработку отказа)

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

некоторые определенные примеры:

первым является c# (или Java) определенная, Автоматическая упаковка и блокировать/синхронизировать конструкция

private int i;
private object o = new object();

private void SomethingNeedingLocking(bool b)
{
    object lk = b ? i : o;
    lock (lk) { /* do something */ }
}

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

Несколько объявление переменной и указатели:

long* first, second;

ошибка классика А (хотя легкий для определения). Сахар нескольких переменных не будет соответствовать объявлению указателя.

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

i = i + 1;

, А широко использовал конструкцию (и тот, который сам имеет объем для ошибок, так как необходимо не забыть обновлять обе переменные, если Вы хотите измениться от использования i). Однако, так как это легко встроить в рамках других выражений, проблема префикса и постфикса возникает. При использовании в для цикла это не имеет значения, оценка происходит за пределами любых других оценок, но используемый в другом месте это может быть источник беспорядка (так как можно встраивать очень важный аспект вычисления (должно ли текущее или следующее значение использоваться) в очень маленькую и легко пропущенную форму.

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

7
задан Tom H 7 July 2010 в 14:31
поделиться

6 ответов

Я полагаю, что сейчас на виртуальной машине установлена ​​32-разрядная ОС. Поскольку Standard Edition не разрешает AWE два сервера (IIS и SQL), SQL Server загружает максимум, примерно 1,8 ГБ, и оставляет много оперативной памяти для IIS и ОС. Но как только вы перейдете на 64-битную ОС, все изменится, поскольку SQL Server возьмет всю оперативную память для своего буферного пула (~ 5 ГБ, если доступно 6 ГБ), а затем начнет возвращать ее ОС, когда уведомит . Это поведение можно изменить, настроив параметры памяти SQL Server . Разделив IIS и SQL на отдельные виртуальные машины, вы оставляете всю память на виртуальной машине SQL для ее пулов буферов, и это хорошо. В идеале у вас должно быть достаточно оперативной памяти, чтобы SQL мог загружать всю базу данных в память (включая tempdb) и касаться диска только для записи журнала и когда он должен проверять базу данных. Другими словами, больше ОЗУ означает более быстрый SQL. Это, безусловно, самый важный аппаратный ресурс, который требуется SQL для обеспечения производительности, и он даст наибольшую отдачу от вложенных средств.

Теперь вернемся к широкому вопросу о «переключении при отказе». В SQL Server решения для высокой доступности разделены на две категории: автоматические и ручные . Для автоматического аварийного переключения у вас действительно есть только несколько решений:

  • Кластеризация . Традиционно это довольно дорого реализовать из-за высокой стоимости оборудования, поддерживающего кластеризацию, но с виртуальными машинами это совсем другая история. Standard Edition SQL поддерживает кластеры с двумя узлами. Кластеризацию сложно развернуть, но с ней довольно легко работать и не требуется никаких изменений приложения для поддержки. При кластеризации единицей отработки отказа является весь экземпляр SQL Server (т.е. каждая база данных, включая master / tempdb / model и msdb, все входы в систему, все задания агента SQL и т. Д.). Кластер - это , а не решение для повышения производительности, так как резервный сервер просто бездействует в случае отказа основного. Вы можете использовать резервную виртуальную машину, развернув так называемый кластер «активный-активный». Это означает, что вы развертываете два кластера, один активный на VM1 и резервный на VM2, другой активный на VM2 и резервный на VM1. В случае аварийного переключения одна из виртуальных машин должна будет взять на себя нагрузку обоих экземпляров, и именно поэтому развертывание «активный-активный» иногда не одобряется. Учитывая, что вы планируете развертывание на виртуальных машинах, а не на (дорогом) металле, я бы не рекомендовал это делать, так как «амортизация» не требует больших затрат.
  • Зеркалирование . Это сохранит «горячее резервное зеркало» вашей базы данных (не экземпляра). Зеркалирование предпочтительнее кластеризации из-за более низкой стоимости развертывания (без специального оборудования), меньшего времени отработки отказа (секунды вместо минут в кластеризации) и возможностей геораспределения (зеркалирование поддерживает распределение узлов на отдельных континентах, кластеризация поддерживает только небольшое расстояние из нескольких стометров между узлами). Но поскольку единицей аварийного переключения является база данных , зеркальное отображение не обеспечивает простоты использования кластеризации. Многие ресурсы, необходимые приложению, не не находятся в базе данных: логины, задания агента, планы обслуживания, почтовые сообщения базы данных и так далее и так далее. Поскольку выполняется аварийное переключение только базы данных, аварийное переключение должно быть тщательно спланировано, чтобы приложение продолжало работать после аварийного переключения (например, необходимо передать логины). Приложение также должно знать о развертывании зеркалирования, чтобы оно подключалось правильно . В Standard Edition вы сможете развернуть зеркалирование только в режиме высокой безопасности .
  • Аппаратное зеркалирование. Я не буду вдаваться в подробности по этому поводу, для этого требуется специализированное оборудование SAN, способное зеркалировать на уровне дисков.

Если вы рассматриваете решения ручного аварийного переключения, есть еще пара альтернатив:

  • Доставка журналов . Доставка журналов - это в основном внешнее зеркалирование. Вместо передачи записей журнала в реальном времени через выделенное TCP-соединение, журнал передается с помощью операций копирования файлов. Есть очень мало причин для выбора доставки журналов вместо зеркалирования: резервная база данных может быть запрошена для создания отчетов, резервная база данных может быть расположена в месте со спорадическим подключением, резервная может быть размещена на действительно маломощной машине .

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

Вы упоминаете, что вас беспокоят затраты на лицензию: на самом деле вы этого не делаете. Не нужна лицензия для любого из пассивных серверов с любой из этих технологий , кроме репликации. Для резервных серверов требуется лицензия только в том случае, если они становятся активными и работают с базой данных более 30 дней.

Учитывая, что вы планируете развертывание на виртуальных машинах, моим выбором будет кластеризация. Если вы планируете развертывание на «железе», я бы рекомендовал зеркальное копирование из-за стоимости оборудования для кластеризации.

2
ответ дан 7 December 2019 в 12:23
поделиться

SQL Server всегда работает лучше всего, если это «ЕДИНСТВЕННЫЙ» компонент, работающий на машине. Просто сделав это, вы получите быструю, легкую и хорошую выгоду. Кажется, ему нравится все контролировать, и он всегда счастлив, когда может:)

1
ответ дан 7 December 2019 в 12:23
поделиться

Естественно, разделение IIS и SQL-сервера - это первый шаг. Sql-сервер действительно хочет иметь для себя полноценную машину.

Второе, что важно, - это анализировать приложение во время его работы. Никогда не пытайтесь оптимизировать производительность вашего приложения, не имея реальных данных об использовании, потому что вы, вероятно, просто тратите время на оптимизацию того, что редко вызывается. Один из методов, который я успешно использовал в прошлом, - это создать System.Diagnostics.Stopwatch в Request_Begin в global.asax, затем сохранить его в контекстной переменной

var sw = new Stopwatch();
sw.Start()
HttpContext.Current.Items["stopwatch"] = sw;

. В Request_End вы снова получите секундомер

sw = HttpContext.Current.Items["stopwatch"];
sw.Stop();
Timespan ts = sw.Elapsed;

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

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

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

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

Затем вы можете проанализировать свое приложение и определить, какие операции занимают больше всего времени, какие вызываются чаще всего и т. Д. Это позволит вам увидеть, есть ли одна страница, которая запрашивается много, и обычно это занимает много времени. Для завершения это должно быть целью оптимизации с использованием любых инструментов, которые у вас есть для этого, как профилировщиков .NET, так и SQL.

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

Причина, по которой он помещается в таблицу, а не записывается в файл журнала, состоит в том, что вы можете использовать синтаксис SQL для фильтрации, группировки, вычисления среднего времени и т.д. и т. д.

Затем вы можете проанализировать свое приложение и определить, какие операции занимают больше всего времени, какие вызываются чаще всего и т. Д. Это позволит вам увидеть, есть ли одна страница, которая запрашивается много, и обычно это занимает много времени. Для завершения это должно быть целью оптимизации с использованием любых инструментов, которые у вас есть для этого, как профилировщиков .NET, так и SQL.

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

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

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

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

Причина, по которой он помещается в таблицу, а не записывается в файл журнала, состоит в том, что вы можете использовать синтаксис SQL для фильтрации, группировки, вычисления среднего времени и т.д. и т. д.

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

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

Причина, по которой он помещается в таблицу, а не записывается в файл журнала, состоит в том, что вы можете использовать синтаксис SQL для фильтрации, группировки, вычисления среднего времени и т.д. и т. д.

0
ответ дан 7 December 2019 в 12:23
поделиться

Вы должны обратиться к этим 2 статьям о codeproject для настройки производительности ASP.Net

1. http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
2. http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx

Я лично применил эти методы в своих приложениях asp.net и добился повышения производительности более чем на 30%.

Кроме того, вы можете обратитесь к этой статье, чтобы узнать о времени безотказной работы вашего приложения 99,99%.

3. http://www.codeproject.com/KB/aspnet/ProdArch.aspx

1
ответ дан 7 December 2019 в 12:23
поделиться

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

Производительность <> масштабируемость.

Однако в игру вступают другие проблемы - если вы не хватает оперативной памяти, производительность может снизиться, если база данных находится в одном корпусе - SQL-сервер любит использовать оперативную память.

Вот почему для таких вещей, как TFS, которые используют SQL-сервер, для небольшого числа пользователей Microsoft рекомендует все это установить. на 1 машине, но для большего числа пользователей Microsoft рекомендует, чтобы БД располагалась на другом сервере.

Вы можете прочитать о вариантах развертывания TFS здесь .

Переключение управления состоянием SQL Server не увеличит производительность - скорее всего, снизит ее, но вы получите другие преимущества (например, надежность).

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

Вы изучали стандартные методы оптимизации ASP.NET, такие как кэширование? Microsoft предоставляет руководство по настройке приложения , которое также может быть полезно для вас.

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

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

Вы изучали стандартные методы оптимизации ASP.NET, такие как кэширование? Microsoft предоставляет руководство по настройке приложения , которое также может быть полезно для вас.

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

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

Вы изучали стандартные методы оптимизации ASP.NET, такие как кэширование? Microsoft предоставляет руководство по настройке приложения , которое также может быть полезно для вас.

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

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

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

1
ответ дан 7 December 2019 в 12:23
поделиться

Может помочь разделение слоев. Часто настройка машины для БД довольно специфична, так что это разумное первое усилие.

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

Вы можете принять во внимание две вещи:

  1. Можете ли вы принять подход «хранилища данных»? Обеспечьте подачу второй БД из первой. Новая БД - это место, где тяжелые пользователи делают свою работу. Конечно, их статистика будет немного устаревшей, но концептуально это всегда будет правдой - к тому времени, как они посмотрят на ответы, мир переместится.
  2. Контролируйте количество запросов статистики, которые вы разрешаете одновременно. Возможно, они будут отправлены в очередь как «задание». Запустите их с низким приоритетом.
0
ответ дан 7 December 2019 в 12:23
поделиться
Другие вопросы по тегам:

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