По мотивам - Депрессия. Или превратности hResult и прочих ErrorCode
Сделали нагрузочные тесты. С нескольких клиентов.
Вот кстати код теста:
Молотят уже пятый день.
Ошибок - не выявлено.
Выявлены лишь ошибки функций ReadFile и WriteFile. В основном - LOCK_VIOLATION. Мы их теперь обрабатываем в цикле и протоколируем.
Будем увеличивать число клиентов.
P.S. Ну и разрулил "бутылочное горлышко". Стало всё сильно быстрее. И сильно меньше "конфликтов с залочками".
Я писал ранее - Про "рефакторинг":
"И ещё сегодня я нашёл два "бутылочных горлышка" - AllocNewFATAlement и AllocNewCluster. Они в свою очередь ведут к LockFile, Лочим заголовок. Где записана информация о структуре хранилища. И все пользователи при записи "бъются от эти залочки".
И знаю уже как это разрулить.
Надо упреждающе аллоцировать не один FATElement и Cluster, а сразу несколько (пять, десять, двадцать). Одним куском. Учитывая, что кластеров в файле обычно не один и не два и даже не десять, то это - эффективно. И держать список свободных локально у клиента. А потом когда клиент закрывается - возвращать их в список свободных. Т.е. "не пригодившихся". Чтобы из потом могли использовать другие клиенты.
Есть конечно вероятность - потерять элементы, если клиент завершится аварийно.
Но зато - мы реже попадаем в "бутылочное горлышко"."
-- ну вот это и "разрулил".
И нашёл ещё "пару подобных мест". Но не таких критичных.
Сделали нагрузочные тесты. С нескольких клиентов.
Вот кстати код теста:
USES QuickTestsUtils.script ; Тест TK565491886 ARRAY VAR "Список документов" [ Конституция ГК НК ТК ТНВЭД ОКОФ ОКОНХ ] >>> "Список документов" BOOLEAN VAR Вечность ДА >>> Вечность ПОКА Вечность ( INTEGER VAR "Случайный документ" ( "Список документов" array:Count Random "Список документов" [i] ) >>> "Случайный документ" Параметры: ( "Документ из базы {("Случайный документ")}" ) Выполнить ( "Набить текст {('Вносим изменения в текст и сохраняем документ!!!')}" "Нажать Enter" // - чтобы отделить параграфы документа, иначе параграфы могут быть "слишком длинными" для восприятия "Сохранить документ" "Обработать сообщения" // - чтобы приложение перерисовывалось ) ) ; TK565491886
Молотят уже пятый день.
Ошибок - не выявлено.
Выявлены лишь ошибки функций ReadFile и WriteFile. В основном - LOCK_VIOLATION. Мы их теперь обрабатываем в цикле и протоколируем.
Будем увеличивать число клиентов.
P.S. Ну и разрулил "бутылочное горлышко". Стало всё сильно быстрее. И сильно меньше "конфликтов с залочками".
Я писал ранее - Про "рефакторинг":
"И ещё сегодня я нашёл два "бутылочных горлышка" - AllocNewFATAlement и AllocNewCluster. Они в свою очередь ведут к LockFile, Лочим заголовок. Где записана информация о структуре хранилища. И все пользователи при записи "бъются от эти залочки".
И знаю уже как это разрулить.
Надо упреждающе аллоцировать не один FATElement и Cluster, а сразу несколько (пять, десять, двадцать). Одним куском. Учитывая, что кластеров в файле обычно не один и не два и даже не десять, то это - эффективно. И держать список свободных локально у клиента. А потом когда клиент закрывается - возвращать их в список свободных. Т.е. "не пригодившихся". Чтобы из потом могли использовать другие клиенты.
Есть конечно вероятность - потерять элементы, если клиент завершится аварийно.
Но зато - мы реже попадаем в "бутылочное горлышко"."
-- ну вот это и "разрулил".
И нашёл ещё "пару подобных мест". Но не таких критичных.
Комментариев нет:
Отправить комментарий