Сеанс.cpuTimeAll

Свойства · cpuTimeAll

Тип: Число. Содержит время, которое затрачено процессором на обработку серверных вызовов с момента начала сеанса, в миллисекундах.

Полное описание, параметры и ограничения

Сеанс.cpuTimeAll (ISessionInfo.cpuTimeAll)

Сеанс (ISessionInfo)

cpuTimeAll (cpuTimeAll)

Доступен, начиная с версии 8.3.13.

Использование:
Только чтение.
Описание:
Тип: Число.
Содержит время, которое затрачено процессором на обработку серверных вызовов с момента начала сеанса, в миллисекундах.
Доступность:

Интеграция.
Изменение свойства на клиенте может потребовать обращения к серверу.

Использование в версии:

Доступен, начиная с версии 8.3.13.

Методическая информация

Практические примеры

Перевести времена в секунды без ошибки в тысячу раз

durationAll уже содержит секунды, а CPU и остальные выбранные duration содержат миллисекунды.

Где и как запускать

Учебная база: создайте серверный общий модуль УчебныеЗадачи (флаг Сервер). Код без директив вставьте в тело процедуры ВыполнитьПример() Экспорт. Вызовите её из серверного обработчика команды учебной обработки. Не запускайте в рабочей базе.

Подготовка

  1. Только собственный изолированный тестовый кластер на Windows. Зарегистрированная в нём база называется guide-owned-session-lab, имя конфигурации этой базы УчебнаяБазаСеансов. Запустите в ней отдельный учебный клиент.

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

  3. V85.COMConnector должен быть уже зарегистрирован администратором на Windows-сервере 1С с подходящей разрядностью. Пример ничего не устанавливает и не регистрирует. Если COM недоступен, остановитесь и обратитесь к администратору тестового стенда.

  4. В форме собственной обработки создайте строковые реквизиты КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора и числовой НомерСеанса. Для полей паролей включите режим пароля, не сохраняйте значения в настройках формы.

  5. КлючКластера вручную возьмите из собственной консоли администрирования: имя кластера|имя сервера|основной порт, например Учебный|localhost|1541. Это порт кластера, не порт агента 1540 и не порт RAS 1545.

  6. Серверный код связывается только с агентом 127.0.0.1:1540 на том Windows-сервере, где исполняется модуль. Вводятся существующие учебные учётные данные агента и кластера; права и пароли не изменяются.

  7. Клиентский обработчик приведён полностью: он очищает поля паролей до вызова сервера и не печатает аргументы или технический текст ошибок. Это не гарантирует безопасное стирание строк из памяти; учебные учётные данные не должны сохраняться в настройках формы.

  8. Сначала НомерСеанса = 0: получите только ID и AppID сеансов этой учебной базы. Затем введите один ID из этого списка. ID уникален внутри информационной базы, а не во всём кластере.

  9. Ниже дан законченный серверный пример получения настоящего объекта Сеанс, а не функция, требующая неизвестный ИсходныйОбъект. COM и кластер при подготовке руководства не запускались; требуется ручной запуск на собственном стенде.

