• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

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

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Оптимизация 1С 7.7 + Sql + Citrix

  • Автор темы Hry
  • Дата начала
H

Hry

Блин, так и не смог старым ником зайти, пришлось по новой региться
Но это так о наболевшем :)

А вот может кто даст совет по теме

Есть такая система
Два сервака: на одном Citrix, на втором SQL, соединены гигабитом
Юзеры заходят в 1С через Citrix
В 4 разные базы
При этом в 3 базы одновременно до 20 подключений вместе взятых, а в четвертую 30-50
Ее SQL-ный файл около 6 гиг. (Три первые вместе меньше ее)

При работе с этой базой не очень понятная ситуация.

1С подтормаживает, некоторые документы проводятся по несколько минут
Но при этом "железо" совсем не нагружено
Процессоры на обоих серваках на 10-30%, сеть вообще на 3-5%

В чем беда? Где узкое место?

ЗЫ просьба не ругаться и объяснить как чайнику, так как я физику происходящего внутри 1С и SQL понимаю только в общих чертах
 
P

puh14

Последовательности в базе используются? Сколько документов одновременно проводится? Может какая-то добрая душа вывела предупреждения во время проведения документов? Выводило-ли народу сообщения типа "Истекло время ожидания" или "Ошибка захвата таблицы"? какая периодичность остатков?

у меня была похожая фигня когда проводили банковский документ - а он по 7 регистрам делал записи. Решили разбив банк на несколько документов.

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


плюс можешь профайлером посмотреть что на скуле происходит - там вроде и время исполнения выводит.
 
H

Hry

Последовательности в базе используются?
- не знаю, а как узнать?

Сколько документов одновременно проводится?
- могут пытаться и 30 одновременно

Выводило-ли народу сообщения типа "Истекло время ожидания" или "Ошибка захвата таблицы"?
- бывает

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


Но вообще-то вопрос не в том что впринципе медленно, а в том что медленно, но железо при этом не загружено
 
P

puh14

Последовательности в базе используются?
- не знаю, а как узнать?

Выводило-ли народу сообщения типа "Истекло время ожидания" или "Ошибка захвата таблицы"?
- бывает


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

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

А теперь фокус - что на скуле, что в файловом варианте эти таблицы блокируются ЦЕЛИКОМ - то бишь у тебя есть 30 документов одной последовательности проводящихся одновременно - первый захваатил таблицы последовательности и пока он не закончит проводится остальные курят бамбук. вот и получается, что проводятся они у тебя не параллельно, а последовательно, отсюда и тормоза.
Попробуй убить последовательности и всё процедуры с ними.


Врой способ- открой sql profiler, запусти трассировку и посмотри, что у тебя в поле duration жрет наибольшее количество времени/чтения/записи и.т.п- это и будет узкое место. кинь трассировку сюда, будем разбираться.
какая периодичность остатков?
- у бух.итогов - квартал, но доки в основном пишут по регистрам

У регистров оперативного учета периодичность тоже есть и может быть и год и месяц и картал.
 
V

vitfil

Кхе-кхе...
Оптимизация, дети мои, оптимизация... Необходимо вынести все расчеты из модуля проведения по максимуму. Все, что нельзя вынести, переписать на прямых запросах. И не дай вам Бог иметь в модуле проведения следующий код:
Код:
Спр = СоздатьОбъект("Справочник. ...");
Спр.Новый();
Спр.Записать();
Мало того, что на время проведения блокируется журнал документов (в семерке он всего один) и регистры, так еще и справочники заблокируете.
 
P

puh14

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

На скуле вроде только одна запись блокируется в журнале или плюс две соседние если в регистре. И разве при создании элемента справочника в проведении блокируется вся его скулевкая таблица? если так - то не знал...
 
H

Hry

puh14, vitfil, спасибо за советы, буду смотреть в указанных направлениях

Но я так и не получил ответ на главный вопрос
Попытаюсь на примере изложить чего я хочу

Возможно беда в том, что один юзер что-то захватил и пока его док не проведется - остальные ждут. Даже не возможно, а точно какая-то часть беды именно в этом.
Но почему проведение этого дока выполняется (условно) 30 секунд, если железо загружено на 10%???
Пусть бы этот док проводился 5 сек, тогда и остальные ждали бы меньше
Что этому может мешать?
 
P

puh14

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


вот тут прочитай - поподробнее написано.
 
V

vitfil

puh14
Читал по своей ссылке? 1С блокирует всю таблицу журнала документов.
Теперь давайте все же разберемся с блокировкой регистров...
Любой регистр состоит из двух таблиц: движения и итоги. При проведении документа 1с пишет в таблицу движений собственно сами движения, по которым в конце проведения будет выполнен пересчет итогов. Дабы на итоги дважды (или трижды) не повлиял пересчет других проводимых документов, таблицы регистров тоже надо было бы блокировать, но! Флагом блокировки выступает блокировка таблицы журнала документов. Фактически получаем следующее: в момент проведения документа, никакой другой документ не может проводиться, потому как заблокирована таблица журнала, следовательно - можно понимать, что таблицы регистров тоже заблокированы на запись или изменение. Даже если документы делают движение по различным регистрам, все равно они не могут одновременно проводиться. Насколько мне известно, это обошли в 8.х, выделив для каждого вида отдельный журнал, а также путем явного указания, по каким регистрам выполняет движение тот или иной документ.
Что же касается блокировки других таблиц (например, создаваемых в модуле проведения справочников), то тут следует понимать, что на самом деле конструкция
Код:
Процедура ОбработкаПроведения()
...
КонецПроцедуры
выглядит следующим образом:
Код:
Процедура ОбработкаПроведения()
[b]НачатьТранзакцию();[/b]
...
[b]Если СтатусВозврата() = 0 Тогда
ОтменитьТранзакцию();
Иначе
ЗафиксироватьТранзакцию();
КонецЕсли;[/b]
КонецПроцедуры
Со всеми вытекающими отсюда последствиями. Если не верите, попробуйте сделать следующее:
В обработку проведения вставьте код:
Код:
Спр = СоздатьОбъект("Справочник...");
Спр.Новый();
Спр.Записать();
Предупреждение(""); //дабы приостановить проведение документа
А когда проведение будет приостановлено, на другом экземпляре 1С, подключенном к этой же базе сначала попробуйте выполнить запрос к этому справочнику (прокатит, потому как 1С все запросы строит с nolock), а потом попробуйте открыть выборку этого справочника или программно создать новый элемент. Насколько я помню, даже интерактивно не получится записать изменения (или создать новый) элемента этого справочника.
 
