Имя: Пароль:
1C
1С v8
Почему фоновые задачи так тормозят?
,
0 Chai Nic
 
03.12.13
13:08
Пробую перевести файловую БП3 на клиент-сервер. В клиент-сервере, как известно, для выполнения стандартных отчетов и регламентных процедур закрытия месяца _безальтернативно_ используется механизм фоновых заданий. С одной стороны, это плюс - позволяет во время формирования отчета пользователю делать что-то еще, но есть одно НО - огромный оверхед по времени выполнения при использовании этого механизма.

Так, оборотно-сальдовая ведомость, которая формируется за секунду в файловом режиме, в режиме отложенного выполнения заданий формируется порядка 8 секунд. И проблема тут не собственно в клиент-сервере. Попробовал "обмануть" конфигурацию, заставив её подумать, что она работает на файловой версии (добавил в начало функции ОбщегоНазначения.ИнформационнаяБазаФайловая() строчку Возврат Истина;) - в этом случае отчет выполняется на sql-базе так же быстро, как и в файловой.

Вопрос. Почему такие задержки при использовании фоновых заданий?
1 Chai Nic
 
03.12.13
13:26
Попробовал в виде эксперимента подкрутить в конфигурации тайминги опроса фонового задания, в ДлительныеОперацииКлиент.ИнициализироватьПараметрыОбработчикаОжидания() и в ДлительныеОперации.ЗапуститьВыполнениеВФоне() указал 0.1 секунду без последующего увеличения - резко выросло количество вызовов сервера, однако скорость формирования не изменилась... странно как-то. На что тратится время?
2 МихаилМ
 
03.12.13
13:26
что собщает замер производительности ?
3 France
 
03.12.13
13:27
(1) время тратится на ожидание выделения процессорного времени ОС..
4 Chai Nic
 
03.12.13
13:29
(3) Процессорного времени ОС в избытке и на сервере и на клиенте. Или вы имеете в виду, что 1с запускает для каждого фонового задания отдельный процесс? Неужели так всё плохо?
5 Chai Nic
 
03.12.13
13:33
(2) Замер производительности по серверному коду не могу пока сделать - на сервере не включена отладка, а перезапускать его в рабочее время нельзя. А в отладчике, подключенном к клиенту ничего интересного - там доли секунды тратятся...
6 banco
 
03.12.13
13:35
(0) сколько процессов на сервере 1С?
7 Chai Nic
 
03.12.13
13:37
(6) 8 рабочих процессов (по количеству ядер). Загруженность сервера близка к нулю.
8 banco
 
03.12.13
13:37
(7) оставь 1 процесс
9 Chai Nic
 
03.12.13
13:40
(8) Сервер 1с 32-битный, один процесс может упереться в нехватку адресного пространства... Но в виде эксперимента попробую вечером. Сомневаюсь, что это как-то повлияет.
10 banco
 
03.12.13
13:42
(9) да, плохо что 32-битный, но, помню, у одного клиента помогло
11 Живой Ископаемый
 
03.12.13
13:44
а если процесс фоновых заданий вынести в отдельный менеджер?
12 Chai Nic
 
03.12.13
13:47
(10) Попробовал всем процессам, кроме одного, поставить "Не использовать", пока не удаляя их - скорость инициализации фоновых задач резко выросла. Теперь 2 секунды вместо 8. Спасибо за подсказку.. не ожидал от 1с такой подлянки.
13 kiruha
 
03.12.13
14:01
Поставь разрешить отладку на сервере
И в конфигураторе Отладка Подключение автоматическое подключение фоновые
Сделай замер
Но вообще не понятно зачем нужно ускорять фоновые ?
14 kiruha
 
03.12.13
14:02
(12)
Верни назад, не нужно ускорять иниц фоновых
15 Живой Ископаемый
 
03.12.13
14:02
он же написал зачем, чтобы не ждать оборотку по 8 секунд, а ждать по 2.
16 H A D G E H O G s
 
03.12.13
14:04
Ну может 1С решает, какому процессу отдать выполнение фонового.
17 kiruha
 
03.12.13
14:04
Ну ну удачи ему в его экспериментах
Про параллельность и приоритеты я так понимаю пофиг
18 Chai Nic
 
03.12.13
14:08
(17) Если бухгалтер запустил формироваться ОСВ - он будет ждать, пока она сформируется.. ему параллельность нафиг не нужна, ему важнее реактивность интерфейса
19 kiruha
 
03.12.13
14:10
(18)
А зачем в фоне делаешь ?
20 Chai Nic
 
03.12.13
14:12
(19) Мне незачем. Просто 1с выбора не оставляет: любой стандартный отчет БП3 формируется в фоновом режиме, если конфигурация запущена на клиент-сервере. Так задумано в 1с.
21 Живой Ископаемый
 
03.12.13
14:12
писатель
22 kiruha
 
03.12.13
14:13
(20)
И там одну строку переписать ?
23 Chai Nic
 
03.12.13
14:14
(22) И это будет уже не типовая, а так да..
24 Chai Nic
 
03.12.13
14:16
(16) "Ну может 1С решает, какому процессу отдать выполнение фонового"
Уж слишком она задумчива в этом самом месте. Чтобы выбрать один из 8 - тратит не менее 5 секунд. Она на счетах что ли считает?)
25 Fragster
 
модератор
03.12.13
14:17
а сколько запускается пустое фоновое задание?
26 Fragster
 
модератор
03.12.13
14:17
просто тупо через менеджер фоновых + ожидать завершения на пустую функцию?
27 kiruha
 