&НаКлиенте
Процедура Прочитать(Команда)
    ЛокальныйПарольАгента = ПарольАгента;
    ЛокальныйПарольАдминистратора = ПарольАдминистратора;
    ПарольАгента = "";
    ПарольАдминистратора = "";
    Попытка
        Отчет = ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ЛокальныйПарольАгента, ИмяАдминистратора, ЛокальныйПарольАдминистратора, НомерСеанса);
    Исключение
        ЛокальныйПарольАгента = "";
        ЛокальныйПарольАдминистратора = "";
        Сообщить("Чтение не выполнено. Проверьте собственный стенд, COM, ключ кластера, права и наличие выбранного сеанса. Технические сведения проверяет администратор стенда.");
        Возврат;
    КонецПопытки;
    ЛокальныйПарольАгента = "";
    ЛокальныйПарольАдминистратора = "";
    Сообщить(Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ПрочитатьУчебныйСеанс(КлючКластера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора, НомерСеанса)
    Если ПустаяСтрока(КлючКластера) Тогда
        ВызватьИсключение "Укажите точный ключ собственного тестового кластера";
    КонецЕсли;
    Если НомерСеанса < 0 Или Цел(НомерСеанса) <> НомерСеанса Тогда
        ВызватьИсключение "Номер сеанса должен быть целым неотрицательным числом";
    КонецЕсли;
    Соединитель = Новый COMОбъект("V85.COMConnector");
    Агент = Соединитель.ConnectAgent("127.0.0.1:1540");
    Агент.AuthenticateAgent(ИмяАгента, ПарольАгента);
    ПодходящиеКластеры = Новый Массив;
    Для Каждого Кандидат Из Агент.GetClusters() Цикл
        КлючКандидата = СтрШаблон("%1|%2|%3", Кандидат.ClusterName, Кандидат.HostName, Кандидат.MainPort);
        Если НРег(КлючКандидата) = НРег(КлючКластера) Тогда
            ПодходящиеКластеры.Добавить(Кандидат);
        КонецЕсли;
    КонецЦикла;
    Если ПодходящиеКластеры.Количество() <> 1 Тогда
        ВызватьИсключение "Собственный тестовый кластер не выбран однозначно";
    КонецЕсли;
    Кластер = ПодходящиеКластеры.Получить(0);
    Агент.Authenticate(Кластер, ИмяАдминистратора, ПарольАдминистратора);
    УчебныеБазы = Новый Массив;
    Для Каждого ОписаниеБазы Из Агент.GetInfoBases(Кластер) Цикл
        Если ОписаниеБазы.Name = "guide-owned-session-lab" Тогда
            УчебныеБазы.Добавить(ОписаниеБазы);
        КонецЕсли;
    КонецЦикла;
    Если УчебныеБазы.Количество() <> 1 Тогда
        ВызватьИсключение "Зарегистрированная учебная база не выбрана однозначно";
    КонецЕсли;
    УчебнаяБаза = УчебныеБазы.Получить(0);
    УчебныеСеансы = Агент.GetInfoBaseSessions(Кластер, УчебнаяБаза);
    СтрокиОтчета = Новый Массив;
    НайденныеСеансы = Новый Массив;
    Для Каждого КандидатСеанс Из УчебныеСеансы Цикл
        Если НомерСеанса = 0 Тогда
            СтрокиОтчета.Добавить(СтрШаблон("Сеанс %1; приложение %2", КандидатСеанс.SessionID, КандидатСеанс.AppID));
        ИначеЕсли КандидатСеанс.SessionID = НомерСеанса Тогда
            НайденныеСеансы.Добавить(КандидатСеанс);
        КонецЕсли;
    КонецЦикла;
    Если НомерСеанса = 0 Тогда
        Если СтрокиОтчета.Количество() = 0 Тогда
            Возврат "В учебной базе сейчас нет сеансов";
        КонецЕсли;
        Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
    КонецЕсли;
    Если НайденныеСеансы.Количество() <> 1 Тогда
        ВызватьИсключение "Учебный сеанс исчез или не выбран однозначно; обновите список";
    КонецЕсли;
    Сеанс = НайденныеСеансы.Получить(0);
    Если Сеанс.InfoBase.Name <> "guide-owned-session-lab" Тогда
        ВызватьИсключение "Сеанс не принадлежит выбранной учебной базе";
    КонецЕсли;
    СтрокиОтчета.Добавить(СтрШаблон("CPU, с: всего=%1; текущий вызов=%2; последние 5 минут=%3", Сеанс.cpuTimeAll / 1000, Сеанс.cpuTimeCurrent / 1000, Сеанс.cpuTimeLast5Min / 1000));
    СтрокиОтчета.Добавить(СтрШаблон("Серверные вызовы с начала, с=%1", Сеанс.durationAll));
    СтрокиОтчета.Добавить(СтрШаблон("С начала, с: обращения к СУБД=%1; сервисные вызовы=%2", Сеанс.durationAllDBMS / 1000, Сеанс.durationAllService / 1000));
    СтрокиОтчета.Добавить(СтрШаблон("Текущие интервалы, с: серверный вызов=%1; запрос СУБД=%2; сервисный вызов=%3", Сеанс.durationCurrent / 1000, Сеанс.durationCurrentDBMS / 1000, Сеанс.durationCurrentService / 1000));
    СтрокиОтчета.Добавить(СтрШаблон("Последние 5 минут, с: серверные вызовы=%1; СУБД=%2; сервисы=%3", Сеанс.durationLast5Min / 1000, Сеанс.durationLast5MinDBMS / 1000, Сеанс.durationLast5MinService / 1000));
    Возврат СтрСоединить(СтрокиОтчета, Символы.ПС);
КонецФункции

Разбор по шагам

  1. По установленной справке durationAll — секунды. Делить его на 1000 нельзя. durationAllDBMS/durationAllService — миллисекунды, несмотря на соседнее имя.

  2. Все три cpuTime, три durationCurrent и три durationLast5Min здесь переводятся из миллисекунд в секунды.

  3. CPU время — использованный процессор, длительность — прошедший интервал вызовов. Это не одинаковые показатели.

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

  5. CPU, серверные, СУБД и сервисные интервалы не складываем: их смысл различается и интервалы могут перекрываться.

Как проверить результат

  1. В коде ровно один duration читается без /1000: durationAll; остальные одиннадцать показателей переведены согласно справке.

  2. Проверьте подписи: все выводимые времена в секундах. Значения реального сеанса не фиксированы заранее.

Ожидаемый результат

Получен отчёт о времени CPU и выполнения без ошибочного смешения секунд и миллисекунд.

На что обратить внимание

  1. Не называть cpuTimeAll загрузкой CPU в процентах: для процента нужен заданный интервал и отдельная методика.

  2. Нельзя вычитать суммы СУБД и сервисов из CPU и считать остаток временем кода 1С.

  3. Текущее время не является гарантированным временем завершения запроса.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.