P

puh14

Да, почитал сейчас (Давно забукмаркил - времени прочитать целиком и вдумчиво не было). Я на восьмерку ориентировался, в Габеце очень вкусно всё описано - какие таблицы, нахрена нужны и как блокируются. Думал что в семерке примерно так-же, оказалось гораздо хуже.
 
H

Hry

Еще вопрос: сейчас стоит SQL 2000, думаем поставить SQL 2005
Будет ли вообще 7.7 с ним работать и будет ли разница?
 
P

puh14






вот и мне такая дрянь предстоит в четверг - только на 2008 винде впридачу. Народ 7.7 даже с 2008 sql заставлял дружить. А практический опыт я в четверг вечером расскажу.

Про разницу в скоростях работы 2000 и 2005 sql ничего не скажу - не видел. А вот то что 2000 sql под 2008 сервером не пашет - это точно. На следующем поколении серверной винды и 2005 sql пахать не будет.
 
P

puh14

Вот я её и поставил. Ну что сказать - непривычно по ощущениям (прощай enterprise manager здравствуй Managment console). Почему-то на 64 битной 2008 WIN надо ставить только административную установку (Даже скорее не ставить, а копировать) - и только она пашет. Второе - в режиме конфигуратора под 2008 не получилось загрузить данные - ругается на текущую кодировку (при этом нормально создает/переделывает конфы). Вроде как нашел решение- подправить backend.dll ещё в одном месте (вообще - надо её самому переделать, а то у меня от 25-го релиза стоит). Ключики поймал влёт. ну а так - всё как обычно.
 
H

Hryv

puh14, ну как по прошествии некоторого времени все нормально, никакие проблемы не вылезли?

Мы решили тоже 2005 потестить, пока на Win2003 будем ставить


ЗЫ ура, я смог восстановить пароль :)
 
V

vbs

Мы решили тоже 2005 потестить, пока на Win2003 будем ставить
Мой сисадмин про 2005 даже слушать не захотел - говорит, косяков там немерено. А парень дюже грамотный - много лет с ним работаю и полностью доверяю
 
P

puh14

puh14, ну как по прошествии некоторого времени все нормально, никакие проблемы не вылезли?

Мы решили тоже 2005 потестить, пока на Win2003 будем ставить

Пока вроде нет - иногда тупит, сволочь. Надо перезапускать скуль. Я б на самом деле оставил бы 2000 если бы он на 2008 сервр шел. Но тут уж выбора нету... К тому-же решили в след году восьмерку брать ( а с ней вроде с 2005 sql всё пучком) - а семерку в архив.
 
H

Hryv

Правильно ли я понимаю, что в 1С 7.7 блокировки возникают только при записи/проведении?

Понятно, что есть еще Блокировка(<ВклВыкл>)
И что несколько юзеров не могут открыть объект

Но меня интересует именно ситуация когда манипуляции с одним объектом блокируют сразу много других (как при проведении)

И еще
Если внутри ОбработкаПроведения() написать что-то вроде Вопрос() или Предупреждение(), то все будут тупо ждать пока юзер вернется с перекура и нажмет на кнопочку?
 
P

puh14

Правильно ли я понимаю, что в 1С 7.7 блокировки возникают только при записи/проведении?

По сути да - можешь посмотреть stored procedure - там блокировки в звпросах идут. Всё что не nolock - блокирует по крайней мере для записи.

Но меня интересует именно ситуация когда манипуляции с одним объектом блокируют сразу много других (как при проведении)

Ну тут варианты - либо у тебя блокируется вся таблица целиком(1cjourn, последовательности) либо отдельные записи - это например ты использовал начатьТранзакцию .... ЗафиксироватьТранзакцию а посередке воткнул предупреждение.
Если внутри ОбработкаПроведения() написать что-то вроде Вопрос() или Предупреждение(), то все будут тупо ждать пока юзер вернется с перекура и нажмет на кнопочку?

Ага
 
V

vitfil

Если внутри ОбработкаПроведения() написать что-то вроде Вопрос() или Предупреждение(), то все будут тупо ждать пока юзер вернется с перекура и нажмет на кнопочку?
Первейший тест при приеме на работу: подсунуть модуль проведения с предупреждением и попросить найти ошибки. Если не находит, остальные ответы даже и не смотрю.
 
H

Hryv

Спасибо за ответы

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

Похоже, что 7.7 просто не предназначена для 30-35 юзеров работающих с данной интенсивностью
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!