03.12.13
14:34
Или отчет на СКД самый примитивный типа
Выбрать элемент справочника с отбором по коду
28 Chai Nic
 
03.12.13
14:37
(25) Попробовал с предопределенным заданием "Обмен сообщениями по учетным записям документооборота", поскольку сообщений никаких нет - на одном РП выполняется моментально (менее секунды), на более чем одном (проверял от 2 до 12) - задержка 8 секунд.

В общем вывод такой - тормоза при использовании нескольких рабочих процессов, причем нет ощутимой зависимости от количества РП больше одного.
29 Никола_
Питерский
 
03.12.13
14:40
(28) Так уже давно грят что чем меньше процессов тем лучше ?
30 Chai Nic
 
03.12.13
14:45
(29) Спорный вопрос. Как один рпхост сможет использовать возможности многопроцессорного сервера?
31 Fragster
 
модератор
03.12.13
14:45
(30) может
32 kiruha
 
03.12.13
14:52
(28)
Осталось проверить то же самое для 100 юзверей
33 Chai Nic
 
03.12.13
14:57
(32) В любом случае баг с тормозами запуска ФЗ при нескольких РП остается багом. 8 секунд плюсом на запуск - они не лишние при сколь угодно большом количестве пользователей..
34 kiruha
 
03.12.13
15:07
(33)
Вот представь - что кроме того что выполнить задачу нужно породить задание, определить нагрузку подчиненных, расчитать приоритеты, выделить ресурсы, согласовать параллельное получение данных и т.д. и только потом выполнить задачу

Что быстрее ?
35 Chai Nic
 
03.12.13
15:16
(34) Это лишь слова. А на деле - задача сводится к выбору одного наименее нагруженного процесса. Тратить на это несколько реальных секунд на современном сервере по меньшей мере неразумно.
36 Chai Nic
 
03.12.13
15:18
Кстати, говорят в 8.3 вообще убрали возможность добавлять рабочие процессы.. видать неспроста
37 Живой Ископаемый
 
03.12.13
15:20
неявно - можно. можно сказать что два пользователя на один рабочий процес, или 1 база
38 Никола_
Питерский
 
03.12.13
15:20
(30) Ну исходников 1Сного сервера мы не имеем и по этому как они там реализовали работу всей этой кухни понятия не имею !

Но 1С любит экспериментировать, это факт !
39 kiruha
 
03.12.13
15:27
(35)
Как написали ниже кухни мы не знаем.
Может там идет инициализация которая потом исчезнет.
Опять же большое количество данных между процесссами перекидывается не мгновенно
40 kiruha
 
03.12.13
15:28
Вообщем проведи тест на 100 чел для вывода (33)
41 Леха Дум
 
03.12.13
15:30
багоискаители :), там обработчик ожидания опрашивает фоновые задания на предмет выполнение с определенной периодичностью :)
42 Fragster
 
модератор
03.12.13
15:34
(41) я у автора спросил за что-то типа

Задание = ФоновыеЗадания.Выполнить("ФоновыеФункции.ФоноваяКалибровка");
Задание.ОжидатьЗавершения();

и обработчик ожидания тут не причем
43 Жан Пердежон
 
03.12.13
15:36
(41) лишь бы ляпнуть
44 Леха Дум
 
03.12.13
15:45
(43) модуль ДлительныеОперации

ВЫЗОВ: в общей форме "ФормаОтчета", процедура

Функция ОтчетСкомпоноватьРезультатНаСервере(ВФоновомЗадании)
...........
...........

Попытка
            РезультатФоновогоЗадания = ДлительныеОперации.ЗапуститьВыполнениеВФоне(
                УникальныйИдентификатор,
                "ВариантыОтчетов.СформироватьОтчет",
                ПараметрыФормированияОтчета,
                НСтр("ru = 'Варианты отчетов: Формирование отчета'")
            );
            
            РезультатЗапуска.ЗаданиеВыполнено  = РезультатФоновогоЗадания.ЗаданиеВыполнено;
            РезультатЗапуска.ВызваноИсключение = Ложь;
            
            ФоновоеЗаданиеИдентификатор  = РезультатФоновогоЗадания.ИдентификаторЗадания;
            ФоновоеЗаданиеАдресХранилища = РезультатФоновогоЗадания.АдресХранилища;
        Исключение


ПРОВЕРКА:

ПараметрыЗадания.Добавить(Неопределено);
    Задание = ФоновыеЗадания.Выполнить("ОбщегоНазначения.ВыполнитьБезопасно", ПараметрыЗадания,, НаименованиеЗадания);
    Попытка
        Задание.ОжидатьЗавершения(ВремяОжидания);
    Исключение        
        // Специальная обработка не требуется, возможно исключение вызвано истечением времени ожидания.
    КонецПопытки;

(43) иногда лучше промолчать
45 Жан Пердежон
 
03.12.13
15:58
(44) ну скопипасти сюда пару модулей, их ведь ни у кого нет и никто, кроме тебя ни разу не видел. Что сказать-то хотел?
46 Chai Nic
 
03.12.13
16:19
(44) Еще в (1) я завышенные тайминги в конфигурации исключил, тем более, что налицо зависимость именно от количества рабочих процессов..
47 Леха Дум
 
03.12.13
16:32
(46) время действительно может тратиться на системный опрос всех процессов, где выполняются фоновые задания. Кроме того, похоже системе приходится собирать информацию из данных по уже отработанным фоновым заданиям - тоже время.

(45) всю ветку от корки до корки не прочитаешь
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан