-Поиск по дневнику

Поиск сообщений в rss_rss_hh_new

 -Подписка по e-mail

 

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.03.2011
Записей:
Комментариев:
Написано: 51

Habrahabr/New








Добавить любой RSS - источник (включая журнал LiveJournal) в свою ленту друзей вы можете на странице синдикации.

Исходная информация - http://habrahabr.ru/rss/new/.
Данный дневник сформирован из открытого RSS-источника по адресу http://feeds.feedburner.com/xtmb/hh-new-full, и дополняется в соответствии с дополнением данного источника. Он может не соответствовать содержимому оригинальной страницы. Трансляция создана автоматически по запросу читателей этой RSS ленты.
По всем вопросам о работе данного сервиса обращаться со страницы контактной информации.

[Обновить трансляцию]

[Перевод] Офис открытого типа умер?

Суббота, 23 Сентября 2017 г. 14:41 + в цитатник
m1rko сегодня в 14:41 Управление

Офис открытого типа умер?

  • Перевод
Планировка офиса открытого типа изначально должна была способствовать созданию эгалитарной рабочей среды, которая вдохновляет на творчество и спонтанное сотрудничество между коллегами. Спустя 60 лет после её изобретения всё больше научных исследований начали показывать то, что многие работники уже знают — офисы открытого типа далеки от этого идеала.

Как мы к этому пришли


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

Не прошло и десяти лет, как Роберт Пропст, исполнительный директор Herman Miller, изобрёл кубикл — и стены вернулись. Пропст критиковал офисы открытого типа как пустыню, которая «высасывает жизненную энергию, мешает талантам, делает тщетными любые достижения». Он представлял себе кубиклы как способ дать свободу работникам, обеспечив им приватность и персональное пространство. К сожалению, большинство компаний свело его просторные, гибкие планировки ко всем нам известным депрессивным, но менее дорогим, перенаселённым бежевым кубиклам. (В интервью от 1998 года сам Пропст обвинил компании, что они превратили его оригинальную идею в «адские дыры»).

Сегодня планировки офисов открытого типа вернулись, чтобы отомстить. В исследовании 2013 года, проведённом CoreNet Global, ассоциацией для корпоративных менеджеров по недвижимости, более 80% респондентов сказали, что их компании перешли на открытую планировку. И опять начали проявляться негативные последствия. В последние пять лет этот прогрессивный дизайн, который предполагался прогрессивным, атаковало множество статей с алармистскими заголовками вроде «Смерть офисам открытого типа!» и «Офисы открытого типа созданы дьяволом в самых глубоких пещерах ада».

Так что конкретно не так с современными планировками открытых офисов и как организовать пространство в соответствии с изначальными обещаниями более радостной и эффективной совместной работы?

В чём проблема


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

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

В безбарьерной среде шум тоже может стать проблемой. Громкие телефонные разговоры, шушукающие сотрудники и тот парень, чавкающий яблоком каждый полдень — всё это вместе стремится истощить вашу нервную систему. Исследователи обнаружили, что в открытых планировках потеря производительности из-за шума вдвое выше, чем в персональных офисах, у людей снижается способность запоминать события и им труднее выполнять даже простые арифметические задачи.

Как знает каждый, кому приходилось звонить врачу по телефону в офисе открытого типа, один из главных недостатков открытых планировок в том, что вы не можете контролировать, кого вы слышите — а кто слышит вас. В исследовании 2013 года о компромиссах приватности в офисах открытого типа, 60% работников в кубиклах и 50% работников в офисах без перегородок значительной проблемой назвали отсутствие конфиденциальности переговоров.

Кроме всех этих неприятностей, офисы открытого типа в прямом смысле лишают людей здоровья. Исследование взаимосвязи между количеством больничных и открытыми планировками показало, что сотрудники офисов открытого типа берут на 62% больше больничных, чем люди из закрытых кабинетов. И ещё, вы же помните обо всех тех помехах работе в офисах открытого типа? Исследование, опубликованное в «Международном журнале по управлению стрессом», показало, что частые помехи работе сотрудников повышают уровень нервного истощения на 9%.

Офис будущего уже здесь


Очевидно, офисы открытого типа не стали генераторами креативности, как рассчитывали их создатели. И с дефицитом офисного пространства невозможно выделить каждому личный кабинет, да это и не идеальный вариант. Приливы и отливы эффективного сотрудничества требуют существования нескольких типов офисов. Как изложили эксперты в данной области в Harvard Business Review, сотрудники склонны генерировать идеи и обрабатывать информацию в одиночку или в парах, потом собираться в большие группы для развития этих идей, а затем снова изолироваться для осуществления следующих шагов.

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

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

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

Зонирование. Вместе с созданием большего количество частных уголков, компании теперь заменяют обычные конференц-залы б'oльшим разнообразием мест для переговоров. Среди них небольшие ниши, где три-четыре коллеги могут быстро собраться для переговоров в процессе работы, и более большие места на 5-8 человек, которые можно бронировать заранее или зарезервировать для часто встречающихся групп. Компании также могут уменьшить количество нежелательных помех работе сотрудников, разделив пространство на районы, основываясь на ожидаемых уровнях шума и поместив более шумные отделы, такие как отдел продаж и оперативный отдел, как можно дальше от тихих отделов. Столы, стеллажи и большие растения создают более лабиринтные конфигурации, уменьшая слуховые и зрительные отвлекающие факторы.

Нет обязательного рабочего места. Современные средства мобильной связи позволяют работать в любом месте, открывая всё здание в качестве потенциального рабочего места. Вам может потребоваться та энергия, которую даёт шум кафе или атриума (центральное пространство общественного здания — прим. пер.). Или вы можете обнаружить, что перемещение на свежий воздух приносит свежие идеи. Более того, согласно архитектурной и дизайнерской фирме Gensler, «у работодателей, которые предлагают выбор, когда и где работать, работники на 12% больше удовлетворены своей работой и показывают более высокие показатели эффективности».

Такие типы планировок — где у человека есть выбор работать в той части офиса, которая наилучшим образом отвечает его задачам и настроению в каждый конкретный момент, — именно то, что нужно офисам. С их помощью компании могут, наконец-то, добиться той свободы и обмена идеями, которые обещали изобретатели офисов открытого типа в 1950-е годы. И это может дать то, что нужно всем: рабочие места, подходящие каждому сотруднику.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/338552/


Метки:  

Работа с API КОМПАС-3D -> Урок 4 -> Основная надпись

Суббота, 23 Сентября 2017 г. 13:27 + в цитатник
kompas_3d сегодня в 13:27 Разработка

Работа с API КОМПАС-3D -> Урок 4 -> Основная надпись

  • Tutorial
Продолжаем цикл статей по работе с API САПР КОМПАС-3D Сергея Норсеева, инженера-программиста АО «ВНИИ «Сигнал», автора книги «Разработка приложений под КОМПАС в Delphi». В качестве среды используется C++ Builder. В предыдущих уроках по API КОМПАС Основы и Оформление чертежа мы исходили из того, что КОМПАС не запущен, и запускали его сами методом CreateInstance. В следующем уроке Корректное подключение к КОМПАС мы проверяли наличие уже запущенного КОМПАСа и подключались к нему. В этом уроке разберём, как заполнить основную надпись чертежа.




Основная надпись в КОМПАС описывается интерфейсом ksStamp. Для получения указателя на него используются методы GetStamp() и GetStampEx() интерфейсов ksDocument2D, ksSpcDocument и ksDocumentTxt.
Единственным параметром метода GetStampEx является номер листа, для которого запрашивается интерфейс основной надписи. Нумерация листов начинается с единицы. Метод GetStamp не имеет параметров. Он возвращает интерфейс основной надписи для первого листа чертежа или спецификации.
Прежде чем перейти к рассмотрению интерфейса ksStamp, бегло рассмотрим интерфейс ksTextItemParam.

Компонента строки



Интерфейс ksTextItemParam задает компоненту строки текста. Под «компонентой» понимается строка или спецсимвол. Получить этот интерфейс можно с помощью метода GetParamStruct интерфейса KompasObject. Для этого в качестве единственного параметра данному методу нужно передать константу ko_TextItemParam.
Свойств у интерфейса ksTextItemParam всего три.

  • iSNumb – код спецсимвола. Спецсимволы и их номера приведены в файле NumbSymb.frw, входящем в комплект поставки КОМПАС. Он расположен в подкаталоге SDK основного каталога программы КОМПАС.
  • s – строка. Если интерфейс ksTextItemParam используется для описания спецсимвола, то данная строка выводится после спецсимвола.
  • type – задает назначение интерфейса. Если значение этого свойства равно SPECIAL_SYMBOL, то интерфейс описывает спецсимвол и строку. При этом строка располагается сразу за спецсимволом. Если же значение этого свойства отлично от SPECIAL_SYMBOL, то значение свойства iSNumb игнорируется, а интерфейс описывает только строку s. Учтите, что в заголовочных файлах старых версий КОМПАС данное свойство называется type_ (со знаком подчеркивания), а константа SPECIAL_SYMBOL не определена. Она равна 17.


В документации КОМПАС-3D v17 интерфейс ksTextItemParam описан в рубрике «Текстовый документ (Интерфейс ksDocumentTxt) / ksDocumentTxt – методы / Интерфейсы параметров элементов текста /».


Описание интерфейсов параметров элементов текста в SDK

Но при описании свойства type константа SPECIAL_SYMBOL не упоминается. Она приводится (правда без числового значения) в разделе «Структуры параметров и константы / Структуры параметров текста / TextItemParam – структура параметров компоненты текста».


Описание структуры параметров компоненты строки текста в SDK

Там же приводятся еще три возможных значения свойства type (FONT_SYMBOL, FRACTION_TYPE, SUM_TYPE), но их назначение я так и не понял. Как показали эксперименты, поведение интерфейса ksTextItemParam при данных константах ничем не отличается от нулевого значения свойства type. Правда я тестировал в контексте основной надписи, возможно, что это накладывает какие-то свои ограничения.
Теперь рассмотрим методы интерфейса ksTextItemParam.

  • GetItemFont() – возвращает интерфейс параметров шрифта ksTextItemFont.
  • SetItemFont – устанавливает новый интерфейс параметров шрифта ksTextItemFont. Устанавливаемый интерфейс передается в качестве значения единственного параметра. В случае успеха метод возвращает значение true.
  • Init() – инициализирует нулями свойства интерфейса. В случае успеха возвращает значение true.


Основная надпись



Как говорилось выше, основная надпись описывается интерфейсом ksStamp. У данного интерфейса нет интересных свойств, поэтому сразу переходим к рассмотрению его методов.

  • ksClearStamp – очищает основную надпись или ее отдельную ячейку. Единственным параметром данного метода является номер очищаемой ячейки. Если его значение равно нулю, то очищается вся основная надпись. В случае успеха данный метод возвращает единицу, а в случае ошибки — нуль.
  • ksCloseStamp() – закрыть основную надпись. Это означает выйти из режима редактирования основной надписи. В случае успеха возвращает единицу, а в случае ошибки – нуль.
  • ksColumnNumber – делает текущей заданную ячейку. В качестве единственного параметра в данный метод передается номер ячейки, которая делается текущей. В случае успеха данный метод возвращает единицу, а в случае ошибки — нуль.
  • ksOpenStamp() – открыть основную надпись. Это означает войти в режим редактирования основной надписи. Не имеет входных параметров, в случае успеха возвращает единицу, а в случае ошибки — нуль.
  • ksTextLine – записать строку в текущую ячейку. Текущая ячейка должна быть установлена методом ksColumnNumber. Единственным параметром метода ksTextLine является указатель на интерфейс ksTextItemParam, о котором я говорил чуть выше. В случае успеха метод ksTextLine возвращает единицу, а в случае ошибки — нуль.


Это неполный перечень методов интерфейса ksStamp, но их вполне достаточно для работы с основной надписью. Тем не менее, нужно сделать ряд замечаний.

  1. Все ячейки основной надписи пронумерованы. В документации КОМПАС данных номеров нет, но есть отсылка к ГОСТам на основную надпись (ГОСТ 2.104-68 и ГОСТ 2.104-2006). Также нумерацию ячеек основной надписи можно посмотреть на странице. На рисунках ниже представлены номера ячеек основной надписи форм 2а и 2б, полученные экспериментальным путем.



    Первый лист



    Второй и последующие листы
  2. Метод ksTextLine — не единственный способ записи строк в основную надпись. Помимо него у интерфейса ksStamp есть метод ksSetStampColumnText, который делает то же самое. Единственное отличие состоит в том, что в нем устанавливаемая строка задается не в виде интерфейса ksTextItemParam, а в виде динамического массива ksDynamicArray. В данной статье мы не будем его рассматривать.


Редактирование основной надписи


Заполнение основной надписи состоит из нескольких последовательных этапов:

  1. Получить указатель на интерфейс ksTextItemParam. Для этого используется метод GetParamStruct интерфейса ksKompasObject. Интерфейс ksTextItemParam нужен для представления строк, записываемых в основную надпись.
  2. Получить указатель на интерфейс основной надписи ksStamp с помощью методов GetStamp или GetStampEx интерфейсов документа, спецификации.
  3. Вызвать метод ksOpenStamp() интерфейса ksStamp. Так мы входим в режим редактирования основной надписи.
  4. Подготовить строку, которая будет записана в ячейку основной надписи. Строка должна быть представлена в виде интерфейса ksTextItemParam.
  5. Выделить ячейку, в которую нужно записать строку. Для выделения ячейки используется метод ksColumnNumber интерфейса ksStamp.
  6. Вызвав метод ksTextLine интерфейса ksStamp, записать строку в выделенную ячейку.
  7. Повторить пункты 4-6 для всех строк, записываемых в основную надпись.
  8. Закрыть основную надпись методом ksCloseStamp интерфейса ksStamp.


Пример



Ниже приводится фрагмент программы, демонстрирующий работу с основной надписью.

//Получаем интерфейс представления строк
TextItemParamPtr TextItemParam;
TextItemParam = (TextItemParamPtr)kompas->GetParamStruct(ko_TextItemParam);

//Получаем интерфейс основной надписи
StampPtr Stamp;
Stamp = (StampPtr)Document2D->GetStamp();
//Открываем основную надпись
Stamp->ksOpenStamp();

Stamp->ksColumnNumber(1);
TextItemParam->s = SysAllocString(L"Деталь");
Stamp->ksTextLine(TextItemParam);

Stamp->ksColumnNumber(3);
TextItemParam->s = SysAllocString(L"");
TextItemParam->type = SPECIAL_SYMBOL;
TextItemParam->iSNumb = 51;
Stamp->ksTextLine(TextItemParam);

Stamp->ksColumnNumber(110);
TextItemParam->set_s(SysAllocString(L"Норсеев С.А."));
TextItemParam->type = 0;
Stamp->ksTextLine(TextItemParam);

//Закрываем основную надпись
Stamp->ksCloseStamp();


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


Основная надпись, полученная программно.

Сделаю два замечания по поводу приведенного выше фрагмента программы.

  1. В данном примере не приводится код, ответственный за подключение к КОМПАС и создание чертежа. Я убрал его для облегчения понимания кода. О том, как подключаться к КОМПАС и настраивать чертеж (в том числе выбирать формат основной надписи в нем), говорилось в предыдущих статьях цикла.
  2. Если внимательно посмотреть на приведенный выше код, то можно увидеть, что в одном случае строка устанавливалась в интерфейсе ksTextItemParam путем присвоения значения свойству s, а в другом — путем вызова метода set_s, про который я ничего не говорил. Дело в том, что в технологии COM все свойства представляются в виде методов (как правило, установки и чтения). Наименование этих методов формируется следующим образом:
    get_<имя свойства>
    set_<имя свойства>
    В своих программах вы можете использовать любой из этих подходов (присвоение значения свойству или же вызов соответствующего метода).


Заключение
В данной статье мы научились заполнять основную надпись и познакомились с одним из интерфейсов для представления строк и спецсимволов. В последующих статьях цикла мы познакомимся и с другими интерфейсами.

Продолжение следует, следите за новостями блога.

Сергей Норсеев, автор книги «Разработка приложений под КОМПАС в Delphi».
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/337288/


Метки:  

Kак Microsoft пытается отправить мобильную почту к себе

Суббота, 23 Сентября 2017 г. 11:03 + в цитатник
hardpoint сегодня в 11:03 Разработка

Kак Microsoft пытается отправить мобильную почту к себе



    Хранит ли Outlook-iOS-Android копию почтового ящика на сервере микрософт?


    В подвешенном состоянии очутились многие корпоративные пользователи, которые недавно обновились до iOS 11. Дело в том, что после обновления перестает работать стандартный клиент (Mail.app) с ресурсами на Exchange Server 2016, Office 365 или Outlook.com
    Отправка сообщения заканчивается ошибкой «Cannot Send Mail. The message was rejected by the server.»
    Проблема заключается в том, что Exchange 2016 использует HTTPS / 2 TLS-соединения для своих клиентов. Когда почтовое приложение iOS пытается подключиться к Exchange с помощью ActiveSync, оно неправильно согласовывает соединение.


    Microsoft подтвердило проблему и в качестве решения предлагает установить клиента Outlook for iOS.

    Данное решение весьма спорное, т.к. программа Outlook не подключается напрямую к почтовому серверу, а с введенными учетными записями сервер Microsoft, расположенный в США, подключается к вашему серверу и, скорее всего, загружает на него копию вашего почтового ящика.

    Ниже приведен фрагмент анализа логов подключения из программы SkypeTime.



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

    news.ok.ubc.ca/it/2015/02/03/outlook-app-for-ios-and-android-devices-blocked
    blog.winkelmeyer.com/2015/01/warning-microsofts-outlook-app-for-ios-breaks-your-company-security
    blog.winkelmeyer.com/2015/02/updates-on-the-latest-outlook-ios-app-issues

    Насколько это юридически правильно и хорошо мы судить не будем, но для повышения уровня конфиденциальности можно заблокировать подключение с этих серверов на Exchange 2016.

    New-ActiveSyncDeviceAccessRule -QueryString "Outlook for iOS and Android" -Characteristic DeviceModel -AccessLevel Block

    Надеюсь данная информация будет кому то полезна.
    Original source: habrahabr.ru (comments, light).

    https://habrahabr.ru/post/338542/


    Метки:  

    Трансляция с геймдев-конференции 4C в Санкт-Петербурге. День второй

    Суббота, 23 Сентября 2017 г. 09:57 + в цитатник
    Wargaming сегодня в 09:57 Разработка

    Трансляция с геймдев-конференции 4C в Санкт-Петербурге. День второй

      Продолжаем текстовую трансляцию с геймдев-конференции 4C в Санкт-Петербурге.



      Видео-стрим: www.facebook.com/4CSPb/videos/1849539205375515

      Original source: habrahabr.ru (comments, light).

      https://habrahabr.ru/post/338526/


      Метки:  

      CGLayout — новая система автоматического layout'а в iOS

      Суббота, 23 Сентября 2017 г. 03:42 + в цитатник
      K-o-D-e-N сегодня в 03:42 Разработка

      CGLayout — новая система автоматического layout'а в iOS

        Привет Хабр!
        Хочу представить мою последнюю open-source разработку — CGLayout — вторая система разметки в iOS после Autolayout, основанная на ограничениях.



        "Очередная система автолайаута… Зачем? Для чего?" — наверняка подумали вы.
        Действительно iOS сообществом создано уже немало layout-библиотек, но ни одна так и не стала по-настоящему массовой альтернативой ручному layout`у, не говоря уже про Autolayout.


        CGLayout работает с абстрактными сущностями, что позволяет одновременно использовать UIView, CALayer и not rendered объекты для построения разметки. Также имеет единое координатное пространство, что позволяет строить зависимости между элементами, находящимися на разных уровнях иерархии. Умеет работать в background потоке, легко кешируется, легко расширяется и многое-многое другое.
        CGLayout функциональный продукт, у которого есть хорошие перспективы развиться в большой проект.


        Но изначально цель была банальна, как и обычно, просто упростить себе жизнь.
        Всем иногда приходится писать ручной layout, либо из-за плохой производительности Autolayout, либо из-за сложной логики. Поэтому постоянно писались какие-то расширения (а-ля setFrameThatFits и т.д.)
        В процессе реализации таких расширений возникают идеи более сложного порядка, но из-за отсутствия времени, как обычно, это все остается в рамках записи в Trello и висит там вечность.
        Но когда ты наконец добрался до реализации и не видно горизонта, тебя затягивает, и остановиться уже нереально. Все-таки я надеюсь время было потрачено не зря и мое решение облегчит кому-то жизнь, если не функциональностью фреймворка, то примером кода.
        Помимо рассказа о своем решении, я попробую проанализировать и сравнить другие фреймворки, поэтому думаю скучно не будет.


        Сравнение


        Функциональность


        Требования FlexLayout ASDK (Texture) LayoutKit Autolayout CGLayout
        Производительность + + + - +
        Кешируемость + + + +- +
        Мультипоточность - + + - +
        Cross-hierarchy layout - - - + +
        Поддержка CALayer и 'not rendered' вью - + - - +
        Расширяемость - + + - +
        Тестируемость + + + + +
        Декларативный + + + + +

        Какие-то показатели могут быть субъективны, т.к. я не использовал эти фреймворки в production. Если я ошибся, поправьте меня пожалуйста.


        Производительность


        Для тестирования использовался LayoutFrameworkBenchmark.



        AsyncDisplayKit не добавлен в график в силу того, что он не был включен разработчиком бенчмарка, да и ASDK осуществляет layout в бэкграунде, что не совсем честно для измерений производительности. В качестве альтернативы можно посмотреть приложение Pinterest. Производительность там действительно впечатляющая.


        Анализ


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


        LayoutKit


        Github 25 issues


        Не очень гибкий, требует написания большого количества кода, и достаточно большого включения программиста в реализацию. Не нашел информации об использовании LayoutKit'а в каких-то других приложениях, кроме самого LinkedIn.
        И все-таки есть мнение, что LayoutKit не достиг своей цели, лента в приложении LinkedIn все равно тормозит.


        Особенности:


        • Под каждую нестандартную разметку необходимо создавать субкласс с реализацией этого layout'а.
        • Ядро системы занимается созданием вью и их переиспользованием. Все вью крутятся в кеше, что может сломать ссылочную целостность при использовании внешней ссылки на вью. Да и в принципе вью недоступны через публичный интерфейс.
        • Layout блоки (такие как LabelLayout) дублируют много информации о представлении. При их инициализации нужно задавать дефолтные значения (текста и т.д)
        • Нет гибкости в создании относительных зависимостей между элементами.

        FlexLayout (aka YogaKit)


        Github 65 issues
        AppSight


        Предоставляет возможность заниматься только layout'ом. Никаких других плюшек, фишек нет.
        Особенности:


        • Нет возможности закешировать layout. Можно получить только размер.
        • Не нативная реализация. API больше подходящее для кроссплатформерных разработчиков, веб-разработчиков.
        • Проблемы с изменением размера экрана — приходится вручную изменять размер layout-объекта и делать пересчет.
        • Требует создания лишних вью при организации layout-блоков.

        AsyncDisplayKit (Texture)


        Github 200 issues
        AppSight


        В Facebook пошли путем создания потокобезопасной абстракции более высокого уровня. Что вызвало необходимость реализовывать весь стек инструментов UIKit. Тяжелая библиотека, если вы решили ее использовать, отказаться потом от нее будет невозможно. Но все-таки это пока самое грамотное и развитое open-source решение.
        Особенности:


        • Не совместим с другими layout-фреймворками, кроме встроенного Yoga.
        • Требует использования ASDisplayNode субклассы. По сути исключая работу с UIKit. Решив работать с ASDK можно забыть про другие средства, привыкайте писать вместо UI…, AS… .
        • Собственная реализация большого количества UIKit механизмов, что может привести к устареванию кода и больших расхождений с реализацией от Apple, багам не связанным с релизами Apple.
        • Дорогая поддержка.
        • Мало информации связанных с решением проблем. Поиск на StackOverflow со строкой "AsyncDisplayKit" находит 181 совпадений (для сравнения “UIKit” — 66,550).

        CGLayout


        • Использование как на уровне UIView, так и на уровне CALayer. Можно комбинировать и ограничивать вью по положению layer'а и наоборот. Возможность использовать not rendered объекты.
        • Переиспользование layout-спецификации для разных объектов.
        • Возможность создания cross-hierarchy зависимостей.
        • Строгая типизация.
        • Кеширование разметки через получение snapshot'ов.
        • Создание кастомных ограничений независимых от окружения. Например ограничение по размеру строки для лейбла.
        • Поддержка layout guides и легкое создание плейсхолдеров для вью.
        • Поддерживает любой доступный layout (прямой, background, кэшированный).
        • Простая интеграция с UIKit.
        • Легко расширяемая.

        Текущие ограничения:


        • Программисту необходимо думать о последовательности при определении layout-схемы и применении ограничений.
        • Расчет разметки UIView, используя layer свойство ведет к неопределенному поведению, так как frame у UIView изменяется неявно и побочные действия (такие как drawRect, layoutSubviews) не вызываются. При этом layer UIView спокойно можно использовать как ограничение для другого layer'а.
        • В случае получения snapshot для фрейма, отличающегося от текущего значения bounds в супервью и наличии ограничений, основанных на супервью, может приводить к неожидаемому результату.
        • Пока не очень приспособлен к сложному layout'у с вероятностными ограничениями.
        • Расчет разметки с ограничениями между UIView и CALayer медленный из-за необходимости конвертировать координаты с моей реализацией.

        Что пока не реализовано:


        1. Поддержка RTL.
        2. Поведение при удалении вью из иерархии.
        3. Поддержка macOS, tvOS.
        4. Поддержка trait-коллекций.
        5. Нет удобной конструкций для выполнения разметки переиспользуемых вью.
        6. Динамическое изменение текущей layout-конфигурации.

        Реализация CGLayout


        CGLayout построен на современных принципах языка Swift.
        Реализация управления разметкой в CGLayout базируется на трех базовых протоколах: RectBasedLayout, RectBasedConstraint, LayoutItem.


        Термины

        Все сущности имплементирующие LayoutItem я буду называть layout-элементами, все остальные сущности просто layout-сущностями.


        Условные обозначения

        Основная разметка


        public protocol RectBasedLayout {
            func layout(rect: inout CGRect, in source: CGRect)
        }

        RectBasedLayout — декларирует поведение для изменения разметки и определяет для этого один метод, с возможностью ориентирования относительно доступного пространства.


        Структура Layout, имплементирующая протокол RectBasedLayout, определяет полную и достаточную разметку для layout-элемента, т.е. позиционирование и размеры.
        Соответственно, Layout разделяется на два элемента выравнивание Layout.Alignment и заполнение Layout.Filling. Они в свою очередь состоят из горизонтального и вертикального лайаута. Все составные элементы реализуют RectBasedLayout. Что позволяет использовать элементы лайаута разного уровня сложности для реализации разметки. Все лайаут сущности легко могут быть расширены вашими имплементациями.


        Составная схема структуры Layout:

        Ограничения


        Все ограничения реализуют RectBasedConstraint. Если сущности RectBasedLayout определяют разметку в доступном пространстве, то сущности RectBasedConstraint это доступное пространство определяют.


        public protocol RectBasedConstraint {
            func constrain(sourceRect: inout CGRect, by rect: CGRect)
        }

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


        Составная схема структуры LayoutAnchor:

        Layout constraints


        public protocol LayoutConstraintProtocol: RectBasedConstraint {
            var isIndependent: Bool { get }
            func layoutItem(is object: AnyObject) -> Bool
            func constrainRect(for currentSpace: CGRect, in coordinateSpace: LayoutItem) -> CGRect
        }

        Определяют зависимость от layout-элемента или контента (текст, картинка и т.д.). Являются самодостаточными ограничениями, которые содержат всю информацию об источнике ограничения и применяемых ограничителях.
        LayoutConstraint — ограничение, связанное с layout-элементом с определенным набором ограничителей.
        AdjustLayoutConstraint — ограничение, связанное с layout-элементом, содержит size-based ограничители. Доступен для layout-элементов, поддерживающих AdjustableLayoutItem протокол.


        Layout-элементы


        public protocol LayoutItem: class, LayoutCoordinateSpace {
            var frame: CGRect { get set }
            var bounds: CGRect { get set }
            weak var superItem: LayoutItem? { get }
        }

        Его реализуют такие классы как UIView, CALayer, а также not rendered классы. Также вы можете реализовать другие классы, например stack view.


        Во фреймворке есть реализация LayoutGuide. Это аналог UILayoutGuide из UIKit, но с возможностью фабрики layout-элементов. Что позволяет использовать LayoutGuide в качестве плейсхолдера, что довольно актуально в свете последних дизайн решений. В частности для этих целей создан класс ViewPlaceholder. Он реализует такой же паттерн загрузки вью как и UIViewController. Поэтому работа с ним будет очень знакомой.


        Для элементов, которые могут рассчитать свой размер задекларирован протокол:


        public protocol AdjustableLayoutItem: LayoutItem {
            func sizeThatFits(_ size: CGSize) -> CGSize
        }

        По умолчанию его реализуют только UIView.


        Layout coordinate space


        public protocol LayoutCoordinateSpace {
            func convert(point: CGPoint, to item: LayoutItem) -> CGPoint
            func convert(point: CGPoint, from item: LayoutItem) -> CGPoint
            func convert(rect: CGRect, to item: LayoutItem) -> CGRect
            func convert(rect: CGRect, from item: LayoutItem) -> CGRect
        
            var bounds: CGRect { get }
            var frame: CGRect { get }
        }

        Система лайаута имеет объединенную координатную систему представленную в виде протокола LayoutCoordinateSpace.


        Она создаёт единый интерфейс для всех layout-элементов, при этом используя основные реализации каждого из типов (UIView, CALayer, UICoordinateSpace + собственная реализация для кросс-конвертации).


        Layout-блоки


        public protocol LayoutBlockProtocol {
            var currentSnapshot: LayoutSnapshotProtocol { get }
            func layout()
            func snapshot(for sourceRect: CGRect) -> LayoutSnapshotProtocol
            func apply(snapshot: LayoutSnapshotProtocol)
        }

        Layout-блок является законченной и самостоятельной единицей макета. Он определяет методы для выполнения разметки, получения/применения snapshot`а.


        LayoutBlock инкапсулирует layout-элемент, его основной лайаут и ограничения, реализующие LayoutConstraintProtocol.


        Процесс актуализации разметки начинается с определения доступного пространства с помощью ограничений. Следует учитывать, что система пока никак решает проблем с конфликтными ограничениями и никак их не приоритезирует, поэтому следует внимательно подходить к применению ограничений. Так в общем случае, ограничения основанные на размере (AdjustLayoutConstraint) следует ставить после ограничений, основанных на позиционировании. В качестве исходного пространства берется пространство супервью (bounds). Каждое ограничение изменяет доступное пространство (обрезает, смещает, растягивает и т.д.). После того как ограничения отработали, полученное пространство передается в Layout, где и рассчитывается актуальная разметка для элемента.


        LayoutScheme — блок, который объединяет другие лайаут блоки и определяет корректную последовательность для выполнения разметки.


        Layout snapshot


        public protocol LayoutSnapshotProtocol {
            var snapshotFrame: CGRect { get }
            var childSnapshots: [LayoutSnapshotProtocol] { get }
        }

        LayoutSnapshot — снимок представленный в виде набора фреймов, сохраняя иерархию layout-элементов.


        Extended


        Все расширяемые элементы реализуют протокол Extended.


        public protocol Extended {
            associatedtype Conformed
            static func build(_ base: Conformed) -> Self
        }

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


        Пример использования


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


        let leftLimit = LayoutAnchor.Left.limit(on: .outer)
        let topLimit = LayoutAnchor.Top.limit(on: .inner)
        let heightEqual = LayoutAnchor.Size.height()
        ...
        let layoutScheme = LayoutScheme(blocks: [
           distanceLabel.layoutBlock(with: Layout(x: .center(), y: .bottom(50), 
                                             width: .fixed(70), height: .fixed(30))),
           separator1Layer.layoutBlock(with: Layout(alignment: separator1Align, filling: separatorSize), 
                                            constraints: [distanceLabel.layoutConstraint(for: [leftLimit, topLimit, heightEqual])])
        ...
        ])
        
        ...
        
        override public func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()
            layoutScheme.layout()
        }

        В этом примере сепаратор использует ограничения по distanceLabel, после того, как определено положение этого лейбла.


        Итоги


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


        CGLayout имеет не совсем привычную логику описания процесса layout'а, поэтому требует привыкания.
        Тут еще много работы, но это вопрос времени, при этом уже сейчас видно, что он имеет ряд преимуществ, которые должны ему позволить занять свою нишу в области подобных систем. Работа фреймворка ещё не тестировалось в production, и у вас есть возможность попробовать это сделать. Фреймворк покрыт тестами, поэтому больших проблем возникнуть не должно.


        Надеюсь на ваше активное участие в дальнейшей разработке фреймворка.


        Github репозиторий


        И в конце хотелось бы поинтересоваться у хабра-юзеров:
        Какие требования предъявляете вы к layout-системам?
        Что вам больше всего не нравится делать при построении верстки?

        Original source: habrahabr.ru (comments, light).

        https://habrahabr.ru/post/338540/


        Метки:  

        MikroTik — несколько адресов и несколько разных MAC на одном интерфейсе

        Суббота, 23 Сентября 2017 г. 01:02 + в цитатник
        nkusnetsov сегодня в 01:02 Администрирование

        MikroTik — несколько адресов и несколько разных MAC на одном интерфейсе

          image

          Нечасто, но с завидной периодичностью на профильных форумах возникал один и тот же вопрос: «как на одном интерфейсе роутера MikroTik получить два IP-адреса с разными MAC?». Обычно этот вопрос остается без ответа, либо вопрошающему отвечают «никак». И действительно, задача нетривиальная. В стандартной конфигурации соблюдается правило «1 интерфейс = 1 MAC». В этой статье я расскажу как обойти это ограничение используя расширенный функционал MikroTik.

          Сначала вспомним матчасть RouterBoard. Помимо маршрутизации, устройства MikroTik могут выполнять и коммутацию. Для этого некоторые из них имеют отдельный свитч-чип, а также возможность объединять интерфейсы с помощью программного коммутатора — bridge. Bridge (в русской терминологии «мост») производит коммутацию пакетов за счёт ресурсов процессора устройства. С помощью моста также объединяют между собой разнородные ethernet-образные инетрфейсы — ethernet, wlan, vlan, eoip, vpls.

          image
          Мост в иерархии интерфейсов микротик является более высокой, объединяющей сущностью. При объединении интерфейсов с помощью моста, на него устанавливается MAC-адрес, который будет транслироваться во все подчиненные (slave) интерфейсы. MAC-адреса подчиненных интерфейсов перестают использоваться и заменяются в исходящих фреймах MAC-адресом моста. Соответственно, IP-адрес и все службы связанные с протоколом IP должны быть привязаны НЕ к зависимым интерфейсам, а к вышестоящему мосту.

          За счёт того, что мост реализован ресурсами CPU, он имеет очень широкий функционал по управлению трафиком. Фильтрация входящих и транзитных пакетов, а также возможность трансляции MAC-адресов сразу привлекли моё внимание. Итак, инструментом решения задачи будет bridge, точнее bridge NAT.
          image

          Приступим. У нашего подопытного маршрутизатора есть внутренний мост «bridge-local», которому присвоен адрес 192.0.2.1/24 и который является шлюзом для компьютеров локальной сети. Для «bridge-local» администратором назначен MAC D4:CA:6D:C7:11:11 Физический интерфейс Ether2 является одним из подчиненных (slave) портов моста «bridge-local» и непосредственно соединяется с локальной сетью.
          Задача: добавить на маршрутизатор адрес из той же IP-подсети, но с другим MAC-адресом. Для примера выбрано сочетание IP 192.0.2.111/24 и MAC: D4:CA:6D:C7:22:22
          Поскольку в лоб правило «1 интерфейс = 1 MAC» преодолеть нельзя, мы пойдем в обход. Для начала создадим вспомогательный интерфейс «bridge111» куда навесим дополнительный IP-адрес и MAC:

          RouterOS command
          /interface bridge add admin-mac=D4:CA:6D:C7:22:22 auto-mac=no name=bridge111 protocol-mode=none


          Теперь разбираемся, что, откуда и куда нужно будет подменять используя мост. Для этого заглянем в описание протокола ARP: ru.wikipedia.org/wiki/ARP#.D0.9F.D1.80.D0.B8.D0.BD.D1.86.D0.B8.D0.BF_.D1.80.D0.B0.D0.B1.D0.BE.D1.82.D1.8B
          Очевидно, что нам нужно перехватывать ARP-запросы узлов запрашивающих MAC устройства имеющего IP 192.0.2.111. Для этого в NAT существует отдельный action «arp-reply»:

          RouterOS command
          /interface bridge nat add action=arp-reply arp-dst-address=192.0.2.111/32 chain=dstnat dst-mac-address=FF:FF:FF:FF:FF:FF/FF:FF:FF:FF:FF:FF in-bridge=bridge-local mac-protocol=arp to-arp-reply-mac-address=D4:CA:6D:C7:22:22


          Попытка выполнить с компьютера команду «ping 192.0.2.111» явного результата не дала, однако при просмотре на компьютере локальной arp-таблицы стало видно сопоставление нового IP-адреса с новым MAC. Получается протокол ARP мы победили.
          image

          Переходим к следующему шагу — нам нужно добиться связности по IP. Для этого захватываем пакеты идущие на дополнительную пару MAC+IP:
          RouterOS command
          /interface bridge add action=redirect chain=dstnat dst-address=192.0.2.111/32 in-bridge=bridge-local mac-protocol=ip


          После этой команды появляется некое подобие связности. Локальная ARP-таблица компьютера содержит две записи — по одной для каждой пары MAC+IP. MAC-адреса в ней различаются, так как мы и хотели. Пинг до адреса 192.0.2.111 и ответы исправно прилетают.
          Но давайте посмотрим на принятые пакеты через wireshark:
          image

          Мы видим, что echo-ответы идут с MAC-адреса D4:CA:6D:C7:11:11, связанного с первым IP-адресом 192.0.2.1. И хотя связность есть, решение является незаконченным. Нам необходимо также подменять MAC-адреса в исходящих от роутера пакетах, имеющих src-ip 192.0.2.111. Сделаем это:

          RouterOS command
          /interface bridge nat add action=src-nat chain=srcnat mac-protocol=ip src-address=192.0.2.111/32 src-mac-address=D4:CA:6D:C7:11:11/FF:FF:FF:FF:FF:FF to-src-mac-address=D4:CA:6D:C7:22:22



          Вот, теперь пакеты в сети выглядят правильно — имеют правильное сочетание src-IP и src-MAC:
          image

          В окошке winbox настроенные правила преобразования выглядят так:
          image

          Аналогичным способом на интерфейс можно добавить сколько угодно дополнительных IP, каждый со своим MAC прописывая соответствующие правила трансляции адресов. Маскарад вам в помощь.

          image



          Update: добавил результаты теста с включенным и с выключенным Bridge L2-NAT.
          Для теста использовался RB951Ui-2HnD с процессором AR9344. Загрузка процессора изменяется незначительно, в пределах погрешности измерительных инструментов. В среднем рост составил 2% на 100M интерфейсе.

          L2-NAT выключен:
          image

          L2-NAT включён:

          image
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338538/


          Метки:  

          Автоматизация по сбору данных о росте таблиц и файлов всех баз данных

          Суббота, 23 Сентября 2017 г. 00:31 + в цитатник
          jobgemws сегодня в 00:31 Администрирование

          Автоматизация по сбору данных о росте таблиц и файлов всех баз данных

          • Tutorial

          Предисловие


          Часто возникает потребность контролировать рост всех таблиц и файлов всех баз данных.

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

          Решение


          1) Создадим представление о размерах всех таблиц для каждой БД (базы данных):
          Код
          USE [НАЗВАНИЕ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          
          CREATE view [inf].[vTableSize] as
          with pagesizeKB as (
          	SELECT low / 1024 as PageSizeKB
          	FROM master.dbo.spt_values
          	WHERE number = 1 AND type = 'E'
          )
          ,f_size as (
          	select p.[object_id], 
          		   sum([total_pages]) as TotalPageSize,
          		   sum([used_pages])  as UsedPageSize,
          		   sum([data_pages])  as DataPageSize
          	from sys.partitions p join sys.allocation_units a on p.partition_id = a.container_id
          	left join sys.internal_tables it on p.object_id = it.object_id
          	WHERE OBJECTPROPERTY(p.[object_id], N'IsUserTable') = 1
          	group by p.[object_id]
          )
          ,tbl as (
          	SELECT
          	  t.[schema_id],
          	  t.[object_id],
          	  i1.rowcnt as CountRows,
          	  (COALESCE(SUM(i1.reserved), 0) + COALESCE(SUM(i2.reserved), 0)) * (select top(1) PageSizeKB from pagesizeKB) as ReservedKB,
          	  (COALESCE(SUM(i1.dpages), 0) + COALESCE(SUM(i2.used), 0)) * (select top(1) PageSizeKB from pagesizeKB) as DataKB,
          	  ((COALESCE(SUM(i1.used), 0) + COALESCE(SUM(i2.used), 0))
          	    - (COALESCE(SUM(i1.dpages), 0) + COALESCE(SUM(i2.used), 0))) * (select top(1) PageSizeKB from pagesizeKB) as IndexSizeKB,
          	  ((COALESCE(SUM(i1.reserved), 0) + COALESCE(SUM(i2.reserved), 0))
          	    - (COALESCE(SUM(i1.used), 0) + COALESCE(SUM(i2.used), 0))) * (select top(1) PageSizeKB from pagesizeKB) as UnusedKB
          	FROM sys.tables as t
          	LEFT OUTER JOIN sysindexes as i1 ON i1.id = t.[object_id] AND i1.indid < 2
          	LEFT OUTER JOIN sysindexes as i2 ON i2.id = t.[object_id] AND i2.indid = 255
          	WHERE OBJECTPROPERTY(t.[object_id], N'IsUserTable') = 1
          	OR (OBJECTPROPERTY(t.[object_id], N'IsView') = 1 AND OBJECTPROPERTY(t.[object_id], N'IsIndexed') = 1)
          	GROUP BY t.[schema_id], t.[object_id], i1.rowcnt
          )
          SELECT
            @@Servername AS Server,
            DB_NAME() AS DBName,
            SCHEMA_NAME(t.[schema_id]) as SchemaName,
            OBJECT_NAME(t.[object_id]) as TableName,
            t.CountRows,
            t.ReservedKB,
            t.DataKB,
            t.IndexSizeKB,
            t.UnusedKB,
            f.TotalPageSize*(select top(1) PageSizeKB from pagesizeKB) as TotalPageSizeKB,
            f.UsedPageSize*(select top(1) PageSizeKB from pagesizeKB) as UsedPageSizeKB,
            f.DataPageSize*(select top(1) PageSizeKB from pagesizeKB) as DataPageSizeKB
          FROM f_size as f
          inner join tbl as t on t.[object_id]=f.[object_id]
          
          GO
          


          2) Создадим специальную БД и в ней определим таблицу для хранения информации по росту всех таблиц всех БД:
          Код
          USE [НАЗВАНИЕ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          SET ANSI_PADDING ON
          GO
          
          CREATE TABLE [srv].[TableStatistics](
          	[Row_GUID] [uniqueidentifier] NOT NULL CONSTRAINT [DF_TableStatistics_Row_GUID]  DEFAULT (newid()),
          	[ServerName] [nvarchar](255) NOT NULL,
          	[DBName] [nvarchar](255) NOT NULL,
          	[SchemaName] [nvarchar](255) NOT NULL,
          	[TableName] [nvarchar](255) NOT NULL,
          	[CountRows] [bigint] NOT NULL,
          	[DataKB] [int] NOT NULL,
          	[IndexSizeKB] [int] NOT NULL,
          	[UnusedKB] [int] NOT NULL,
          	[ReservedKB] [int] NOT NULL,
          	[InsertUTCDate] [datetime] NOT NULL CONSTRAINT [DF_TableStatistics_InsertUTCDate]  DEFAULT (getutcdate()),
          	[Date]  AS (CONVERT([date],[InsertUTCDate])) PERSISTED,
          	[CountRowsBack] [bigint] NULL,
          	[CountRowsNext] [bigint] NULL,
          	[DataKBBack] [int] NULL,
          	[DataKBNext] [int] NULL,
          	[IndexSizeKBBack] [int] NULL,
          	[IndexSizeKBNext] [int] NULL,
          	[UnusedKBBack] [int] NULL,
          	[UnusedKBNext] [int] NULL,
          	[ReservedKBBack] [int] NULL,
          	[ReservedKBNext] [int] NULL,
          	[AvgCountRows]  AS ((([CountRowsBack]+[CountRows])+[CountRowsNext])/(3)) PERSISTED,
          	[AvgDataKB]  AS ((([DataKBBack]+[DataKB])+[DataKBNext])/(3)) PERSISTED,
          	[AvgIndexSizeKB]  AS ((([IndexSizeKBBack]+[IndexSizeKB])+[IndexSizeKBNext])/(3)) PERSISTED,
          	[AvgUnusedKB]  AS ((([UnusedKBBack]+[UnusedKB])+[UnusedKBNext])/(3)) PERSISTED,
          	[AvgReservedKB]  AS ((([ReservedKBBack]+[ReservedKB])+[ReservedKBNext])/(3)) PERSISTED,
          	[DiffCountRows]  AS (([CountRowsNext]+[CountRowsBack])-(2)*[CountRows]) PERSISTED,
          	[DiffDataKB]  AS (([DataKBNext]+[DataKBBack])-(2)*[DataKB]) PERSISTED,
          	[DiffIndexSizeKB]  AS (([IndexSizeKBNext]+[IndexSizeKBBack])-(2)*[IndexSizeKB]) PERSISTED,
          	[DiffUnusedKB]  AS (([UnusedKBNext]+[UnusedKBBack])-(2)*[UnusedKB]) PERSISTED,
          	[DiffReservedKB]  AS (([ReservedKBNext]+[ReservedKBBack])-(2)*[ReservedKB]) PERSISTED,
          	[TotalPageSizeKB] [int] NULL,
          	[TotalPageSizeKBBack] [int] NULL,
          	[TotalPageSizeKBNext] [int] NULL,
          	[UsedPageSizeKB] [int] NULL,
          	[UsedPageSizeKBBack] [int] NULL,
          	[UsedPageSizeKBNext] [int] NULL,
          	[DataPageSizeKB] [int] NULL,
          	[DataPageSizeKBBack] [int] NULL,
          	[DataPageSizeKBNext] [int] NULL,
          	[AvgDataPageSizeKB]  AS ((([DataPageSizeKBBack]+[DataPageSizeKB])+[DataPageSizeKBNext])/(3)) PERSISTED,
          	[AvgUsedPageSizeKB]  AS ((([UsedPageSizeKBBack]+[UsedPageSizeKB])+[UsedPageSizeKBNext])/(3)) PERSISTED,
          	[AvgTotalPageSizeKB]  AS ((([TotalPageSizeKBBack]+[TotalPageSizeKB])+[TotalPageSizeKBNext])/(3)) PERSISTED,
          	[DiffDataPageSizeKB]  AS (([DataPageSizeKBNext]+[DataPageSizeKBBack])-(2)*[DataPageSizeKB]) PERSISTED,--показывает как изменяется само приращение
          	[DiffUsedPageSizeKB]  AS (([UsedPageSizeKBNext]+[UsedPageSizeKBBack])-(2)*[UsedPageSizeKB]) PERSISTED,--показывает как изменяется само приращение
          	[DiffTotalPageSizeKB]  AS (([TotalPageSizeKBNext]+[TotalPageSizeKBBack])-(2)*[TotalPageSizeKB]) PERSISTED,--показывает как изменяется само приращение
           CONSTRAINT [PK_TableStatistics] PRIMARY KEY CLUSTERED 
          (
          	[Row_GUID] ASC
          )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
          ) ON [PRIMARY]
          
          GO
          
          SET ANSI_PADDING ON
          GO
          


          За сам размер таблицы отвечает TotalPageSizeKB.
          Сумма TotalPageSizeKB всех таблиц БД+размер системных таблиц=размеру данных БД.
          3) Определим процедуру сбора информации:
          Код
          USE [НАЗВАНИЕ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          CREATE PROCEDURE [srv].[InsertTableStatistics]
          AS
          BEGIN
          	SET NOCOUNT ON;
          	SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
          
          	declare @dt date=CAST(GetUTCDate() as date);
              declare @dbs nvarchar(255);
          	declare @sql nvarchar(max);
          
          	select [name]
          	into #dbs
          	from sys.databases;
          
          	while(exists(select top(1) 1 from #dbs))
          	begin
          		select top(1)
          		@dbs=[name]
          		from #dbs;
          
          		set @sql=
          		N'INSERT INTO [srv].[TableStatistics]
          	         ([ServerName]
          			   ,[DBName]
          	         ,[SchemaName]
          	         ,[TableName]
          	         ,[CountRows]
          	         ,[DataKB]
          	         ,[IndexSizeKB]
          	         ,[UnusedKB]
          	         ,[ReservedKB]
          			 ,[TotalPageSizeKB]
          			 ,[UsedPageSizeKB]
          			 ,[DataPageSizeKB])
          	   SELECT [Server]
          		  ,[DBName]
          	         ,[SchemaName]
          	         ,[TableName]
          	         ,[CountRows]
          	         ,[DataKB]
          	         ,[IndexSizeKB]
          	         ,[UnusedKB]
          	         ,[ReservedKB]
          			 ,[TotalPageSizeKB]
          			 ,[UsedPageSizeKB]
          			 ,[DataPageSizeKB]
          		FROM ['+@dbs+'].[inf].[vTableSize];';
          
          		exec sp_executesql @sql;
          
          		delete from #dbs
          		where [name]=@dbs;
          	end
          
          	drop table #dbs;
          
          	declare @dt_back date=CAST(DateAdd(day,-1,@dt) as date);
          
          	;with tbl1 as (
          		select [Date], 
          			   [CountRows],
          			   [DataKB],
          			   [IndexSizeKB],
          			   [UnusedKB],
          			   [ReservedKB],
          			   [ServerName], 
          			   [DBName], 
          			   [SchemaName], 
          			   [TableName],
          			   [TotalPageSizeKB],
          			   [UsedPageSizeKB],
          			   [DataPageSizeKB]
          		from [srv].[TableStatistics]
          		where [Date]=@dt_back
          	)
          	, tbl2 as (
          		select [Date], 
          			   [CountRows], 
          			   [CountRowsBack],
          			   [DataKBBack],
          			   [IndexSizeKBBack],
          			   [UnusedKBBack],
          			   [ReservedKBBack],
          			   [ServerName], 
          			   [DBName], 
          			   [SchemaName], 
          			   [TableName],
          			   [TotalPageSizeKBBack],
          			   [UsedPageSizeKBBack],
          			   [DataPageSizeKBBack]
          		from [srv].[TableStatistics]
          		where [Date]=@dt
          	)
          	update t2
          	set t2.[CountRowsBack]		=t1.[CountRows],
          		t2.[DataKBBack]			=t1.[DataKB],
          		t2.[IndexSizeKBBack]	=t1.[IndexSizeKB],
          		t2.[UnusedKBBack]		=t1.[UnusedKB],
          		t2.[ReservedKBBack]		=t1.[ReservedKB],
          		t2.[TotalPageSizeKBBack]=t1.[TotalPageSizeKB],
          		t2.[UsedPageSizeKBBack]	=t1.[UsedPageSizeKB],
          		t2.[DataPageSizeKBBack]	=t1.[DataPageSizeKB]
          	from tbl1 as t1
          	inner join tbl2 as t2 on t1.[Date]=DateAdd(day,-1,t2.[Date])
          	and t1.[ServerName]=t2.[ServerName]
          	and t1.[DBName]=t2.[DBName]
          	and t1.[SchemaName]=t2.[SchemaName]
          	and t1.[TableName]=t2.[TableName];
          
          	;with tbl1 as (
          		select [Date], 
          			   [CountRows], 
          			   [CountRowsNext],
          			   [DataKBNext],
          			   [IndexSizeKBNext],
          			   [UnusedKBNext],
          			   [ReservedKBNext],
          			   [ServerName], 
          			   [DBName], 
          			   [SchemaName], 
          			   [TableName],
          			   [TotalPageSizeKBNext],
          			   [UsedPageSizeKBNext],
          			   [DataPageSizeKBNext]
          		from [srv].[TableStatistics]
          		where [Date]=@dt_back
          	)
          	, tbl2 as (
          		select [Date], 
          			   [CountRows],
          			   [DataKB],
          			   [IndexSizeKB],
          			   [UnusedKB],
          			   [ReservedKB],
          			   [ServerName], 
          			   [DBName], 
          			   [SchemaName], 
          			   [TableName],
          			   [TotalPageSizeKB],
          			   [UsedPageSizeKB],
          			   [DataPageSizeKB]
          		from [srv].[TableStatistics]
          		where [Date]=@dt
          	)
          	update t1
          	set t1.[CountRowsNext]		=t2.[CountRows],
          		t1.[DataKBNext]			=t2.[DataKB],
          		t1.[IndexSizeKBNext]	=t2.[IndexSizeKB],
          		t1.[UnusedKBNext]		=t2.[UnusedKB],
          		t1.[ReservedKBNext]		=t2.[ReservedKB],
          		t1.[TotalPageSizeKBNext]=t2.[TotalPageSizeKB],
          		t1.[UsedPageSizeKBNext]	=t2.[UsedPageSizeKB],
          		t1.[DataPageSizeKBNext]	=t2.[DataPageSizeKB]
          	from tbl1 as t1
          	inner join tbl2 as t2 on t1.[Date]=DateAdd(day,-1,t2.[Date])
          	and t1.[ServerName]=t2.[ServerName]
          	and t1.[DBName]=t2.[DBName]
          	and t1.[SchemaName]=t2.[SchemaName]
          	and t1.[TableName]=t2.[TableName];
          END
          GO
          


          Данное решение можно модифицировать с целью собирать со всех нужных экземпляров MS SQL Server данные по размерам таблиц всех БД.
          4) Определим представление по собранной информации:
          Код
          USE [НАЗВАНИЕ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          create view [srv].[vTableStatisticsShort] as 
          with d as (select DateAdd(day,-1,max([Date])) as [Date] from [srv].[TableStatistics])
          SELECT t.[ServerName]
                ,t.[DBName]
                ,t.[SchemaName]
                ,t.[TableName]
                ,t.[CountRows]
                ,t.[DataKB]
                ,t.[IndexSizeKB]
                ,t.[UnusedKB]
                ,t.[ReservedKB]
                ,t.[InsertUTCDate]
                ,t.[Date]
                ,t.[CountRowsBack]
                ,t.[CountRowsNext]
                ,t.[DataKBBack]
                ,t.[DataKBNext]
                ,t.[IndexSizeKBBack]
                ,t.[IndexSizeKBNext]
                ,t.[UnusedKBBack]
                ,t.[UnusedKBNext]
                ,t.[ReservedKBBack]
                ,t.[ReservedKBNext]
                ,t.[AvgCountRows]
                ,t.[AvgDataKB]
                ,t.[AvgIndexSizeKB]
                ,t.[AvgUnusedKB]
                ,t.[AvgReservedKB]
                ,t.[DiffCountRows]
                ,t.[DiffDataKB]
                ,t.[DiffIndexSizeKB]
                ,t.[DiffUnusedKB]
                ,t.[DiffReservedKB]
                ,t.[TotalPageSizeKB]
                ,t.[TotalPageSizeKBBack]
                ,t.[TotalPageSizeKBNext]
                ,t.[UsedPageSizeKB]
                ,t.[UsedPageSizeKBBack]
                ,t.[UsedPageSizeKBNext]
                ,t.[DataPageSizeKB]
                ,t.[DataPageSizeKBBack]
                ,t.[DataPageSizeKBNext]
                ,t.[AvgDataPageSizeKB]
                ,t.[AvgUsedPageSizeKB]
                ,t.[AvgTotalPageSizeKB]
                ,t.[DiffDataPageSizeKB]
                ,t.[DiffUsedPageSizeKB]
                ,t.[DiffTotalPageSizeKB]
            FROM d
            inner join [SRV].[srv].[TableStatistics] as t on d.[Date]=t.[Date]
            where t.[CountRowsBack] is not null
          	and	t.[CountRowsNext] is not null
          GO
          


          Здесь стоит обратить внимание на Diff. Если он больше 0, то это означает, что таблица с каждым днем все быстрее растет.
          Предполагается, что сбор будет производиться 1 раз в 24 часа.
          Аналогичным образом можно автоматизировать и сбор роста файлов всех БД, используя следующее представление:
          Код
          USE [НАЗВАНИЕ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          select	t2.[DB_Name] as [DBName]
          			,t1.FileId 
          			,t1.NumberReads
          			,t1.BytesRead
          			,t1.IoStallReadMS
          			,t1.NumberWrites
          			,t1.BytesWritten
          			,t1.IoStallWriteMS 
          			,t1.IoStallMS
          			,t1.BytesOnDisk
          			,t1.[TimeStamp]
          			,t1.FileHandle
          			,t2.[Type_desc]
          			,t2.[FileName]
          			,t2.[Drive]
          			,t2.[Physical_Name]
          			,t2.[Ext]
          			,t2.[CountPage]
          			,t2.[SizeMb]
          			,t2.[SizeGb]
          			,t2.[Growth]
          			,t2.[GrowthMb]
          			,t2.[GrowthGb]
          			,t2.[GrowthPercent]
          			,t2.[is_percent_growth]
          			,t2.[database_id]
          			,t2.[State]
          			,t2.[StateDesc]
          			,t2.[IsMediaReadOnly]
          			,t2.[IsReadOnly]
          			,t2.[IsSpace]
          			,t2.[IsNameReserved]
          			,t2.[CreateLsn]
          			,t2.[DropLsn]
          			,t2.[ReadOnlyLsn]
          			,t2.[ReadWriteLsn]
          			,t2.[DifferentialBaseLsn]
          			,t2.[DifferentialBaseGuid]
          			,t2.[DifferentialBaseTime]
          			,t2.[RedoStartLsn]
          			,t2.[RedoStartForkGuid]
          			,t2.[RedoTargetLsn]
          			,t2.[RedoTargetForkGuid]
          			,t2.[BackupLsn]
          from fn_virtualfilestats(NULL, NULL) as t1
          inner join [inf].[ServerDBFileInfo] as t2 on t1.[DbId]=t2.[database_id] and t1.[FileId]=t2.[File_Id]
          GO
          



          Результат


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

          Источники:


          » MSDN
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338536/


          Метки:  

          Использование Zabbix для слежения за базой данных

          Пятница, 22 Сентября 2017 г. 23:57 + в цитатник
          jobgemws вчера в 23:57 Администрирование

          Использование Zabbix для слежения за базой данных

          • Tutorial

          Предисловие


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

          В данной статье будет описано, что необходимо настроить в Zabbix для слежения за базой данных MS SQL Server.

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

          Решение


          Вначале опишу все те счетчики производительности (через элементы данных в Zabbix), которые нам нужны:
          1. Logical Disk
            1. Avg Disc sec/Read
              Показывает выраженное в секундах среднее время чтения данных с диска. Среднее значение счетчика производительности Avg. Disk sec/Read не должно превышать 10 миллисекунд. Максимальное значение счетчика производительности Avg. Disk sec/Read не должно превышать 50 миллисекунд.
              Zabbix: perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Read], а также важно проследить за нужным диском, например так: perf_counter[\LogicalDisk(C:)\Avg. Disk sec/Read]
              Примеры триггеров:
              {НАЗВАНИЕ_УЗЛА:perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Read].last()}>0.005, уровень-высокий
              и
              {НАЗВАНИЕ_УЗЛА:perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Read].last()}>0.0025, уровень-средний
            2. Avg Disc sec/Write
              Показывает выраженное в секундах среднее время записи данных на диск. Среднее значение счетчика производительности Avg. Disk sec/Write не должно превышать 10 миллисекунд. Максимальное значение счетчика производительности Avg. Disk sec/Write не должно превышать 50 миллисекунд.
              Zabbix: perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Write], а также важно проследить за нужным диском, например так: perf_counter[\LogicalDisk(C:)\Avg. Disk sec/Write]
              Примеры триггеров:
              {НАЗВАНИЕ_УЗЛА:perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Write].last()}>0.005, уровень-высокий
              и
              {НАЗВАНИЕ_УЗЛА:perf_counter[\LogicalDisk(_Total)\Avg. Disk sec/Write].last()}>0.0025, уровень-средний
            3. Avg Disk Queue Length
              Cредняя длина очереди запросов к диску. Отображает количество запросов к диску, ожидающих обработки в течении определенного интервала времени. Нормальным считается очередь не больше 2 для одиночного диска. Если в очереди больше двух запросов, то возможно диск перегружен и не успевает обрабатывать поступающие запросы. Уточнить, с какими именно операциями не справляется диск, можно с помощью счетчиков Avg. Disk Read Queue Length (очередь запросов на чтение) и Avg. Disk Wright Queue Length (очередь запросов на запись).
              Значение Avg. Disk Queue Length не измеряется, а рассчитывается по закону Литтла из математической теории очередей. Согласно этому закону, количество запросов, ожидающих обработки, в среднем равняется частоте поступления запросов, умноженной на время обработки запроса. Т.е. в нашем случае Avg. Disk Queue Length = (Disk Transfers/sec) * (Avg. Disk sec/Transfer).
              Avg. Disk Queue Length приводится как один из основных счетчиков для определения загруженности дисковой подсистемы, однако для его адекватной оценки необходимо точно представлять физическую структуру системы хранения. К примеру, для одиночного жесткого диска критическим считается значение больше 2, а если диск располагается на RAID-массиве из 4-х дисков, то волноваться стоит при значении больше 4*2=8.
              Zabbix: perf_counter[\LogicalDisk(_Total)\Avg. Disk Queue Length], а также важно проследить за нужным диском, например так: perf_counter[\LogicalDisk(C:)\Avg. Disk Queue Length]

          2. Memory
            1. Pages/sec
              Показывает число страниц, которые SQL Server считал с диска или записал на диск для того, чтобы разрешить обращения к страницам памяти, которые не были загружены в оперативную память в момент обращения. Эта величина является суммой величин Pages Input/sec и Pages Output/sec, а также учитывает страничный обмен (подкачку/свопинг) системной кэш-памяти для доступа к файлам данных приложений. Кроме того, сюда включается подкачка не кэшированных файлов, непосредственно отображаемых в память. Это основной счетчик, за которым следует следить в том случае, если наблюдается большая нагрузка на использование памяти и связанный с этим избыточный страничный обмен. Этот счётчик характеризует величину свопинга и его нормальное (не пиковое) значение должно быть близко к нолю. Увеличение свопинга говорит о необходимости наращивания ОЗУ или уменьшения числа исполняемых на сервере прикладных программ.
              Zabbix: perf_counter[\Memory\Pages/sec]
              Пример триггера:
              {НАЗВАНИЕ_УЗЛА:perf_counter[\Memory\Pages/sec].min(5m)}>1000, уровень-информация
            2. Page Faults/sec
              Это значение счетчика ошибок страницы. Ошибка страницы возникает, когда процесс ссылается на страницу виртуальной памяти, которая не находится в рабочем множестве оперативной памяти. Данный счетчик учитывает как те ошибки страницы, которые требуют обращения к диску, так и те, которые вызваны нахождением страницы вне рабочего множества в оперативной памяти. Большинство процессоров могут обрабатывать ошибки страницы второго типа без особых задержек. Однако, обработка ошибок страницы первого типа, требующая доступа к диску, может привести к значительным задержкам.
              Zabbix: perf_counter[\Memory\Page Faults/sec]
              Пример триггера:
              {НАЗВАНИЕ_УЗЛА:perf_counter[\Memory\Page Faults/sec].min(5m)}>1000, уровень-информация
            3. Available Bytes
              Отслеживает количество доступной памяти в байтах для выполнения различных процессов. Низкие показатели означают нехватку памяти. Решение — увеличить память. Этот счётчик в большинстве случаев должен быть постоянно выше 5000 КВ.
              Есть смысл выставлять порог для Available Mbytes вручную из соображений:
              •50% свободной памяти доступно = Отлично
              •25% доступно памяти = Требует внимания
              •10% свободно = Возможны проблемы
              •Меньше 5% доступно памяти= Критично для скорости, нужно вмешиваться.
              Zabbix: perf_counter[\Memory\Available Bytes]

          3. Processor (Total): % Processor Time
            Этот счетчик показывает процентное отношение времени, которое процессор был занят выполнением операций для не простаивающих потоков (non-Idle thread). Эту величину можно рассматривать как долю времени, приходящегося на выполнение полезной работы. Каждый процессор может быть назначен простаивающему потоку, который потребляет непродуктивные циклы процессора, не используемые другими потоками. Для этого счётчика характерны непродолжительные пики, которые могут достигать 100 процентов. Однако, если наблюдаются продолжительные периоды, когда утилизация процессора выше 80 процентов, то система будет более эффективной при использовании большего числа процессоров.
            Zabbix: perf_counter[\Processor(_Total)\% Processor Time], здесь же может иметь место по ядрам выводить
            Пример триггера:
            {НАЗВАНИЕ_УЗЛА:perf_counter[\Processor(_Total)\% Processor Time].min(5m)}>80, уровень-информация
          4. Network Interface (*): % Bytes Total/sec
            Общее количество переданных и полученных байт за секунду по всем интерфейсам. Это пропускная способность интерфейса (в байтах). Необходимо сравнить значение этого счётчика с максимальной пропускной способностью сетевой платы. Вообще, этот счётчик должен показать не более 50% утилизации пропускной способности сетевого адаптера.
            Zabbix: perf_counter[\Network Interface(*)\Bytes Sent/sec]
          5. MS SQL Server: Access Methods
            Объект Access Methods (Методы доступа) в SQL Server предоставляет счетчики, помогающие следить за доступом к логическим данным в рамках базы данных. Физический доступ к страницам базы данных на диске контролируется при помощи счетчиков диспетчера буферов. Наблюдение за методами доступа к данным в базе данных помогает определить, можно ли увеличить производительность запросов путем добавления или изменения индексов, добавления или перемещения секций, добавления файлов или групп файлов, дефрагментации индексов или изменения текста запросов. Кроме того, при помощи счетчиков объекта Access Methods можно следить за размером данных, индексов и свободного пространства в базе данных, контролируя объем и фрагментацию для каждого экземпляра сервера. Чрезмерная фрагментация индексов может значительно снизить производительность.
            1. Page Splits/sec
              Количество разбиений страниц в секунду, выполненных в результате переполнения страниц индекса. Большое значение этого показателя означает, что при выполнении операций вставки и изменения данных SQL Server приходится выполнять большое количество ресурсоемких операций по разбиению страниц и переносу части существующей страницы на новое место. Таких операций по возможности следует избегать. Проблему можно попытаться решить двумя способами:
              — создать кластерный индекс для столбцов с автоприращением. В этом случае новые записи не будут помещаться внутрь страниц, уже занятых данными, а будут последовательно занимать новые страницы;
              — перестроить индексы, увеличив значение параметра Fillfactor. Этот параметр позволяет зарезервировать в страницах индексов свободное место, которое будет использоваться для размещения новых данных, без необходимости производить операции разбиения страниц.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Access Methods\Page Splits/sec",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Access Methods\Page Splits/sec",30].last()}>{НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:SQL Statistics\Batch Requests/sec",30].last()}/5, уровень-информация
            2. Full Scans/sec
              Количество неограниченных операций полного сканирования в секунду. К таким операциям относятся сканирование основной таблицы и полное сканирование индекса. Стабильное повышение этого показателя может свидетельствовать о деградации системы (нехватка нужных индексов, их сильная фрагментация, неиспользование оптимизатором существующих индексов, наличие неиспользуемых индексов). Однако, стоит отметить, что полное сканирование в небольших таблицах невсегда плохо, т к если удается всю таблицу разместить в ОЗУ, то как раз быстрее будет произвести полное сканирование. Но в большинстве случаев стабильный рост показателя этого счетчика будет говорить о деградации системы. Все это применимо только для OLTP-систем. В OLAP-системах постоянные полные сканирования-это нормально.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Access Methods\Full Scans/sec",30]

          6. MS SQL Server: Buffer Manager
            Объект Buffer Manager (диспетчера буферов) предоставляет счетчики, позволяющие наблюдать за тем, как SQL Server использует следующие ресурсы:
            — память для хранения страниц данных;
            — счетчики, служащие для мониторинга физического ввода-вывода, когда SQL Server считывает и записывает страницы баз данных;
            — расширение буферного пула для расширения буферного кэша с использованием быстрой энергонезависимой памяти, например твердотельных накопителей (SSD);
            — мониторинг памяти и счетчиков, используемых SQL Server, помогает получить следующие сведения;
            — существуют ли «узкие места», вызванные недостатком физической памяти. Если часто используемые данные не могут быть сохранены в кэше, SQL Server вынужден считывать их с диска;
            — можно ли повысить эффективность выполнения запросов, увеличив объем памяти или выделив дополнительную память для кэширования данных или хранения внутренних структур SQL Server;
            — насколько часто SQL Server считывает данные с диска. В сравнении с другими операциями, такими как доступ к памяти, физический ввод-вывод выполняется дольше. Уменьшение объема ввода-вывода может повысить производительность выполнения запросов.
            1. Buffer Cache hit radio
              Показывает, насколько полно SQL Server может разместить данные в буфере кэша. Чем выше это значение, тем лучше, т.к. для эффективного обращения SQL сервера к страницам данных, они должны находиться в буфере кэша, и операции физического ввода-вывода (I/O) должны отсутствовать. Если наблюдается устойчивое снижение среднего значения этого счётчика, необходимо рассмотреть возможность добавления ОЗУ. Данный показатель всегда должен быть выше 90% для OLTP-систем и выше 50% для OLAP-систем.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Buffer Manager\Buffer cache hit ratio",30]
              Примеры триггеров: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Buffer Manager\Buffer cache hit ratio",30].last()}<70, уровень-высокий
              и
              {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Buffer Manager\Buffer cache hit ratio",30].last()}<80, уровень-средний
            2. Page life expectancy
              Показывает, как долго страница будет постоянно находиться в памяти в нынешнем состоянии. Если значение постоянно падает, то это означает, что система злоупотребляет буферным пулом. Таким образом, потенциально работа памяти может вызывать проблемы, приводящие к снижению производительности. Стоит отметить, что не существует универсального показателя, ниже которого можно однозначно судить о том, что система злоупотребляет буферным пулом (показатель в 300 секунд устарел с MS SQL Server 2012).
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Buffer Manager\Page life expectancy",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Buffer Manager\Page life expectancy",30].last()}<5, уровень-информация

          7. MS SQL Server: General Statistics
            Объект General Statistics (Общая статистика) в SQL Server предоставляет счетчики, позволяющие наблюдать общую активность сервера, например количество одновременных соединений и количество пользователей в секунду, подключающихся или отключающихся от компьютера, где запущен экземпляр SQL Server. Эти показатели полезно использовать в больших системах оперативной обработки транзакций (OLTP), где большое количество клиентов постоянно подключаются и отключаются от экземпляра SQL Server.
            1. Process blocked
              Количество блокированных в данный момент процессов.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:General Statistics\Processes blocked",30]
              Пример триггера: ({НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:General Statistics\Processes blocked",30].min(2m,0)}>=0)
              and ({НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:General Statistics\Processes blocked",30].time(0)}>=50000)
              and ({НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:General Statistics\Processes blocked",30].time(0)}<=230000), уровень-информация (здесь идет ограничение по сигнализации с 05:00 до 23:00)
            2. User Connections
              Количество пользователей, подключенных в данный момент к серверу SQL Server.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:General Statistics\User Connections",30]

          8. MS SQL Server: Locks
            Объект Locks (Блокировки) в Microsoft SQL Server предоставляет сведения о блокировках SQL Server, полученных для отдельных типов ресурсов. Блокировки выдаются на такие ресурсы SQL Server, как прочитанные или измененные транзакцией строки, для предотвращения одновременного использования ресурсов несколькими транзакциями. Например, если исключительная (X) блокировка получена транзакцией на строку в таблице, никакая другая транзакция не сможет изменить эту строку, пока блокировка не будет освобождена. Минимизация использования блокировок повышает параллелизм, что может улучшить общую производительность. Одновременно может отслеживаться несколько экземпляров объекта Locks, каждый из которых будет представлять собой блокировку отдельного вида ресурсов.
            1. Average Wait Time (ms)
              Средняя длительность ожидания (в миллисекундах) для всех запросов блокировки, при которых потребовалось ожидание. Этот счетчик показывает, сколько в среднем процессам пользователей приходится проводить в очереди, чтобы наложить на ресурс блокировку. Максимально допустимое значение этого счетчика полностью зависит от вашей задачи, какое-то среднее значение для всех приложений здесь определить сложно. Слишком высокое значение этого счетчика может означать проблемы с блокировками в вашей базе данных.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Average Wait Time (ms)",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Average Wait Time (ms)",30].last()}>=500, уровень-информация
            2. Lock Wait Time (ms)
              Суммарное время ожидания блокировок (в миллисекундах) за последнюю секунду.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Lock Wait Time (ms)",30]
            3. Lock Waits/sec
              Количество случаев за последнюю секунду, когда потоку приходилось ожидать в связи с запросом блокировки.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Lock Wait Time (ms)",30]
            4. Lock Timeouts/sec
              Количество повторений, когда не удается получить блокировку путем циклического обращения. Значение параметра конфигурирования SQL Server spin counter определяет количество «оборотов» потока (spins), прежде чем истечет время тайм-аута и поток перейдет в неактивное состояние.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Lock Timeouts/sec",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Lock Timeouts/sec",30].last()}>1000, уровень-информация
            5. Lock Requests/sec
              Количество запросов в секунду указанного типа блокировки.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Lock Requests/sec",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Lock Requests/sec",30].last()}>500000, уровень-информация
            6. Lock Number of Deadlocks/sec
              Количество запросов блокировки в секунду, приводящих к взаимоблокировке. Наличие взаимоблокировок свидетельствует о неправильно построенных запросах, которые блокируют совместные ресурсы.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Number of Deadlocks/sec",30]
              Пример триггера: {НАЗВАНИЕ_УЗЛА:perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Locks(_Total)\Number of Deadlocks/sec",30].last()}>1, уровень-высокий

          9. MS SQL Server: Memory Manager
            Объект Memory Manager (Диспетчер памяти) в Microsoft SQL Server обеспечивает счетчики для контроля использования памяти всего сервера. Контроль над использованием памяти всего сервера для оценки действий пользователя и использования ресурсов может помочь идентифицировать нехватку производительности. Контроль над памятью, используемый экземпляром SQL Server, может помочь определить:
            — существуют ли нехватки в недостаточной физической памяти для хранения в кэше часто используемых данных. Если памяти недостаточно, SQL Server должен получить данные с диска;
            — может ли производительность запроса улучшиться, если будет добавлена память или увеличится объем доступной памяти для кэширования данных или внутренних структур SQL Server.
            1. Memory Grants Outstending
              Указывает общее число процессов, успешно получивших память рабочей области. При стабильном падении показателя, необходимо увеличить ОЗУ.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Memory Manager\Memory Grants Outstanding",30]
            2. Memory Grants Pending
              Указывает общее число процессов, ожидающих предоставления памяти рабочей памяти. При стабильном росте показателя, необходимо увеличить ОЗУ.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:Memory Manager\Memory Grants Pending",30]

          10. MS SQL Server: Statistics
            Объект Statistics (Статистика) в Microsoft SQL Server обеспечивает работу счетчиков для наблюдения компиляции и типов запросов, отправляемых экземпляру SQL Server. Наблюдение за числом компиляций и повторных компиляций запросов и числа пакетов, полученных экземпляром SQL Server, дает представление о том, как быстро SQL Server выполняет запросы пользователей и насколько эффективно их обрабатывает оптимизатор запросов.
            1. Butch Requests/sec
              Число пакетов команд Transact-SQL, полученных за секунду. На эту статистику влияют любые ограничения (ввод-вывод, число пользователей, размер кэша, сложность запросов и т. д.). Высокое число запросов пакетов свидетельствует о высокой пропускной способности.
              Zabbix: perf_counter["\MSSQL$НАЗВАНИЕ_ЭКЗЕМПЛЯРА:SQL Statistics\Batch Requests/sec",30]


          Помимо всего выше перечисленного также можно настроить и другие элементы данных (а также и создать триггеры по ним с последующим оповещением).Например:
          1) размер свободного места на диске
          2) размеры БД-файлов данных и журнала лога
          и т. д.
          Однако, все эти показатели не показывают проблему именно запросов в реальном времени.
          Для этого необходимо создавать свои специальные счетчики.
          Из-за соображений конфиденциальности, не буду приводить примеры таких счетчиков. Тем более, что они настраиваются уникально для каждой системы. Но отмечу, что для таких систем как 1С, NAV и CRM специализированные счетчики создать можно совместно с соответствующими разработчиками.
          Приведу пример создания обобщенного показателя, который показывает сколько запросов выполняется и сколько запросов ожидают выполнения (приостановлены или заблокированы) на каждый момент времени.
          Для этого необходимо создать хранимую процедуру:
          Код
          USE [ИМЯ_БАЗЫ_ДАННЫХ]
          GO
          
          SET ANSI_NULLS ON
          GO
          
          SET QUOTED_IDENTIFIER ON
          GO
          
          CREATE PROCEDURE [nav].[ZabbixGetCountRequestStatus]
          	@Status nvarchar(255)
          AS
          BEGIN
          	/*
          		возвращает кол-во запросов с заданным статусом
          	*/
          	SET NOCOUNT ON;
          
          	select count(*) as [Count]
          	from sys.dm_exec_requests ER with(readuncommitted)
          	where [status]=@Status
          END
          


          Далее необходимо зайти в папку, где находится Zabbix (zabbix\conf\userparams.d) и создать 2 файла с расширением ps1 (PowerShell) и написать в каждом из них следующие коды:
          Код для выполняющихся запросов
          $SQLServer = "НАЗВАНИЕ_ЭКЗЕМПЛЯРА";
          $uid = "ЛОГИН"; 
          $pwd = "ПАРОЛЬ";
          $Status="running";
          
          $connectionString = "Server = $SQLServer; Database=НАЗВАНИЕ_БД; Integrated Security = False; User ID = $uid; Password = $pwd;";
          
          $connection = New-Object System.Data.SqlClient.SqlConnection;
          $connection.ConnectionString = $connectionString;
          
          #Создаем запрос непосредственно к MSSQL / Create a request directly to MSSQL
          $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
          $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure;  
          $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus";
          $SqlCmd.Connection = $Connection;
          
          $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar);
          $paramStatus.Value = $Status;
          
          $connection.Open();
          $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
          $SqlAdapter.SelectCommand = $SqlCmd;
          $DataSet = New-Object System.Data.DataSet;
          $SqlAdapter.Fill($DataSet) > $null;
          $connection.Close();
          
          $result = $DataSet.Tables[0].Rows[0]["Count"];
          
          write-host $result;
          


          Код для ожидающих запросов
          $SQLServer = "НАЗВАНИЕ_ЭКЗЕМПЛЯРА";
          $uid = "ЛОГИН"; 
          $pwd = "ПАРОЛЬ";
          $Status="suspended";
          
          $connectionString = "Server = $SQLServer; Database=НАЗВАНИЕ_БД; Integrated Security = False; User ID = $uid; Password = $pwd;";
          
          $connection = New-Object System.Data.SqlClient.SqlConnection;
          $connection.ConnectionString = $connectionString;
          
          #Создаем запрос непосредственно к MSSQL / Create a request directly to MSSQL
          $SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
          $SqlCmd.CommandType = [System.Data.CommandType]::StoredProcedure;  
          $SqlCmd.CommandText = "nav.ZabbixGetCountRequestStatus";
          $SqlCmd.Connection = $Connection;
          
          $paramStatus=$SqlCmd.Parameters.Add("@Status" , [System.Data.SqlDbType]::VarChar);
          $paramStatus.Value = $Status;
          
          $connection.Open();
          $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
          $SqlAdapter.SelectCommand = $SqlCmd;
          $DataSet = New-Object System.Data.DataSet;
          $SqlAdapter.Fill($DataSet) > $null;
          $connection.Close();
          
          $result = $DataSet.Tables[0].Rows[0]["Count"];
          
          write-host $result;
          


          Теперь необходимо создать файл с пользовательскими параметрами и расширением .conf (или добавить строчки в существующий такой пользовательский файл, если он был создан ранее) и вставить следующие строки:
          UserParameter=НАЗВАНИЕ_ПАРАМЕТРА_КОЛИЧЕСТВО_ВЫПОЛНЯЕМЫХ_ЗАПРОСОВ,powershell -NoProfile -ExecutionPolicy Bypass -File ПОЛНЫЙ_ПУТЬ\zabbix\conf\userparams.d\НАЗВАНИЕ_ФАЙЛА_ДЛЯ_ВЫПОЛНЯЕМЫХ_ЗАПРОСОВ.ps1
          UserParameter=НАЗВАНИЕ_ПАРАМЕТРА_КОЛИЧЕСТВО_ОЖИДАЮЩИХ_ЗАПРОСОВ,powershell -NoProfile -ExecutionPolicy Bypass -File ПОЛНЫЙ_ПУТЬ\zabbix\conf\userparams.d\НАЗВАНИЕ_ФАЙЛА_ДЛЯ_ОЖИДАЮЩИХ_ЗАПРОСОВ.ps1
          После этого сохраняем файл .conf и перезапускаем агент Zabbix.
          После этого добавляем в Zabbix новых два элемента (в данном случае названия и ключ совпадают):
          НАЗВАНИЕ_ПАРАМЕТРА_КОЛИЧЕСТВО_ВЫПОЛНЯЕМЫХ_ЗАПРОСОВ
          НАЗВАНИЕ_ПАРАМЕТРА_КОЛИЧЕСТВО_ОЖИДАЮЩИХ_ЗАПРОСОВ
          Теперь можно создавать графики и триггеры на созданные пользовательские элементы данных.

          Если кол-во ожидающих запросов резко возрастает, то следующим запросом можно вывести все выполняющиеся и ожидающие запросы в данный момент времени с детализацией от куда и под каким логином выполняется запрос, текст и план запроса, а также прочие детали:
          Код
          select ER.[session_id]
                ,ER.[request_id]
                ,ER.[start_time]
                ,ER.[status]
                ,ER.[command]
                ,ER.[sql_handle]
                ,ER.[statement_start_offset]
                ,ER.[statement_end_offset]
                ,ER.[plan_handle]
                ,coalesce(ER.[database_id], ES.[database_id]) as [database_id]
          	  ,DB_Name(coalesce(ER.[database_id], ES.[database_id])) as [DBName]
                ,(select top(1) text from sys.dm_exec_sql_text(ER.[sql_handle])) as [TSQL]
          	  ,(select top(1) [query_plan] from sys.dm_exec_query_plan(ER.[plan_handle])) as [QueryPlan]
                ,ER.[user_id]
                ,ER.[connection_id]
                ,ER.[blocking_session_id]
                ,ER.[wait_type]
                ,ER.[wait_time]
                ,ER.[last_wait_type]
                ,ER.[wait_resource]
                ,ER.[open_transaction_count]
                ,ER.[open_resultset_count]
                ,ER.[transaction_id]
                ,ER.[context_info]
                ,ER.[percent_complete]
                ,ER.[estimated_completion_time]
                ,ER.[cpu_time]
                ,ER.[total_elapsed_time]
                ,ER.[scheduler_id]
                ,ER.[task_address]
                ,ER.[reads]
                ,ER.[writes]
                ,ER.[logical_reads]
                ,ER.[text_size]
                ,ER.[language]
                ,ER.[date_format]
                ,ER.[date_first]
                ,ER.[quoted_identifier]
                ,ER.[arithabort]
                ,ER.[ansi_null_dflt_on]
                ,ER.[ansi_defaults]
                ,ER.[ansi_warnings]
                ,ER.[ansi_padding]
                ,ER.[ansi_nulls]
                ,ER.[concat_null_yields_null]
                ,ER.[transaction_isolation_level]
                ,ER.[lock_timeout]
                ,ER.[deadlock_priority]
                ,ER.[row_count]
                ,ER.[prev_error]
                ,ER.[nest_level]
                ,ER.[granted_query_memory]
                ,ER.[executing_managed_code]
                ,ER.[group_id]
                ,ER.[query_hash]
                ,ER.[query_plan_hash]
          	  ,EC.[most_recent_session_id]
                ,EC.[connect_time]
                ,EC.[net_transport]
                ,EC.[protocol_type]
                ,EC.[protocol_version]
                ,EC.[endpoint_id]
                ,EC.[encrypt_option]
                ,EC.[auth_scheme]
                ,EC.[node_affinity]
                ,EC.[num_reads]
                ,EC.[num_writes]
                ,EC.[last_read]
                ,EC.[last_write]
                ,EC.[net_packet_size]
                ,EC.[client_net_address]
                ,EC.[client_tcp_port]
                ,EC.[local_net_address]
                ,EC.[local_tcp_port]
                ,EC.[parent_connection_id]
                ,EC.[most_recent_sql_handle]
          	  ,ES.[login_time]
          	  ,ES.[host_name]
          	  ,ES.[program_name]
          	  ,ES.[host_process_id]
          	  ,ES.[client_version]
          	  ,ES.[client_interface_name]
          	  ,ES.[security_id]
          	  ,ES.[login_name]
          	  ,ES.[nt_domain]
          	  ,ES.[nt_user_name]
          	  ,ES.[memory_usage]
          	  ,ES.[total_scheduled_time]
          	  ,ES.[last_request_start_time]
          	  ,ES.[last_request_end_time]
          	  ,ES.[is_user_process]
          	  ,ES.[original_security_id]
          	  ,ES.[original_login_name]
          	  ,ES.[last_successful_logon]
          	  ,ES.[last_unsuccessful_logon]
          	  ,ES.[unsuccessful_logons]
          	  ,ES.[authenticating_database_id]
          from sys.dm_exec_requests ER with(readuncommitted)
          left join sys.dm_exec_sessions ES with(readuncommitted)
          on ES.session_id = ER.session_id 
          left join sys.dm_exec_connections EC  with(readuncommitted)
          on EC.session_id = ER.session_id
          where ER.status in ('suspended', 'running')
          


          Также напомню, что по собранным статистикам можно получить самые тяжелые запросы:
          Код
          /*
          creation_time - Время, когда запрос был скомпилирован. Поскольку при старте сервера кэш пустой, данное время всегда больше либо равно моменту запуска сервиса. Если время, указанное в этом столбце позже, чем предполагаемое (первое использование процедуры), это говорит о том, что запрос по тем или иным причинам был рекомпилирован.
          last_execution_time - Момент фактического последнего выполнения запроса.
          execution_count - Сколько раз запрос был выполнен с момента компиляции
          Количество выполнений позволяет найти ошибки в алгоритмах - часто в наиболее выполняемых запросах оказываются те, которые находятся внутри каких-либо циклов однако могут быть выполнены перед самим циклом один раз. Например, получение каких-либо параметров из базы данных, не меняющихся внутри цикла.
          CPU - Суммарное время использования процессора в миллисекундах. Если запрос обрабатывается параллельно, то это время может превысить общее время выполнения запроса, поскольку суммируется время использования запроса каждым ядром. Во время использования процессора включается только фактическая нагрузка на ядра, в нее не входят ожидания каких-либо ресурсов.
          Очевидно, что данный показатель позволяет выявлять запросы, наиболее сильно загружающие процессор.
          AvgCPUTime - Средняя загрузка процессора на один запрос. 
          TotDuration - Общее время выполнения запроса, в миллисекундах.
          Данный параметр может быть использован для поиска тех запросов, которые, независимо от причины выполняются "наиболее долго". Если общее время выполнения запроса существенно ниже времени CPU (с поправкой на параллелизм) - это говорит о том, что при выполнения запроса были ожидания каких-либо ресурсов. В большинстве случаев это связано с дисковой активностью или блокировками, но также это может быть сетевой интерфейс или другой ресурс. 
          Полный список типов ожиданий можно посмотреть в описании представления sys.dm_os_wait_stats.
          AvgDur - Среднее время выполнения запроса в миллисекундах.
          Reads - Общее количество чтений.
          Это пожалуй лучший агрегатный показатель, позволяющий выявить наиболее нагружающие сервер запросы.
          Логическое чтение - это разовое обращение к странице данных, физические чтения не учитываются.
          В рамках выполнения одного запроса, могут происходить неоднократные обращения к одной и той же странице.
          Чем больше обращений к страницам, тем больше требуется дисковых чтений, памяти и, если речь идет о повторных обращениях, большее время требуется удерживать страницы в памяти.
          Writes - Общее количество изменений страниц данных.
          Характеризует то, как запрос "нагружает" дисковую систему операциями записи.
          Следует помнить, что этот показатель может быть больше 0 не только у тех запросов, которые явно меняют данные, но также и у тех, которые сохраняют промежуточные данные в tempdb.
          AggIO - Общее количество логических операций ввода-вывода (суммарно)
          Как правило, количество логических чтений на порядки превышает количество операций записи, поэтому этот показатель сам по себе для анализа применим в редких случаях.
          AvgIO - Среднее количество логических дисковых операций на одно выполнение запроса.
          Значение данного показателя можно анализировать из следующих соображений:
          Одна страница данных - это 8192 байта. Можно получить среднее количество байт данных, "обрабатываемых" данным запросом. Если этот объем превышает реальное количество данных, которые обрабатывает запрос (суммарный объем данных в используемых в запросе таблицах), это говорит о том, что был выбран заведомо плохой план выполнения и требуется заняться оптимизацией данного запроса.
          Я встречал случай, когда один запрос делал количество обращений, эквивалентных объему в 5Тб, при этом общий объем данных в это БД был 300Гб, а объем данных в таблицах, задействованных в запросе не превышал 10Гб.
          В общем можно описать одну причину такого поведения сервера - вместо использования индекса сервер предпочитает сканировать таблицу или наоборот.
          Если объем логических чтений в разы превосходит общие объем данных, то это вызвано повторным обращениям к одним и тем же страницам данных. Помимо того, что в одном запросе таблица может быть использована несколько раз, к одним и тем же страницам сервер обращается например в случаях, когда используется индекс и по результатам поиска по нему, найденные некоторые строки данных лежат на одной и той же странице. Конечно, в таком случае предпочтительным могло бы быть сканирование таблицы - в этом случае сервер обращался бы к каждой странице данных только один раз. Однако этому часто мешают... попытки оптимизации запросов, когда разработчик явно указывает, какой индекс или тип соединения должен быть использован.
          Обратный случай - вместо использования индекса было выбрано сканирование таблицы. Как правило, это связано с тем, что статистика устарела и требуется её обновление. Однако и в этом случае причиной неудачно выбранного плана вполне могут оказаться подсказки оптимизатору запросов.
          query_text - Текст самого запроса
          database_name - Имя базы данных, в находится объект, содержащий запрос. NULL для системных процедур
          object_name - Имя объекта (процедуры или функции), содержащего запрос.
          */
          with s as (
          	select  creation_time,
          			last_execution_time,
          			execution_count,
          			total_worker_time/1000 as CPU,
          			convert(money, (total_worker_time))/(execution_count*1000)as [AvgCPUTime],
          			qs.total_elapsed_time/1000 as TotDuration,
          			convert(money, (qs.total_elapsed_time))/(execution_count*1000)as [AvgDur],
          			total_logical_reads as [Reads],
          			total_logical_writes as [Writes],
          			total_logical_reads+total_logical_writes as [AggIO],
          			convert(money, (total_logical_reads+total_logical_writes)/(execution_count + 0.0))as [AvgIO],
          			[sql_handle],
          			plan_handle,
          			statement_start_offset,
          			statement_end_offset
          	from sys.dm_exec_query_stats as qs with(readuncommitted)
          	where convert(money, (qs.total_elapsed_time))/(execution_count*1000)>=100 --выполнялся запрос не менее 100 мс
          )
          select
          	s.creation_time,
          	s.last_execution_time,
          	s.execution_count,
          	s.CPU,
          	s.[AvgCPUTime],
          	s.TotDuration,
          	s.[AvgDur],
          	s.[Reads],
          	s.[Writes],
          	s.[AggIO],
          	s.[AvgIO],
          	--st.text as query_text,
          	case 
          		when sql_handle IS NULL then ' '
          		else(substring(st.text,(s.statement_start_offset+2)/2,(
          			case
          				when s.statement_end_offset =-1 then len(convert(nvarchar(MAX),st.text))*2      
          				else s.statement_end_offset    
          			end - s.statement_start_offset)/2  ))
          	end as query_text,
          	db_name(st.dbid) as database_name,
          	object_schema_name(st.objectid, st.dbid)+'.'+object_name(st.objectid, st.dbid) as [object_name],
          	sp.[query_plan],
          	s.[sql_handle],
          	s.plan_handle
          from s
          cross apply sys.dm_exec_sql_text(s.[sql_handle]) as st
          cross apply sys.dm_exec_query_plan(s.[plan_handle]) as sp
          


          Результат


          В данной статье был рассмотрен пример счетчиков производительности (элементы данных) в Zabbix. Данный подход позволяет уведомлять администраторов о разных проблемах в реальном времени или через какое-то определенное время. Таким образом, данный подход позволяет минимизировать в будущем наступления критической проблемы и остановки работы СУБД и сервера, что в свою очередь защищает производство от остановки рабочих процессов.
          Предыдущая статья: Регламентные работы с базой данных информационной системы 24x7 в MS SQL Server

          Источники:


          » Zabbix 3.4
          » Счетчики производительности
          » Центр производительности для базы данных Azure SQL и SQL Server Database Engine
          » Стиль жизни SQL
          » SQLSkills
          » TechNet Microsoft
          » Анализируем использование памяти
          » Анализ производительности
          » Документация по SQL
          » Заметки о Windows
          Original source: habrahabr.ru (comments, light).

          https://habrahabr.ru/post/338498/


          Метки:  

          AliExpress «невероятные» возможности вашего профиля в интернет-магазине

          Пятница, 22 Сентября 2017 г. 23:26 + в цитатник
          ninadinastiia сегодня в 23:26 Разработка

          AliExpress «невероятные» возможности вашего профиля в интернет-магазине



            Добрый вечер! Покупки — это здорово, а если на Алиэкспресс, то еще и не дорого, но правда рискованно и обычно долго. Конечно над ним постоянно работают, это видно, но пока еще не понятно многое.

            Просьба


            Началось с того, что меня попросили заказать в интерне-магазине на «Али» противоударный телефон для ребенка. Подобрали модель, согласовали, решили заказывать.
            Что то не заладилось сразу и обзавестись профилем в PayPal удалось, а вот привязать к нему карту — нет.
            Сразу оговорюсь, что электронными деньгами и картами пользуюсь очень аккуратно и никогда не храню на них деньги, ну раз ве что до 1 000,00 рублей.
            Попробовала заплатить картой напрямую, но все равно ничего не получалось. В какой то момент даже засомневавшись узнала баланс на счете, вдруг денег там нет.
            Деньги были и в достаточном количестве.

            Не понимая что не так, я вышла из одного профиля и зашла в другой, с которого уже делала покупки. Заметив что различается тип карты, платила я с VISA, решила что платеж не проходит потому что у покупателя Маэстро. По крайней мере я не нашла такого значка в списке.

            Вообщем то с самого начала я на электронную почту покупателя зарегистрировала профиль в интернет-магазине, затем добавила карту Маэстро, но платеж не проходил. Забавно что система PayPal со счета списала примерно один доллар, но платеж в пользу продавца не проходил ни как.
            У покупателя не было карты VISA, она была только у его супруги, мне скинули фотки карты, но было лень все заново регистрировать, и я добавила карту супруги покупателя на свой профиль.

            И тут, вдруг...


            «Спасибо за ваш платеж!» или что то подобное выдала мне система. Интересно! Только два реквизита я вводила не с карты — это дата рождения, и номер телефона. Но узнать их не составит определенного труда злоумышленнику, если он напрямую знаком с жертвой или имеет доступ к документации. Или допустим какие то знакомые, коллеги, родственники, не важно, мало ли.
            Покупателю сказала, что должно прийти СМС-сообщение из банка с подтверждением платежа, что б они не пропустили и обязательно мне позвонили, сообщили.

            Как то прям даже неловко


            На следующий день знакомый перезвонил и сказал, что деньги списаны, их просто списали и все. Сообщение пришло такое же, как из банкомата, когда переводишь средства.
            И тут возник резонный вопрос — а как? Как так получается, что не какой аутентификации платежа не было и он «провелся» не смотря на то, что владелец карты не был владельцем профиля? Странно, но а как же безопасность? Это допустимо или какая то ошибка при разработке?

            Послесловие


            Не смотря ни на что, телефон пришел и ребенку очень понравился, а это наверное главное). Проходя по различным учреждениям обращаю внимания как люди заполняющие различные заявления бросают свои документы и карты, наивно полагая, что списать с нее средства не зная пароль, под силу только хакерам или спец.службам.
            Как видно из рассказа выше балованный сын или транжира-подружка смогут осуществить покупку с вашей карты на AliExpress, в принципе без вашего согласия и на приличную сумму.
            Возможно я не права и это только рассуждения, но лишний раз подтверждает, что ваши деньги те — что у вас в кармане.
            Original source: habrahabr.ru (comments, light).

            https://habrahabr.ru/post/338534/


            Метки:  

            Security Week 38: Секьюрити-камеры передают по ИК, нейросеть быстро подбирает пароли, хакеры ведут разведку через Word

            Пятница, 22 Сентября 2017 г. 19:20 + в цитатник
            Kaspersky_Lab вчера в 19:20 Разработка

            Security Week 38: Секьюрити-камеры передают по ИК, нейросеть быстро подбирает пароли, хакеры ведут разведку через Word

              Каким бы действенным ни был метод защиты «отрезать кабель в интернет», пользуются им чрезвычайно редко – даже те, кому стоило бы. Но исследователи не унимаются в попытках придумать самый курьезный способ преодоления «воздушного разрыва». То звуком, то светом, то теплом, то голубями почтовыми. И таки трое ловкачей из Университета Бен-Гуриона на днях сообразили кое-что новое – использовать секьюрити-камеры.

              Замысел такой: физически изолированная (air-gapped) сеть заражается зловредом. Как – это давно придумано, и даже реализовано (Stuxnet, например). Флешечку можно подкинуть, диск с зараженным софтом, да мало ли что. Но войти – не значит выйти. Однако же мало найдется объектов с изолированной сетью без системы физической безопасности с камерами наблюдения. А чтобы что-то видеть, когда в помещении выключен свет, нужна подсветка, и большинство камер оснащается массивом ИК-светодиодов. Некоторые из этих камер можно увидеть снаружи, через окно.

              Соответственно, камеры со специальным троянцем превращаются в ДВУСТРОННИЙ канал передачи данных. Причем невидимый невооруженным глазом. Наружу данные передаются ИК-диодами, а злоумышленник с обычным смартфоном их принимает. Чтобы ввести данные, хакер пользуется таким же массивом ИК-диодов, а камера принимает их сигнал.



              Заявленные в исследовании параметры канала внушительны, по сравнению с другими способами преодоления воздушного разрыва – скорость 15 бит/c на каждый светодиод (что дает 120 бит/c при обычных для камер восьми светодиодах), дистанция – сотни метров наружу, и километры при передаче внутрь. Бен-гурионские затейники даже придумали, как обойтись без прямой видимости (правда, максимальная дистанция сокращается до десятков метров).



              Что ж, для того, чтобы мы увидели реальное применение такой техники, нам нужно, чтобы совпало три обстоятельства: (1) кто-то решил изолировать сеть воздушным разрывом, (2) его информацией заинтересовались хакеры и (3) этот кто-то включил секьюрити-камеры в свою суперзащищенную изолированную сеть. Звучит глуповато, но все равно, идея красивая.

              Разработан AI для быстрого угадывания паролей

              Новость. Исследование. Ученые из Технологического института Стивенса и Нью-йоркского технологического института опубликовали ранние результаты своей работы по применению генеративно-состязательных сетей (Generative adversarial network, GAN) для ускоренного угадывания паролей. Ну то есть более быстрого, чем перебор по заданным вручную правилам, как в Hashcat или John the Ripper.

              Идея выглядит вполне себе логичной – если кто и может определить, по каким принципам люди придумывают себе пароли, то только нейросети. Генеративно-состязательные сети в последнее время часто используют для забав вроде улучшения порченых фото или автоматического построения реалистично выглядящих картинок зверушек (реалистично выглядят они только для самих экспертов по deep learning, а на самом деле пипец какие страшные, см. пруф).

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

              Яйцеголовые хакеры, вооружившись TensorFlow 1.2.1, обучали сеть паролями, слитыми за последние 18 месяцев из LinkedIn и RockYou. Та в итоге сгенерила собственные, усовершенствованные правила подбора паролей. Сами по себе они оказались не сказать, что лучше, чем у HashCat, но если их совместить с правилами HashCat, то количество угаданных паролей из тестовой выборки повышалось на 18-24%. Цифры не очень впечатляют, но надо понимать, что на практике выборку можно взять и сильно побольше. То есть уже довольно скоро оценки сложности подбора паролей придется пересматривать – прогресс не остановить.

              Недокументированная возможность MS Office позволяет слить данные профиля

              Новость. Исследование. Сколько ни ковыряйся в Microsoft Office, или в его файлах, всегда найдешь какой-нибудь сюрприз. Наши ребята, исследуя целевую атаку Freakyshelly, наткнулись на фишинговую рассылку с файлами OLE2. На первый взгляд, внутри не было ничего вредоносного, ни макросов, ни эксплойтов, ни флеша. А потом нашли ссылки на PHP-скрипты на внешнем хостинге. Открываешь файл в Word, тот лезет по ссылкам – и наружу входят данные по установленному программному обеспечению.



              Предположительно, атакерам эти данные нужны для разведки. Вообще для успеха целевой атаки очень важны точные данные о том, какой софт установлен у жертвы, и каких версий. Но зачем Word вообще переходит по этим ссылкам?

              Исследователи обнаружили, что хакеры эксплуатируют не полностью документированную фичу MS Office – поле INCLUDEPICTURE в документе. Значение в этом поле всего лишь сообщает Word о том, что к определенным символам в тексте привязана картинка, ссылка на ее расположение должна быть в ASCII. Но кто-то придумал поставить туда хитросоставленный Unicode, и в итоге поле ссылается на определенное смещение в документе, где лежит форма, в дополнительных данных которой есть URL – куда Word и лезет. Помимо Word для Windows, эта фича работает в Microsoft Office для iOS и Android.

              Древности


              «Subliminal-1487»

              Периодически зашифровывает и выводит на экран текст: «LOVE, REMENBER?». Также содержит зашифрованный текст: «N:SUBLIMINAL V1.10 O:^HYSTERIA! D:02OCT89».

              Цитата по книге «Компьютерные вирусы в MS-DOS» Евгения Касперского. 1992 год. Страницa 35.

              Disclaimer: Данная колонка отражает лишь частное мнение ее автора. Оно может совпадать с позицией компании «Лаборатория Касперского», а может и не совпадать. Тут уж как повезет.
              Original source: habrahabr.ru (comments, light).

              https://habrahabr.ru/post/338520/


              Метки:  

              Кастомные свойства

              Пятница, 22 Сентября 2017 г. 19:00 + в цитатник
              htmlacademy сегодня в 19:00 Разработка

              Кастомные свойства


                Зачем нужны кастомные свойства и как они работают?

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


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


                Как работают препроцессоры? Вы пишете на каком-то языке, который внешне напоминает CSS, а иногда вообще не напоминает.


                @mixin sass
                  @if &
                    &:hover
                      color: tomato
                  @else
                    a
                      color: plum

                Потом это компилируется в настоящие стили. Переменные там — это такая сложная автозамена переменных на их значения. Sass, Less, Stylus, PostCSS-плагины — все они работают только так. Эти переменные существуют только в разработке, в браузере их уже нет.


                .scss {
                  $variable: value;
                  color: $variable;
                }

                Если сравнить такое поведение с JavaScript, то становится очень обидно за CSS. В JS переменные живут прямо в браузере, их можно создавать и менять на лету. Тем не менее такие переменные и другие элементы программирования в CSS-препроцессорах получили огромную популярность. Уже почти не бывает больших проектов без препроцессоров.


                К счаcтью нашлись люди, недовольные такими куцыми переменными. После ряда черновиков и вариаций синтаксиса, Таб Аткинс написал спецификацию полноценных CSS-переменных, точнее, кастомных свойств. Эти переменные поддерживаются уже в 70% браузеров по миру и сильно меняют принцип написания стилей.


                Кастомные кто? Объясняю. Помните, я говорил, что CSS не очень-то готов к переменным? Чтобы сохранить синтаксическую совместимость со старыми браузерами и не противоречить модели языка, было решено сделать не просто переменные с долларом в начале, а механизм создания собственных свойств для нужд разработчика. Ещё их переводят как «пользовательские» свойства, но с этим возникает путаница: кто здесь пользователь, а кто здесь разработчик? Сразу скажу, синтаксис у них немножко странный, но вы поймёте почему.


                Например, у нас сейчас есть свойство box-shadow, чтобы отбрасывать тень. А раньше его не было, оно появилось первым в браузере Safari в 2008 году. Но появилось не просто так, а как -webkit-box-shadow, с префиксом, начинающимся с дефиса. То есть разработчики движка WebKit придумали своё свойство. Только потом, когда оно стало частью стандарта и появилось в других браузерах, префикс убрали.


                .shady {
                  -webkit-box-shadow: 0 0 0 4px tomato;
                  box-shadow: 0 0 0 4px tomato;
                }

                Теперь вы тоже можете создавать собственные свойства, только не нужно указывать между дефисами название движка: дефис, дефис, название свойства. Давайте создадим свойство --box-shadow-color и зададим ему значение tomato. Чтобы использовать это значение в коде, нужно передать его в функцию var().


                .shady {
                  --box-shadow-color: tomato;
                  box-shadow: 0 0 0 5px var(--box-shadow-color);
                }

                Мы сейчас объявили новое свойство, которое потом можно повторно использовать снова и снова. А ещё свойства box-shadow-color никогда не было в природе и чтобы менять тени, например, по наведению, приходилось переписывать box-shadow целиком. А теперь по ховеру можно просто поменять значение переменной. Круто?


                .shady {
                  --box-shadow-color: tomato;
                }
                .shady:hover {
                  --box-shadow-color: plum;
                }

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


                .shady {
                  font-size: var(--font-size, 12px);
                }

                Из-за того, что это кастомные свойства, а не просто доллары с автозаменой, они ведут себя как обычные свойства: наследуются вглубь для всех детей элемента и не видны между элементами-соседями. Чтобы переменную точно было видно во всём документе, её нужно задать самому корневому элементу , но лучше даже :root, на случай если это корневой элемент .


                :root {
                  --font-size: 12px;
                  --theme-color: tomato;
                }

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


                @media (min-width: 320px) {
                  .shady {
                    --font-size: 48px;
                  }
                }

                Кастомные свойства можно использовать даже внутри функции calc(), которая посчитает результат выражения внутри. Уже не очень похоже на привычный CSS, правда? Стоит ли говорить, что все препроцессоры уже умерли от зависти, глядя на такое.


                .shady {
                  font-size: calc(var(--font-size) * 2);
                }

                Ещё кастомные свойства становятся идеальным транспортом для данных между скриптами и стилями. Например, вы можете динамически считать координаты мыши в JS и пробрасывать их в кастомные свойства через setProperty в нужный элемент.


                element.style.setProperty('--pointer-left', event.clientX);

                Дальше в стилях уже можно решить: использовать их в top и left или transform: translate(). И наоборот: значение свойства можно получить в JS с помощью getPropertyValue.


                И это я только кастомные свойства лапкой потрогал, дальше ещё куча интересного, что кардинально меняет работу со стилями. Читайте и смотрите дальше сами: статьи, видео и слайды.


                Кастомные свойства — это не border-radius, который либо делает красиво, либо нет. Бросаться всё переделывать на них пока рано, вёрстка может сильно поломаться в браузерах, которые их не поддерживают. Но уже пришло время пробовать и уметь.


                Видеоверсия





                Вопросы можно задавать здесь.

                Original source: habrahabr.ru (comments, light).

                https://habrahabr.ru/post/337292/


                Метки:  

                Эволюция: из стажеров в интерны

                Пятница, 22 Сентября 2017 г. 18:44 + в цитатник
                TheKatar сегодня в 18:44 Управление

                Эволюция: из стажеров в интерны



                  Привет! Меня зовут Данила. Я третий год грызу гранит науки в МГТУ им.Н.Э.Баумана на факультете «Программная инженерия». Так сложились звезды, что в этом году я пришел в Parallels в качестве интерна на part-time. Под катом история моей эволюции из стажеров в интерны.

                  В свое время была возможность прикоснуться к Технопарку Mail.ru Group, работающему на базе нашего вуза. В начале второго курса попал к ним на подготовительные по C++. Выполнил тестовые задания, прошел отбор и даже немного поучился. Но это было несколько позже, чем я оказался в Parallels. Поэтому принял решение все-таки остаться на красно-белой стороне.



                  Еще на первом курсе наткнулся на информацию о том, что МГТУ им.Баумана сотрудничает с Parallels. Заинтересовался. Подошел к нашему заведующему кафедрой за информацией. Тот рассказал, что по счастливому стечению обстоятельств у нас в университете планируется открытая лекция одного из специалистов компании. Я пришел. На встрече была куча задач, НИРы, НИОКРы и прочее. После лекции познакомился с Алексеем Корякиным. Как оказалось, он выпускник нашего вуза. Разговорились про языки программирования. Помню, как сказал ему, что одну из предложенных задач не имело смысла «питонить». На что Алексей заметил, что настоящему программисту нет разницы на каком языке писать. Я со своей стороны ответил, что хороший программист всегда найдет оптимальный язык для решения поставленной задачи. Так я получил приглашение пройти собеседование в компании.



                  Пришел на встречу. Познакомились с другими членами команды. Особо технически меня не собеседовали, больше было про soft skills. Спросили, какие языки я пробовал и тд. Не знаю, чем заинтересовал, но в итоге 28 июня у меня был последний экзамен, а 29-го числа я уже был в Parallels в качестве стажера. И меня начали учить…



                  К концу лета пришло осознание того, что за два месяца стажировки я узнал больше, чем за год учебы в вузе. Понял, что хочу сюда еще. Ушел на учебу. Через полгода вернулся на стажировку обратно, в Internal Development. За что хочу сказать спасибо менторам, так это за то, что научили меня работать. Не за какие-то отдельные знания, а именно за то, что показали, как строятся рабочие процессы, как системно выстраивать свою деятельность.



                  Мешает ли работа учебе? Нет! Во-первых, наверное, мне повезло, поскольку в Бауманке довольно комфортное расписание. Второе, несмотря на то, что part-time – это 20 часов в неделю, Parallels — отличное место для старта. График работы гибкий. Здесь смотрят на то, что ты сделал, а не на то столько времени ты на это потратил. Совмещать работу и учебу просто. Достаточно в выходные посидеть над учебниками. Я еще не работал правда в период сессии, но уверен, что мы сможем найти оптимальное решение. Тем более, что мои менторы сами бывшие выпускники Бауманки.

                  Жизнь изнутри


                  Что такое Parallels Desktop я узнал достаточно давно. Однажды увидел запущенную Windows на Mac. Удивился в начале, потом объяснили, что далеко не все Windows-приложения доступны маководам. Помню, как впечатлился параллельной работой двух ОС и эффектным свайп-переключением между системами.



                  Если говорить про первые впечатления, то после того, как пришел в компанию, они конечно скорректировались. Во-первых, снаружи кажется, что Parallels – это огромная корпорация с тысячами программистов по всему миру и тд. На деле оказалось, что сложнейшие задачи решает скромная команда разработчиков в Москве, Таллине и на Мальте. Конечно, у нас 10 офисов по всему миру, но все же. При этом все общаются друг к другу на «Ты». Это не зависит от должности и возраста собеседника. Просто здесь так принято. Еще на что обращаешь внимание, так это на существующую внутри дружескую атмосферу. Все достаточно комфортно. Могу сказать, что я не устаю от самого факта нахождения на работе.

                  От теории к практике


                  До недавнего времени мне давали задачи абстрактного характера, не связанные с рабочими процессами. В первую очередь для понимания внутренней кухни, как мне кажется. Параллельно я писал свой проект. Со временем диалоги, звучавшие на рабочих встречах, перестали быть для меня китайской грамотой и мне начали поручать прикладные задачи. Например, сейчас работаю с системой отчетов. Все максимально приближено к реальности. Есть задача, ее нужно сделать. Люди вокруг могут порекомендовать источники знаний. Сказать вот эта библиотека, например, плохая или хорошая, и объяснить почему. Но давать тебе путь к этой библиотеке, говорить, что нужно и как сделать, никто не станет. Писать код за тебя здесь точно никто не будет. Делай все сам! Находи все сам. Ты развиваешься сам. Со стороны коллег это похоже на наставничество. Вокруг тебя всегда есть люди, которые в нужный момент скажут правильно ли ты развиваешься. При этом, вся теоретическая часть на тебе. Конечно, тебе могут рекомендовать тот или иной источник, но точно никто не будет требовать от тебя его штудировать. Это твоя зона ответственности. Конечно, мне могут что-то объяснить, если реально непонятно, но в основном это самообразование. Вообще считаю, что существующая практика оптимальна. В противном случае, при наличии жесткого плана у человека может возникнуть непонимание относительно того, зачем ему дают тот или иной материал. В другие моменты, он может считать, что эти знания ему не нужны и пользоваться ими он никогда не будет. В университете, напротив, это возведено в абсолют. Когда мне преподают графику, например, я могу предположить, что каким-то образом она выстраивает логику мышления, но вряд ли я буду пользоваться какими-то графическими алгоритмами в будущем. У меня другая цель. Иметь общее представление хорошо, но не более.



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



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

                  З.Ы. Ну и немного забавных фоточек из офиса. Надеюсь ребята меня за них не линчуют.



                  Всем сотрудникам Parallels выдают шапочки из фольги.



                  Здесь все обычно запасаются витаминами и лишними килограммами.



                  В офисе развит кросс-букинг и прочие полезности.



                  На двух этажах московского офиса можно найти все что угодно.



                  Тут хранится корпоративная скатерть-самобранка.



                  Кстати, у нас в Бауманке недавно открылась научно-практическая лаборатория Parallels. Стены украшают умные люди, так или иначе связанные с историей компании.



                  Билл Гейтс плохого не посоветует!

                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338512/


                  Метки:  

                  [Из песочницы] MVVM: полное понимание (+WPF) Часть 1

                  Пятница, 22 Сентября 2017 г. 18:34 + в цитатник
                  oggr вчера в 18:34 Разработка

                  MVVM: полное понимание (+WPF) Часть 1

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

                  Зачем вообще нужно использовать паттерн MVVM? Это ведь лишний код! Написать тоже самое можно гораздо понятнее и прямолинейнее.

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


                  Изображение 1: код без MVVM.


                  Изображение 2: код с MVVM.

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

                  Рассмотрение паттерна на примере №1: Сложение двух чисел с выводом результата


                  Методика:

                  Методика написания программы используя подход «ModelFirst».

                  • 1. Разработать модель программы.
                  • 2. Нарисовать интерфейс программы.
                  • 3. Соединить интерфейс и модель прослойкой VM.

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

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

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

                   static class MathFuncs {
                      public static int GetSumOf(int a, int b) => a + b;
                    }

                  Следующий шаг — (см. методику «ModelFirst») — создать View или, проще — нарисовать интерфейс. Это тоже часть, которая может содержать творчество. Но, опять же, не стоить с ним перебарщивать. Пользователь не должен быть шокирован неожиданностями интерфейса. Интерфейс должен быть интуитивен. Наша View будет содержать три текстовых поля, которые можно снабдить лейблами: число номер один, число номер два, сумма.

                  Заключительный шаг — соединение View и модели через VM. VM — это такое место, которое вообще не должно содержать творческого элемента. Т.е. эта часть паттерна железно обуславливается View и не должна содержать в себе НИКАКОЙ «бизнес логики». Что значит обусловленность от View? Это значит, что если у нас во View есть три текстовых поля, или три места, которые должны вводить/выводить данные — следовательно в VM (своего рода подложке) должны быть минимум три свойства, которые эти данные принимают/предоставляют.

                  Следовательно два свойства принимают из View число номер один и два, а третье свойство — вызывает нашу модель для выполнения бизнес-логики нашей программы. VM ни в коем случае не выполняет сложение чисел самостоятельно, оно для этого действия только вызывает модель! В этом и состоит функция VM — соединять View (которое тоже ничем иным, кроме как приема ввода от пользователя и предоставления ему вывода не занимается) и Модель, в которой происходит все вычисление. Если нарисовать картинку нашей задачки, то получиться нечто такое:


                  Изображение 3: Схема Примера №1

                  Зеленое — это View, три зеленые точки в которой — это наши три текстовые поля. Синее — это VM, к которой эти три зеленых точки железно прибиты (прибиндены), ну а красное облачко — это модель, которая занимается вычислением.

                  Реализация Примера №1 в WPF


                  Конкретно в WPF реализована «аппаратная поддержка» паттерна MVVM. View реализуется в XAML. Т.е. зеленый слой (View) будет написана на XAML. Зеленые точки — это будут текстовые поля. А зеленые линии, соединяющиеся с синими — будут реализованы через механизм Binding. Зеленая пунктирная линия — связь всей View и VM осуществляется, когда мы создаем объект VM и присваиванием его свойству DataContext View.

                  Рисуем View:

                    
                  
                      
                  
                  
                    
                    
                    
                    
                    
                    
                  

                  Теперь выполняем последний пункт методики — реализуем VM. Чтобы наша VM «автоматически» обновляла View, требуется реализовать интерфейс INotifyPropertyChange. Именно посредством него View получает уведомления, что во VM что-то изменилось и требуется обновить данные.

                  Делается это следующим образом:

                  public class MainVM : INotifyPropertyChange
                  {
                    public event PropertyChangedEventHandler PropertyChanged;
                    protected virtual void OnPropertyChanged(string propertyName) {
                        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
                    }
                  }

                  Теперь снабдим VM тремя необходимыми свойствами. (Требования для установления связи VM и View такое, что это должны быть открытые свойства)

                  private int _number1;
                  public int Number1 { get {return _number1;}
                    set { _number1 = value;
                      OnPropertyChanged("Number3"); // уведомление View о том, что изменилась сумма
                    }
                  }
                  
                  private int _number2;
                  public int Number2 { get {return _number2;}
                    set { _number1 = value; OnPropertyChanged("Number3"); } }

                  Последнее свойство — это линия пунктирная синяя линия связи VM и модели:

                  //свойство только для чтения, оно считывается View каждый раз, когда обновляется Number1 или Number2
                  public int Number3 { get; } => MathFuncs.GetSumOf(Number1, Number2);

                  Мы реализовали полноценное приложение с применением паттерна MVVM.

                  Рассмотрение паттерна на примере №2:

                  Теперь усложним наше задание. В программе будет текстовое поле для ввода числа. Будет ListBox с коллекцией значений. Кнопка «Добавить», по нажатию на которую число в текстовом поле будет добавлено в коллекцию значений. Кнопка удалить, по нажатию на которую выделенное в ListBox'е число будет удалено из коллекции. И текстовое поле с суммой всех значений в коллекции.


                  Изображение 4: Интерфейс для Примера №2

                  Согласно методике — необходимо сначала разработать модель. Теперь модель не может быть stateless и должна хранить состояние. Значит в модели будет коллекция элементов. Это раз. Затем — операция добавление некоторого числа в коллекцию — это обязанность модели. VM не может залезать во внутренность модели и самостоятельно добавлять в коллекцию модели число, она обязана просить сделать это саму модель. В противном случае это будет нарушение принципа инкапсуляции. Это как если бы водитель не заливал, как положено, топливо в бензобак и т.д. — а лез бы под капот и впрыскивал топливо непосредственно в цилиндр. То есть будет метод «добавить число в коллекцию». Это два. И третье: модель будет предоставлять сумму значений коллекции и точно также уведомлять об ее изменении через интерфейс INotifyPropertyChanged. Не будем разводить споры о чистоте модели, а будем просто использовать уведомления.

                  Давайте сразу реализуем модель:

                  Коллекция элементов должна уведомлять подписчиков о своем изменении. И она должна быть только для чтения, чтобы никто, кроме модели, не могли ее как-либо изменить. Ограничение доступа — это выполнение принципа инкапсуляции, оно должно соблюдаться неукоснительно, чтобы: а) самому случайно не создать ситуацию трудноуловимого дебага, б) вселить уверенность, что поле не изменяется извне — опять же, в целях облегчения отладки.

                  Кроме того, так так мы далее все равно подключим Prism для DelegateCommand, то давайте сразу использовать BindableBase вместо самостоятельной реализации INotifyPropertyChange. Для этого надо подключить через NuGet библиотек Prism.Wpf (на момент написания 6.3.0). Соответственно OnPropertyChanged() измениться на RaisePropertyChanged().

                  public class MyMathModel : BindableBase
                  {
                    private readonly ObservableCollection _myValues = new ObservableCollection();
                    public readonly ReadOnlyObservableCollection MyPublicValues;
                    public MyMathModel() {
                      MyPublicValues = new ReadOnlyObservableCollection(_myValues);
                    }
                    //добавление в коллекцию числа и уведомление об изменении суммы
                    public void AddValue(int value) {
                      _myValues.Add(value);
                      RaisePropertyChanged("Sum");
                    }
                    //проверка на валидность, удаление из коллекции и уведомление об изменении суммы
                    public void RemoveValue(int index) {
                        //проверка на валидность удаления из коллекции - обязанность модели
                      if (index >= 0 && index < _myValues.Count) _myValues.RemoveAt(index);
                      RaisePropertyChanged("Sum");
                    }
                    public int Sum => MyPublicValues.Sum(); //сумма
                  }

                  Согласно методике — рисуем View. Перед этим несколько необходимых пояснений. Для того, чтобы создать связь кнопки и VM, необходимо использовать DelegateCommand. Использование для этого событий и кода формы, для чистого MVVM — непозволительно. Используемые события необходимо обрамлять в команды. Но в случае с кнопкой такого обрамления не требуется, т.к. существует специальное ее свойство Command.

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


                  Изображение 5: Схема для Примера №2

                  Здесь привязка на View происходит не вида View <=> ViewModel, а вида View <=> View. Для того, чтобы этого добиться используется второй вид биндинга, где указывается имя элемента и его свойства, к которому осуществляться привязка — "{Binding ElementName=TheNumber, Path=Text}".

                  
                      
                             
                      
                      
                          
                          
                              
                              
                          
                          
                          
                          
                          
                          
                          
                      
                  

                  Теперь реализуем ViewModel:

                  public class MainVM : BindableBase
                  {
                    readonly MyMathModel _model = new MyMathModel();
                    public MainVM()
                    {
                      //таким нехитрым способом мы пробрасываем изменившиеся свойства модели во View
                      _model.PropertyChanged += (s, e) => { RaisePropertyChanged(e.PropertyName); };
                      AddCommand = new DelegateCommand(str => {
                        //проверка на валидность ввода - обязанность VM
                        int ival;
                        if (int.TryParse(str, out ival)) _model.AddValue(ival);
                      });
                      RemoveCommand = new DelegateCommand(i => {
                          if(i.HasValue) _model.RemoveValue(i.Value);
                      });
                    }
                    public DelegateCommand AddCommand { get; }
                    public DelegateCommand RemoveCommand { get; }
                    public int Sum => _model.Sum;
                    public ReadOnlyObservableCollection MyValues => _model.MyPublicValues;
                  }

                  Внимание — важно! Касательно проброса уведомлений из модели. Уведомлять об изменении суммы самостоятельно VM не может, т.к. она не должна знать, что именно измениться в модели, после вызова ее методов и измениться ли вообще. Модель для VM должна быть черным ящиком. Т.е. она должна передавать ввод и действия пользователя в модель и если в модели что-то изменилось (о чем должна ее уведомлять сама модель), то только тогда уведомлять далее View.

                  Мы реализовали второе полноценное приложение с применением паттерна MVVM, познакомились с ObservableCollection, DelegateCommand, привязкой вида View <=> View и пробросом уведомлений во View.
                  Original source: habrahabr.ru (comments, light).

                  https://habrahabr.ru/post/338518/


                  Метки:  

                  23000 человек написали онлайн-диктант 8 апреля 2017. Как это получилось?

                  Пятница, 22 Сентября 2017 г. 18:02 + в цитатник
                  krillw сегодня в 18:02 Администрирование

                  23000 человек написали онлайн-диктант 8 апреля 2017. Как это получилось?

                    В этом году 200 тысяч человек из 858 городов мира приняли участие в образовательной акции «Тотальный диктант». Пишут диктант уже семь лет в основном на офлайн-площадках, возможность сделать это онлайн есть с 2014 года. Испытав все горести экстремальных нагрузок на сайт, в этом году организаторы акции привлекли целую команду ИТ-компаний. Сегодня мы рассказываем о своей части работы.

                    image

                    Фонд «Тотальный диктант» начал продвижение акции в феврале — тогда стартовали онлайн-занятия по подготовке и пошли первые публикации в СМИ. Каждый урок смотрели в среднем 13990 человек — конечно, в день диктанта предполагалась еще более значительная нагрузка на сайт. В прошлом году во время диктанта на сервера обрушилась DDoS-атака, из-за которой какое-то время сайт был недоступен. За работоспособность сайта отвечали:

                    • CMS «1С-Битрикс» (функциональность и интерфейс);
                    • «Битриксоид» (техническая поддержка);
                    • «Сервионика» (облачный хостинг);
                    • научно-технический центр «Атлас» (защита от ботов и DDoS-атак);
                    • ITSumma (подготовка ИТ-инфраструктуры и серверов);
                    • Stepik (платформа для онлайн-диктанта).


                    Подготовка сайта к нагрузке


                    До старта наших работ проект был размещен на простом виртуальном сервере с такими характеристиками: 2 ядра CPU, 4 Гб оперативной памяти, HDD.

                    Изначально от команды проекта было предположение, что в день акции на сервер будет поступать 120 RPS, и каждую минуту на сайт будет заходить 1000 посетителей. Чтобы выяснить, сколько RPS сервер сможет выдержать сейчас, и какая конфигурация серверов потребуется для пиковой нагрузки, было проведено нагрузочное тестирование сервера Яндекс.Танком. Итоговая конфигурация основного и резервного серверов выглядела так: 48 ядер CPU, 128 Гб оперативной памяти, 250 Гб SSD.

                    На период подготовки проекта к пиковой нагрузке мы сделали апгрейд виртуального сервера с сайтом — чтобы можно было провести все нужные оптимизации как по части настроек, так и по части кода.

                    Параллельно с проведением нагрузочного тестирования шел процесс подключения антиддос-провайдера к сайту. Как он выглядел:

                    1. Все А-записи сайта были переключены на IP антиддоса.
                    2. Настройки почтового сервера были изменены таким образом, чтобы в заголовках исходящих писем нигде не фигурировали реальные IP проекта.
                    3. На стороне антиддос были настроены фильтрация всех поступающих на сайт запросов и их последующее проксирование на сервера проекта.


                    Изначально новые сервера планировалось разделить, и один сервер сделать как основной, а другой — как резервный, на случай падения основного. Но в ходе проведения нагрузочных тестов для увеличения общей ёмкости системы было решено задействовать резервный сервер для обработки запросов на backend (в нашем случае — php-fpm). Балансировка запросов на backend между основным и резервным серверами осуществлялась с помощью nginx на основном сервере. В качестве общего хранилища сессий был настроен MySQL — «1C-Битрикс» позволяет это сделать без необходимости модификации настроек сервера.

                    За полторы недели до дня диктанта проект был переключен на новые сервера. Для этого на них сначала была создана полная копия старого сервера — включая все настройки ПО, файлы сайта, базы данных. Сам процесс переключения выглядел так:
                    1. Настроили репликацию БД и синхронизацию файлов проекта со старого сервера на новый.
                    2. В момент переключения включили проксирование всех запросов со старого сервера на новый с помощью nginx.
                    3. Отключили репликацию БД.


                    На стороне антиддос-провайдера были изменены адреса целевых серверов, чтобы весь трафик поступал на новые сервера.

                    После переноса сайта провели итоговое нагрузочное тестирование — эмулировалась нагрузка в 500 RPS, т.к. организаторы предположили, что посетителей будет больше, чем они думали. В результате тестов обнаружилось, что из-за использования MySQL для хранения сессий нагрузка на диски оказалась достаточно велика, и в пиках это может привести к проблемам. Поэтому было решено перенастроить сессии на хранение в memcache — проведенное после этого нагрузочное тестирование показало, что при ожидаемой нагрузке на текущем железе «узких» мест объявиться не должно.


                    Нагрузка в день акции


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

                    image

                    Стартовал диктант 8 апреля 2017 года в 15:00 по Владивостоку (GMT +10). На старте нагрузка была минимальной — порядка 20 запросов в секунду на динамику. Но расслабляться, конечно же, не стоило. К самой крупной трансляции, последней, в 14:00 Мск мы выделили больше памяти под кеширование в Memcache, вынесли туда же сессии, чтобы меньше была нагрузка на диски. Трансляция прошла без каких-либо зафиксированных проблем, нагрузка была контролируемой, работало всё быстро, корректно.

                    image

                    Вот как выглядела картина нагрузок в тот день (время на графиках иркутское, GMT +8).

                    Общий итог


                    Все старались! Данные по мониторингам нагрузок мы передали коллегам из «Тотального диктанта» для составления плана на будущий год.

                    image

                    8 апреля в интернете следили за акцией 90000 зрителей, написали диктант онлайн 23000 человек. С 9 по 18 апреля сайт посетили 454798 уникальных пользователей, которые просмотрели четыре миллиона страниц — участники узнавали свои оценки и смотрели вебинары с разбором ошибок. Подготовку к диктанту 14 апреля 2018 года организаторы уже начали — подтягивайтесь тоже (повторяйте правила русского языка на онлайн-курсах), всем диктант!
                    Original source: habrahabr.ru (comments, light).

                    https://habrahabr.ru/post/338506/


                    Метки:  

                    Анализ утилизации СХД

                    Пятница, 22 Сентября 2017 г. 18:01 + в цитатник
                    ESergey сегодня в 18:01 Администрирование

                    Анализ утилизации СХД

                      image

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

                      Для начала определимся с терминологией. Есть несколько терминов и аббревиатур близких по смыслу: СХД, дисковый массив, SAN, Storage Array или просто Storage. Попробую внести ясность.

                      SAN — Storage Area Network или сеть хранения данных, это совокупность оборудования осуществляющая передачу трафика между сервером и системой хранения данных.
                      СХД — система хранения данных или дисковый массив, оборудование на котором хранятся данные с возможностью оперативного доступа. Есть еще архивные хранилища, но здесь мы их рассматривать не будем. Аббревиатура СХД так же может употребляться как сокращение от сеть хранения данных, но среди русскоговорящих специалистов термин СХД закрепился именно за системой хранения данных.

                      СХД могут обеспечивать два способа доступа к данным:

                      • Блочный доступ, операционная система сервера работает с СХД как с SCSI жестким диском (упрощенно).
                      • Файловый доступ, операционная система сервера работает с СХД как с файловым хранилищем по протоколу NFS, SMB и тд.

                      Обычно к СХД обеспечивающим блочный доступ предъявляют более высокие требования к производительности, нежели к системам обеспечивающим файловый доступ, это обусловлено спецификой решаемых задач. Далее речь пойдет о СХД c блочным доступом, работающим по протоколу Fiber Channel.

                      Для оценки производительности СХД используют три основные метрики:


                      1. Service Time, часто именуемый latency или responce time, измеряется в миллисекундах и обозначает:
                        • при чтении: время с момента получения СХД задания на чтение блока информации до отправки запрошенной информации.
                        • при записи: время с момента получения записываемого блока информации до подтверждения о его успешной записи.
                      2. IO/s — количество операций ввода вывода в секунду.
                      3. MB/s — количество переданных мегабайт в секунду.

                      Параметры IO/s и MB/s тесно связаны между собой размером блока данных, т.е. один мегабайт информации можно записать блоками по 4k и получить 256 операций ввода-вывода, или блоками 64k и получить 16 IO.

                      Рассмотрим наиболее типичные проявления проблем производительности СХД по показателям Service Time, IO/s и MB/s.

                      Повышенный Service Time.


                      image

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

                      Для примера, ниже графики зависимости Service Time от IOPS для двух конфигураций СХД.

                      ST для All flash СХД, 2 Node, 24x1.9 TB SSD, RAID 5, Random 32k, 50/50 Read/Write.
                      image

                      ST для классического СХД, 2 Node, 24x1.8 TB HDD, RAID 5, Random 32k, 50/50 Read/Write.
                      image

                      В общих случаях для All Flash СХД приемлемым считается Service time меньше 1ms, а для классических СХД до 20ms. Порог приемлемого Service time зависит от числа контроллеров, скорости дисков и конечно модели самой СХД, и может отличаться от приведенных значений.
                      Также нужно учитывать до какого уровня задержек дисковой подсистемы сохраняется нормальная работоспособность приложения, и всегда иметь необходимый запас.

                      Планка по MB/s


                      image

                      Чаще всего свидетельствует об исчерпании пропускной способности канала или FC адаптера.

                      Конкурирующие значения по MB/s или IO/s.


                      image

                      Сумма (оранжевый график) двух или более параметров на отрезке времени имеет константу и не превышает ее в какой-либо момент. Такая ситуация может наблюдаться в случае конкуренции за пропускную способность канала или порта СХД.

                      Понижение IO при возрастании ST.


                      image

                      image

                      В случае если процентное распределение размеров блока не изменилось, но при этом ST начинает повышаться, а IO падать, это может свидетельствовать об аппаратных проблемах с СХД, деградации одного из контроллеров или высокой утилизации CPU.

                      Утилизация CPU


                      Утилизация CPU контроллеров СХД в общих случаях не должна превышать 70%, если она постоянно выше 70%, то это свидетельствует об отсутствии запаса производительности СХД.
                      Тут нужно отметить, что СХД можно разделить на две большие группы:

                      • С использованием ASIC, в таких СХД передача данных внутри массива обрабатывается отдельным высокопроизводительным чипом, а CPU остаются сервисные задачи, такие как создание и удаление дисков и снапшотов, сбор статистики и тд.
                      • Без использования ASIC, в таких СХД все задачи выполняет CPU.

                      Утилизацию CPU нужно трактовать по-разному для СХД с ASIC и без, но в любом случае она не должна быть выше 70% при отсутствии запущенных сервисных задач.

                      Медленный рост IO на чтение.


                      image

                      Такая проблема может наблюдаться в случае если СХД использует тиринг размещения данных между носителями разной скорости (например, SSD и NL SATA).
                      К примеру: некая БД работает с высокой нагрузкой один день в неделю, а остальное время простаивает, в таком случае данные к которым давно не было обращений перейдут на носители с малой скоростью, и скорость чтения будет постепенно расти при переходе (так называемом прогреве данных) на быстрые носители.

                      Какой характер нагрузки не свидетельствует о проблемах?


                      Пилообразный график IO
                      image

                      Скачки по MB
                      image

                      Прыгающие значения IO
                      image

                      Все перечисленные примеры нагрузки не свидетельствуют о каких-либо проблемах на стороне СХД. Нагрузка создается хостом подключенным к СХД и зависит от логики процессов использующих дисковое пространство.

                      Как определить трешхолды для Service Time, IO/s и MB/s?


                      Данные параметры можно рассчитать теоретически, складывая производительность дисков и считая пенальти выбранного уровня RAID, также можно воспользоваться сайзерами при наличие оных, но расчет будет очень приблизительным, поскольку не будет учитываться реальный профиль нагрузки. Для определения точных пороговых значений, свидетельствующих например о 90% загрузке СХД, необходимо провести нагрузочное тестирование при помощи специального ПО, сформировав профиль нагрузки близкий к реальному и замерить максимальные значения IO/s и MB/s. Но как быть с Service Time? Тут зависимость нелинейная. Для определения Service Time соответствующего 90% загрузке нужно просто сгенерировать 90% от максимально достигнутого значения по IO. Полученные результаты можно экстраполировать на близкие по конфигурации СХД.

                      Вместо заключения.


                      Анализ и интерпретация параметров производительности СХД в большинстве случаев задача не тривиальная, нужно понимать архитектуру и принцип работы конкретной СХД, иметь схему портов SAN и знать нюансы работы используемых FC адаптеров. Я не рассматривал влияние репликации и использование конвергентных решений, поскольку применение данных технологий существенно усложняет описание процессов влияющих на производительность и сужает перечень общих рекомендаций. В статье не разбирались параметры использования кеша контроллеров, загрузки дисков и утилизации портов внутренней коммутации СХД, поскольку интерпретация этих данных сильно зависит от конкретной модели СХД и применяемых технологий.
                      Original source: habrahabr.ru (comments, light).

                      https://habrahabr.ru/post/338438/


                      Метки:  

                      [Перевод] Лучшие PHP фреймворки в 2017 году

                      Пятница, 22 Сентября 2017 г. 17:14 + в цитатник


                      Сегодня вы увидите список PHP-фреймворков со всеми их «плюсами» и недостатками. Я очень надеюсь, что данный список будет полезным для вас. Ну что ж, поехали!
                      Читать дальше ->

                      https://habrahabr.ru/post/338504/


                      Метки:  

                      [recovery mode] FULL-STACK РАЗРАБОТЧИКИ Новый тренд или реальная потребность компаний?

                      Пятница, 22 Сентября 2017 г. 17:01 + в цитатник
                      image
                      По словам Адама Шапли, full-stack разработчики востребованы как никогда, т.к. в компаниях требуют от IT сотрудников целый ряд навыков. Мы в свою очередь тоже замечаем, что все чаще получаем от наших клиентов запросы на поиск full-stack разработчиков.
                      Читать дальше ->

                      https://habrahabr.ru/post/338502/


                      Метки:  

                      Группа ВТБ: как мы трансформируемся в единый банк и какую роль в этом играют стартапы

                      Пятница, 22 Сентября 2017 г. 16:04 + в цитатник
                      Банковский сектор одним из первых стал вводить высокие технологии в свой бизнес. В России цифровая трансформация финсектора идет уже более 20 лет. Банки отслеживают самые современные и актуальные технологии: системы аутентификации и защиты, чат-боты, различные приложения и сервисы — малый перечень того, что позволяет им повышать клиентоориентированность, эффективность и технологичность бизнеса. Читать далее

                      https://habrahabr.ru/post/338476/


                      Метки:  

                      ИТ-чемпионат «Гонки Героев», или первый проект ЛАНИТ на военном полигоне «Алабино»

                      Пятница, 22 Сентября 2017 г. 16:04 + в цитатник
                      Savochkin сегодня в 16:04 Управление

                      ИТ-чемпионат «Гонки Героев», или первый проект ЛАНИТ на военном полигоне «Алабино»

                        Совершенно случайно мы в ЛАНИТ узнали об ИТ-чемпионате Гонки Героев на военном полигоне «Алабино» и решили в ней участвовать. В нашей команде из десяти бойцов только трое раньше участвовали в подобных соревнованиях. Остальные слабо представляли себе, что это такое. Некоторые, как показали дальнейшие события, совсем-совсем слабо представляли, что их ждет!  

                        Изматывающий забег с кучей сложнейших препятствий. Грязь по пояс, холодная вода, высокие заборы, рукоходы, танки, колючая проволока… Травмы (у двоих свело ногу, один отбил колено) и резкий упадок сил … Все это было — но не имело никакого значения на трассе: мы не останавливались, дышали в спину конкурентам и «съедали» их одного за другим!

                        Наша команда, наверное, не была самой сильной физически, но она точно была сильна духом! Итог — сразу третье место в нашей первой Гонке Героев!

                        Ниже смотрите фотоотчет, как это было.



                        Этим летом я неожиданно для себя  поучаствовал в Гонке Героев и вот через какое-то время натыкаюсь уже на отдельный ИТ-чемпионат Гонки Героев. Оказывается, 16 сентября организаторы решили сделать отдельный зачет — соревнование среди команд ИТ-компаний. Наше руководство поддерживает почти любой наш креатив, поэтому быстренько получаем акцепт и собираем команду.

                        До старта всего неделя. У организаторов все готово — буклеты, манишки и т.д. У нас же — пока ничего. Но для нашего всемогущего PR-менеджера Ксении это не трудности. Она быстро со всеми договорилась, и вот за день до старта все вопросы решены — мы в полном обмундировании и воодушевлении готовы к участию!


                        Всего в ИТ-чемпионате участвовало 8 команд. В каждой команде — по 10 человек. Помимо команды ЛАНИТ в соревнованиях  приняли участие команды Касперского (3 взвода), Group-IB, SEGMENTO, ITelligence, ООО «КаргоОнлйн Лаб». Остальные, видимо, испугались и сразу сдались ;-).

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

                        Длина трассы — 10 км, количество препятствий — 61 штука. Нам нужно преодолеть всю трассу. Нельзя никого потерять или забыть где-нибудь в траншее. У каждого есть две попытки на прохождение препятствия. Если кто-то не проходит испытание, то начисляется штрафное очко, равное одной минуте. Добраться до финиша должна вся команда, в противном случае — дисквал. К слову, финишировали только 6 команд из 8 стартовавших.

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

                        Там мы знакомимся с нашим инструктором Александром. Он сразу намекает на 2 млн долларов в обмен на помощь в прохождении трассы. Уффф… Пришлось бежать по-честному.

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

                        Перед стартом последние наставления и предложение передумать пока не поздно…

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

                        Ну ладно, забыли… Дальше все уже будет нормально.

                        Приходится цепляться всеми частями тела. В водичку как-то совсем неохота.

                        Дальше нужно пролезть метров 20 под колючей проволокой. Вокруг кто-то палит из калашей или что там у них.

                        Препятствия не становятся ниже.

                        Вылезли из очередной лужи. Есть 5 секунд на фотографию.


                        И вперед! Вперед! Вперед за победой! Отдохнем на пенсии!

                        Это вам не в танчики за компом всю ночь тупить!

                        Греем самые важные части тела.

                        Опять лезть и опять чуть что — в воду! За пропущенное препятствие — штраф 1 балл, поэтому все стараются, как только могут.

                        Препятствия нельзя пропускать. Одному трудновато, а вот в команде — самое то.

                        Отряд бойцов рвется вперед.

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

                        А нам как раз туда и нужно.

                        Некоторых бойцов уже на полпути ранила вражеская пуля, но мы своих не бросаем.


                        Это наше самое любимое препятствие.

                        Тимур: «Опять вода! Да сколько ж ещё её будет!»

                        Высота взята.


                        И опять вперед! Покой нам только снится.

                        Опять работа, работа… впереди конкуренты, надо их доставать. Инструктор Саша тем временем позирует вдалеке — вот кому весело.

                        Мама и дочка бодро преодолевают препятствия. Наверное, участие двух поколений — это беспрецедентный случай в Гонке Героев.

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

                        Половина пути пройдена. Вроде бы никого не потеряли.

                        Алексей познакомился с двумя девушками и галантно ведет обеих под руку во время легкой прогулки по парку.

                        В кадр как-то попали ноги нашего фотографа.

                        Фантазия организаторов не знает границ. Неизменна только грязь.

                        Парням надо проходить полностью самим, но для девушек сделано небольшое исключение — они могу проехаться верхом на коллеге.

                        Может показаться, что Женя отдыхает, но это не совсем так. Он рождается заново (так называется препятствие).


                        Бедные наши ноги. Почему я с утра не делаю растяжку?

                        Море вздуется бурливо… и очутятся на бреге, в чешуе как жар горя, тридцать три богатыря.
                        Мы дошли! Осталось только одно, но самое главное препятствие — семиметровый Эверест.


                        Штурмуем «Эверест».

                        Под конец изматывающей дистанции в 10 км и после 60 препятствий тело уже отказывается подчиняться. Но надо сделать последнее усилие и взобраться на эту отвесную стену по канату.


                        Алексей: «Какого… я туда залезть не могу?»

                        Мне удается забраться самому. Дальше помогаю забраться остальным. Девушек — вытягиваем на канате.


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

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

                        Мы достигли своей цели! Мы прошли всю трассу за примерно 3:30, получили не так много штрафных баллов. Мы обогнали много команд-конкурентов, которые стартовали раньше нас, и заняли третье призовое место. Для нас это, безусловно, победа и очень высокая награда.

                        Общая фотография со всеми победителями и призерами. Две команды Касперского, занявшие первое и второе места, — очень крутые и большие молодцы!

                        Вот наша трасса и калории, потраченные нашим фотографом.

                        Более 1500 фотографий и видео. Вся трасса вместе с нами. Спасибо тебе, фотограф Олеся!

                        Вызываем ИТ-сообщество на следующую гонку! Уважаемые ИТ-партнеры и конкуренты, давайте в следующем сезоне соберем представительный состав участников и сразимся в честной спортивной мегабитве гигантов! Но помните, сражение с нами не будет ни для кого легким!

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


                        И да, мы ищем героев, которые сильны во всех смыслах, в том числе в ИТ. Если вам интересно работать в команде Егора, и у вас есть опыт, откликнитесь, пожалуйста, на эти вакансии
                        Original source: habrahabr.ru (comments, light).

                        https://habrahabr.ru/post/338488/


                        Метки:  

                        Конференция VMworld 2017 Europe. День 2, 3

                        Пятница, 22 Сентября 2017 г. 15:47 + в цитатник
                        omnimod сегодня в 15:47 Администрирование

                        Конференция VMworld 2017 Europe. День 2, 3

                          Продолжаем рассказывать о самом интересном на VMworld 2017 Europe. Если вы пропустили предыдущие репортажи, то можете прочитать сначала про нулевой и первый день конференции.



                          Анонсы VMware на конференции


                          Перед тем, как перейти к описанию выставки партнерских решений, я хочу перечислить основные анонсы, которые были сделаны во время конференции VMworld US и Europe.

                          VMware Workstation 14


                          Выпуск VMware Workstation 14 и VMware Workstation Player 14 — клиентских гипервизоров, устанавливающихся поверх ОС Windows или Linux.



                          Среди новых функций:

                          • поддержка актуальных версий гостевых ОС: Windows 10 Creator Update, Ubuntu 17.04, Fedora 26;
                          • поддержка Secure Boot для гостевых ОС;
                          • поддержка Virtualization Based Security (VBS) в Windows 10;
                          • поддержка виртуальных NVMe-накопителей для ВМ;
                          • расширенные сетевые настройки, позволяющие ограничивать полосу пропускания, эмулировать задержки и потери пакетов при передаче данных по сети;
                          • возможность развертывания VMware vCenter Server Appliance (VCSA) в виртуальной машине Workstation;
                          • расширенные возможности по управлению хостами ESXi.
                          • Также были анонсированы VMware Fusion 10 и Fusion 10 Pro — клиентские гипервизоры для MAC OS X.

                          End-of-life VMware vCenter Server для Windows


                          Объявлено, что следующая версия vSphere (вероятно, vSphere 7.0) будет последней с поддержкой VMware vCenter Server на платформе Windows. Решение правильное и ожидаемое, потому что функциональные возможности VCSA и vCenter Server для Windows сравнялись еще в vSphere 6.0, а в vSphere 6.5 в VCSA появились дополнительные возможности вроде встроенного механизма vCenter High Availability, встроенного бэкапа и модуля обновлений vSphere Update Manager.

                          Также следующая версия vSphere станет последней для клиента vSphere Web Client (на базе Flash), который будет заменен на vSphere Client (на HTML5).

                          Последним в списке на выбывание стоит vmkLinux — компонент, обеспечивающий совместимость ESXi с драйверами Linux. Начиная с vSphere 5.0, разработчики стали предоставлять так называемые нативные драйверы, обеспечивающие лучшую производительность и стабильность работы по сравнению с Linux-драйверами. Отказ от vmkLinux потенциально означает сокращение HCL-списка поддерживаемых серверов и периферийных устройств и невозможность запустить ESXi на вашем любимом whitebox-сервере с сетевыми адаптерами Realtek.

                          VMware Integrated OpenStack 4.0


                          Новый релиз VMware Integrated OpenStack 4.0.



                          VIO — это дистрибутив OpenStack, разрабатываемый и поддерживаемый VMware. VIO 4.0 базируется на релизе OpenStack Ocata и предлагает следующие нововведения:

                          • поддержка развертывания контейнеров;
                          • интеграция с порталом самообслуживания VMware vRealize Automation, позволяющая управлять инсталляцией OpenStack прямо из интерфейса vRA, а также создавать шаблоны (blueprints) vRA, содержащие объекты OpenStack;
                          • возможность добавить под управление VIO несколько серверов vCenter Server для наращивания вычислительных ресурсов облака;
                          • дополнительные возможности, например, увеличение процессоров или добавления памяти без выключения ВМ, функции Firewall as a Service и многое другое.

                          К сожалению, VIO 3.1 стала последней версией, которая бесплатно предоставлялась заказчикам, купившим vSphere Enterprise Plus. Начиная с VIO 4.0 нужно приобретать лицензии и SnS-поддержку на каждый сокет серверов виртуализации, которые будут управляться VIO.

                          VMware AppDefense


                          VMware представила новый продукт для обеспечения безопасности виртуальных сред — AppDefense.

                          AppDefense позволяет анализировать поведение приложений (процессов), запущенных в гостевой ОС внутри ВМ, и на основании полученных данных задавать некий baseline — нормальное поведение для ВМ. В случае отклонения от линии поведения, например, при действиях зловредного ПО, AppDefense может автоматически применить к ВМ одно из следующих действий:

                          • заблокировать или ограничить сетевую активность подозрительного процесса при помощи VMware NSX,
                          • выключить или приостановить ВМ,
                          • создать снапшот для дальнейшего изучения, а также уведомить администратора безопасности.

                          AppDefense может интегрироваться со сторонними продуктами ИБ, такими как: IBM Security, RSA, Carbon Black, SecureWorks, расширяющими функциональные возможности AppDefense по проверке и выполнению различных действий.

                          VMware vRealize Network Insight 3.5


                          Вышла новая версия vRNI 3.5 — продукта для решения проблем с виртуальной и физической сетевыми инфраструктурами. vRNI собирает информацию о настройках с виртуальных и физических коммутаторов, маршрутизаторов и межсетевых экранов и предоставляет ее в удобном наглядном формате, позволяющем упростить обнаружение проблем в работе сети. Например, можно проследить весь путь прохождения пакета от сетевого интерфейса ВМ – через логический коммутатор NSX, аплинк сервера ESXi, порт коммутатора Cisco Nexus, маршрутизатор Juniper, МСЭ Check Point – до порта физического сервера.



                          В новой версии vRNI появились следующие возможности: проверка сетевой инфраструктуры на соответствие требованиям стандарта PCI DSS, поддержка сбора данных с NSX через механизм IPFIX, визуализация трафика между ВМ, проходящего через маршрутизаторы с настроенным ECMP, сбор данных из дополнительных сторонних источников: Check Point Firewall, HP One View, Brocade MLX.

                          vSphere Integrated Containers


                          VMware обновила VIC до версии 1.2, которая позволяет запускать контейнеры прямо на серверах VMware ESXi.



                          Главное отличие подхода VMware от других менеджеров контейнеров заключается в том, что каждый контейнер запускается в отдельном экземпляре ВМ. Таким образом, администраторы получают возможность управлять контейнерами так же, как и ВМ, используя выгоды платформы виртуализации вроде лучшей изоляции, возможности перемещать контейнеры с хоста на хост, контролировать сетевое взаимодействие контейнеров при помощи VMware NSX, мониторить контейнеры с помощью vRealize Operations Manager и многое другое. Для снижения накладных расходов на запуск контейнеров используется технология Instant Clone, позволяющая создавать копии работающих ВМ в реальном времени, используя механизмы Transparent Pages Sharing и Linked Clones для экономии ОЗУ и дискового пространства.

                          Среди нововведений:

                          • поддержка аутентификации и авторизации пользователей, включая интеграцию SSO с сервером VMware Platform Service Controller;
                          • интеграция интерфейса управления VIC Registry и портала управления;
                          • возможность изменять параметры (количество процессоров, объем ОЗУ) виртуальных хостов, на которых запускаются контейнеры (Virtual Container Host) без пересоздания;
                          • полноценная поддержка Docker Engine, поддержка команд commit, diff, stats, cp в CLI.

                          vRealize LifeCycle Manager


                          VMware анонсировала новую версию vRealize Suite 2017, в состав которой вошли такие продукты, как vRealize Automation 7.3, vRealize Business 7.3, vRealize Operationss 6.6, а также новый продукт — vRealize LifeCycle Manager.

                          Те, кто имел опыт развертывания vRealize Suite, знают, что это совсем непросто. vRealize LifeCycle Manager решает проблемы развертывания и обновления вышеуказанных продуктов практически одним нажатием кнопки, а также позволяет выполнять проверку существующих инсталляций на соответствие лучшим практикам вендора.

                          Выставка Solutions Exchange


                          Во время конференции по выставке устраивались экскурсии для посетителей из России и стран СНГ. Евгений Гарбузов (на фотографии слева), системный инженер из российского отделения VMware, показывал наиболее интересные стенды и отвечал на всевозможные каверзные вопросы.



                          Стенд NVIDIA


                          На стенде компании NVIDIA демонстрировались ускорители поколений Maxwell и Pascal.



                          В середине августа компания объявила об обновлении решения GRID до версии 4.0. Новый GRID позволяет использовать ресурсы графического адаптера физического сервера для ускорения обработки графики или ресурсоемких вычислений внутри виртуальных машин.

                          Помимо обработки графики, ускорители также могут использоваться для снижения нагрузки на центральный процессор при воспроизведении видео формата H.264 или кодировании изображения для протокола VMware Blast в сценариях VDI, что позволит повысить плотность размещения ВМ на одном физическом сервере.



                          В новой версии GRID стали поддерживаться ускорители с архитектурой Pascal: P4, P6, P40 и P100.

                          Ускоритель Tesla P40, выполненный в форм-факторе полноразмерного PCI-E-адаптера, на 50% увеличивает плотность размещения пользователей при использовании профилей с 1 Гб видеопамяти по сравнению с ускорителем предыдущего поколения Maxwell (M60). Для блейд-серверов подойдет ускоритель P6.

                          Сравнение основных параметров ускорителей текущего и предыдущего поколений приведены в таблице.



                          Ускоритель Tesla P100 предназначен не столько для обработки графики, сколько для ускорения математических вычислений (CUDA, OpenCL).

                          Но вместе с бочкой мёда NVIDIA подготовила и небольшую ложку дегтя. Для работы vSGA, vDGA или vGPU требуется приобретение дополнительных лицензий GRID в зависимости от используемого режима и профиля нагрузки. И если раньше сервер не проверял наличие необходимых лицензий, то отныне при отсутствии лицензии ускоритель откажется работать и переключит ВМ на использование виртуального GPU.

                          Стенд-грузовик AMD


                          Компании AMD и Dell организовали совместный стенд внутри большого трейлера, на котором были представлены функциональные возможности новых процессоров EPYC и серверов на их основе.



                          На экранах демонстрировались в различных сценариях нагрузки: виртуализация, СУБД, HPC-вычисления. На отдельных профилях нагрузки преимущество новых EPYC над процессорами Intel может достигать 30%. Основные отличия процессоров AMD и Intel приведены в таблице.



                          Также на стенде был представлен новый 2U-сервер Dell PowerEdge R7415 (посмотреть его вблизи можно было только после подписания NDA), с сокетами SR3 (они же TR4). Конструктивно сервер похож на своих родственников R730xd и R740, однако имеет ряд конструктивных особенностей, которые пока нельзя разглашать. Выход серверов Dell с процессорами AMD EPYC ожидается в декабре-январе.



                          Стенд Pure Storage




                          На стенде нового партнера «Инфосистемы Джет», компании Pure Storage (ведущего производителя All-Flash систем хранения по мнению аналитического агентства Gartner) демонстрировалась модель FlashArray //m20. СХД Pure Storage обладают всеми возможностями, за которые заказчики любят AFA-массивы, при этом все функции включены в базовую стоимость массива и не требуют приобретения дополнительных лицензий или пакетов расширений. Почитать подробнее о FlashArray //m20 можно в наших публикациях: 1, 2.



                          Что выделяет массивы Pure Storage на фоне конкурирующих решений, так это сервис EverGreen. Заказчикам предлагается принципиально новая модель владения продуктом – «подписка на инновации». В период сервисного контракта все новые программные функции массива предоставляются клиентам бесплатно, а каждые три года производитель заменяет устаревшие контроллеры на современные. Любые модернизации, в том числе переход на следующие поколения контроллеров, производятся «на ходу» и не требуют повторного приобретения емкости. Кроме того, при продаже массива Pure Storage проводит обследование и гарантирует определенный уровень экономии на хранении данных (data reduction) за счет использования компрессии и дедупликации; в случае невозможности достичь гарантированных показателей, вендор бесплатно увеличивает емкость массива.



                          Стенд Infinidat


                          Мое внимание привлек стенд другого производителя систем хранения — компании Infinidat. Это детище Моше Янаи (Moshe Yanai), который в 1990-x годах участвовал в разработке массивов EMC Symmetrix, а также основал компанию XIV, производившую одноименные массивы и позже купленную IBM.

                          На стенде демонстрировались СХД InfiniBox, которые относятся к классу унифицированных СХД, поддерживающих протоколы Fibre Channel, FICON, iSCSI и NFS, и рассчитанных на хранение большого объема данных (от 115 Тб в младшей модели F1000, до 2,7+ Пб в старшей модели F6000 без учета компрессии) с крайне высоким уровнем доступности в 99,99999% (не более 3,15 секунд простоя в год).



                          СХД поставляется уже собранной и скоммутированной в стойке. Архитектура строится на базе трех серверов-контроллеров, подключающихся друг к другу через сеть Infiniband, а также дисковых полок высокой плотности, содержащих диски NL-SAS. Высокий уровень производительности (от 300 тысяч IOPS в младшей модели до 1 миллиона IOPS – в старшей) достигается за счет многоуровневого кэширования на flash-накопителях и в ОЗУ контроллеров, а также за счет анализа характера ввода-вывода и предиктивного помещения данных в кэш. СХД поддерживает создание снапшотов, репликацию данных, in-line-компрессию, интегрируется с интерфейсом управления VMware vSphere Client и может восстанавливать отдельные виртуальные машины VMware из снапшотов логических томов без использования системы резервного копирования.



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



                          Стенд Veeam




                          В этом году Veeam выпустила версию 2.0 агентского бэкапа Veeam Agent для Windows и Linux, позволяющего выполнять резервное копирование и восстановление не только виртуальных машин, но и физических рабочих станций и серверов. Всего доступно три редакции продукта: Free, Workstation и Server. Их отличия приведены в таблице.



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

                          Также Veeam анонсировал новую версию флагманского продукта — Veeam Backup & Replication 10. VBR является лидирующим решением по резервному копированию и восстановлению виртуальных инфраструктур на базе VMware vSphere и Microsoft Hyper-V.

                          Основные нововведения:

                          1. Поддержка функции Veeam Continuous Data Protection, использующая технологию vSphere API for I/O filtering, которая позволяет выполнять практически синхронную репликацию данных виртуальных машин на резервный физический сервер или в хранилище. Практически все современные средства репликации данных для виртуальных сред используют асинхронный метод передачи данных и механизм создания снапшотов VMware. У этого подхода есть ряд недостатков. Во-первых, высокие показатели RPO, которые достигают 5 и более минут, что может быть неприемлемо для высококритичных ВМ. Во-вторых, использование снапшотов VMware приводит к снижению производительности ВМ. С помощью CDP можно в реальном времени транслировать все операции записи на специальный CDP прокси-сервер, который будет их аккумулировать и кэшировать, а затем передавать на целевой сервер. Такой подход позволит восстановить ВМ на любой интервал времени — от нескольких секунд до пары часов сбоя. Для обеспечения консистентности данных внутри ВМ могут использоваться VSS снапшоты.



                          2. Полная поддержка агентов Veeam Backup Agent. Сервер VBR позволяет централизованно устанавливать агенты на рабочие станции и серверы, настраивать политику резервного копирования и восстанавливать данные. Поддерживаются динамические группы на основе объектов Active Directory, позволяющие выполнять установку агентов и резервное копирование компьютеров, которые находятся в определенном организационном подразделении или входят в определенную группу.
                          3. Возможность резервного копирования сетевых папок. Функция, которую давно ждали пользователи, поскольку во многих инфраструктурах для хранения файлов используются выделенные NAS-устройства. VBR может хранить историю всех измененных файлов, а также удаленные файлы за определенный промежуток времени.
                          4. Архивные хранилища. VBR может автоматически перемещать или копировать старые резервные копии в архивные хранилища для экономии дискового пространства или обеспечения дополнительной сохранности копий. Администраторы могут настраивать разные параметры архивирования – например, перемещать бэкапы старше X дней, или перемещать бэкапы только в случае, когда основное хранилище будет заполнено более чем на X процентов, перемещать только еженедельные копии и так далее. В качестве архивных хранилищ могут выступать объектные хранилища Swift, Amazon S3, Amazon Glacier или Microsoft Azure Blob.
                          5. Расширение ролевой модели. VBR может просматривать права, которые были назначены пользователям в vSphere, и отображать только те ВМ для резервного копирования и восстановления, на которые у пользователей есть права.
                          6. Поддержка RMAN плагина для консистентного резервного копирования БД Oracle.
                          7. Выход VBR 10 ожидается зимой этого года.

                          Стенд Nutanix


                          Компания Nutanix, один из лидеров рынка HCI-решений, в этом году удостоила посетителей довольно скромным стендом. Оно и понятно, вендор в этом году проводит Nutanix .NEXT во Франции, поэтому все основные анонсы он припас для своей конференции. Тем не менее, кое-что интересное удалось узнать.

                          Во-первых, компания готовится к выпуску собственного средства оркестрации и автоматизации Nutanix CALM, на базе решений стартапа Calm.io, купленного в прошлом году.



                          Nutanix CALM предоставляет собой портал самообслуживания, при помощи которого пользователи могут запустить выполнения различных действий — от создания новой ВМ или контейнера в on-premise инфраструктуре или облаке до развертывания многозвенного приложения, включающего в себя серверы БД, серверы приложений и балансировщики. Используя простой и наглядный графический интерфейс, администраторы могут самостоятельно создавать новые шаблоны, выполняющие те или иные операции.

                          Во-вторых, нас ждёт новая версия гиперконвергентной платформы, построенная на серверах с процессорами Intel Xeon Scalable, а также новая версия ПО Nutanix, поддерживающая следующие функции:

                          • Near-Sync Replication — новый механизм репликации данных между системами, расположенными на разных площадках, с использованием легких снапшотов (LWS — lightweight snapshots), который позволит уменьшить интервал асинхронной репликации отдельных ВМ и гарантировать RPO вплоть до 1 минуты.
                          • Встроенное программное шифрование данных без необходимости использования Self-encrypted drives.
                          • Поддержка режима проброса графических адаптеров vGPU для собственного гипервизора AHV.
                          • Поддержка гипервизора Microsoft Hyper-V 2016.
                          • Tech preview-версия встроенного распределенного межсетевого экрана, позволяющего фильтровать трафик между ВМ (микросегментация).
                          • И многое другое.

                          Стенд QNAP


                          У большинства пользователей, знакомых с продукцией QNAP, этот вендор ассоциируется с NAS-устройствами, предназначенными для сегмента SOHO (small office, home office). Тем не менее, в каталоге продукции присутствуют и весьма интересные мультипротокольные СХД начального уровня. Например, QNAP ES1640dc v2.



                          На СХД установлена операционная система QES (на базе FreeBSD), в качестве файловой системы используется ZFS. СХД поддерживает протоколы доступа к данным CIFS/SMB2/SMB3, NFS v3/NFS v4, FTP, FTPS, TFTP и iSCSI, интегрируется с виртуальной инфраструктурой, включая поддержку VAAI, и имеет агент для интеграции с VMware SRM.

                          Аппаратные характеристики ES1640dc v2:

                          • два контроллера на базе процессоров Intel Xeon E5-2400 v2, работающие в режиме active-active или active-passive.
                          • до 64 Гб ОЗУ на контроллер и до 16 Гб кэш-памяти на запись с батареей для защиты от пропадания питания.
                          • 16 отсеков для установки 12G SAS-накопителей с возможностью расширения путем подключения дополнительных корзин по интерфейсам HD-SAS.
                          • 4 порта SFP+ 10G Ethernet и 2 порта RJ-45 1G Ethernet на каждый контроллер + PCI-E слоты расширения для установки дополнительных адаптеров ввода-вывода.
                          • два блока питания с поддержкой горячей замены.

                          Приятный бонус: QNAP не обязывает клиентов приобретать «собственные» комплектующие, а вместо этого публикует HCL-списки совместимых дисков и SSD-накопителей производства Seagate, HGST, Toshiba, Micron, комплектуя СХД необходимыми салазками для их установки.



                          С учетом функциональных возможностей и невысокой цены, эта модель может стать неплохой альтернативой популярным СХД начального уровня вроде HPE MSA 1040/2040 или NetApp E2700.

                          Стенд Atrust


                          Компания Atrust, один из производителей тонких клиентов для подключения к терминальным фермам и VDI-инфраструктурам, предлагает широкий модельный ряд: от типовых устройств с ОС Windows Embedded или Linux до нулевых клиентов на базе процессоров Teradici, а также тонких клиентов, выполненных в форм-факторе моноблоков и ноутбуков.



                          На стенде Atrust демонстрировался новый продукт — ПО Atrust P2T (PC to Thin Client). Функционально P2T идентичен Atrust OS, устанавливаемой на ТК, и представляет собой оптимизированный дистрибутив Linux, включающий набор драйверов, основные клиенты для удаленного подключения (VMware Horizon Client, Citrix Receiver, Microsoft RDP), а также агент для интеграции с сервером Atrust Device Manager, позволяющий централизованно управлять устройствами, распространять настройки, устанавливать обновления ОС и мониторить устройства.

                          Это решение может быть интересно заказчикам, планирующих перейти на VDI, имеющим парк функционирующих компьютеров и не готовых платить за новые тонкие клиенты. С помощью P2T можно превратить имеющиеся компьютеры в тонкие клиенты, установив ОС на жесткий диск или загрузившись с внешнего USB-носителя.

                          Стенд компании Nakivo


                          Последним решением, о котором я хочу рассказать, является ПО для резервного копирования виртуальных сред — Nakivo Backup & Replication.

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

                          Nakivo Backup & Replication поддерживает большинство функций, которые можно ожидать от СРК виртуальных сред начального уровня.

                          • Возможность резервного копирования и восстановления ВМ, размещенных на платформах виртуализации VMware vSphere, Microsoft Hyper-V и облаке Amazon AWS.
                          • Поддержка LAN-Free бекапов ВМ (режимы Hot-Add и Direct SAN Backup).
                          • Консистентный бекап и гранулярное восстановление данных внутри ВМ: файлов, почтовых ящиков Microsoft Exchange, БД Microsoft SQL и объектов Active Directory.
                          • Функция Instant recover, позволяющая запустить ВМ прямо из бекапа, подключив его в виде логического устройства к серверу виртуализации по протоколу iSCSI. Запущенную таким образом ВМ можно восстановить за секунды и затем перенести в постоянное хранилище, используя функцию Storage vMotion.
                          • СРК управляется через простой и интуитивно понятный HTML5 веб-интерфейс.
                          • Поддержка асинхронной репликации ВМ на серверы на другой площадке для сценариев Disaster Recovery.



                          Nakivo также обладает уникальной функцией, которая отсутствует в других решениях СРК: возможностью установки напрямую в NAS-хранилища производства QNAP, Synology, ASYSTOR или WD, что позволяет организовать экономичное решение по резервному копированию и хранению бэкапов для небольших офисов и филиалов.

                          Хоть Nakivo Backup & Replication и не обладает полным набором функциональных возможностей других СРК, вроде Veeam Backup & Replication, Veritas Backup Exec или прочих, решение ориентировано на SMB-сегмент и привлекает своей невысокой ценой.

                          Что еще было интересного


                          На стенде компании Rubrik, производителя программно-аппаратного решения для резервного копирования, устроили сессию раздачи книг VMware vSphere 6.5 Host Resources Deep Dive с автографами авторов — Фрэнка Деннемана (Frank Denneman) и Нилса Хагорта (Niels Hagoort). Хотя я уже купил эту книгу в электронном виде (и она стоит каждого цента, настоятельно рекомендую для прочтения всем администраторам vSphere), я не преминул воспользоваться возможностью взять бумажный экземпляр.

                          Заключение


                          На этом наш рассказ о конференции VMware 2017 Europe подходит к концу. Я надеюсь, что для кого-то эта информация будет полезной и интересной.

                          А пока у нас целый год впереди, чтобы на практике попробовать все те продукты и решения, что были продемонстрированы на конференции, и сделать наши виртуальные инфраструктуры еще более функциональными, производительными и высокодоступными. Спасибо за внимание, до новых встреч!

                          Андрей Коновалов, начальник отдела виртуализации компании «Инфосистемы Джет»
                          Original source: habrahabr.ru (comments, light).

                          https://habrahabr.ru/post/338496/


                          Метки:  

                          Поиск сообщений в rss_rss_hh_new
                          Страницы: 1437 ... 1156 1155 [1154] 1153 1152 ..
                          .. 1 Календарь