|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Скоро буду участвовать в проекте ускорения работы кастом клиента-терминала. Архитектура традиционная 3-звенная: Win32 клиент на стареньком Дельфи - Вин32 сервер на нем же - Оракл 11.2 Сотни интерактивных Windows клиентов на медленном железе через один апп сервер доступаются к одной базе. За терминалами сидят живые люди, которых раздражают задержки и подвисания. Нажатие кнопки может привести к 10-секундному ожиданию, что неприемлемо. Клиенты (виртуально) находятся в одном дата центре с серверами, поэтому сеть между клиентами и серверами считается очень быстрой. С задачами оптимизаций я знаком, но по совсем другим ситуациям (интел железо, спутники связи, дизайн файловых систем), про базы знаю очень мало, про оптимизацию Оракла - вообще ничего. Должно быть интересно и познавательно. Для разминки, выбрал конкретный сценарий и сделал несколько замеров скорости, а также написал немного предварительного кода. Сценарий: список заказчика, который выскакивает по кнопке "выбрать заказчика". Лучшее время: 300-500 строк за 3-5 секунд (если уже выбран фильтр) Худшее время: десятки тысяч строк за 30-60 секунд (если фильтр отключен) Для интерактивных приложений, UI считается "мгновенным" если укладывается в 200 миллисекунд, и "быстрым" если < 500мс. При длительности ожидания более 200мс принято показывать индикатор занятости, обычно курсор, это уже делается. При длительности ожидания более секунды (это уже плохо) желательно показывать индикатор прогресса Начальная цель: уложиться в одну-две секунды для всех значений фильтра. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:44 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
А где тут "Архитектура традиционная 3-звенная" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:50 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL, А при чем тут Оракл? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:50 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL, НеофитSQL десятки тысяч строк за 30-60 секунд (если фильтр отключен) Какой сакральный смысл в передаче десятков тысяч строк на клиента? Начните с редизайна приложения, если оно постоянно таскает десятки тысяч строк в фильтры, то его явно надо менять. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:51 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL Начальная цель: уложиться в одну-две секунды для всех значений фильтра. Невозможно фактически Т.к. фильтров может быть бесконечно много, то уложится можно только в бесконечно-многое кол-во секунд. По определению. Так же по определению, время выполнения работы (и зарплата) приблежается к бесконечности. Готов сделать данную работу за Вас. Даже не требую бесконечной оплаты, хватит сотни тысяч рублей в месяц. Но сделаю, разумеется, за бесконечно большое время. Тестирование на совести заказчика, но так как работа мною никогда не будет закончена - то это не проблема ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:53 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
В любом случае без изменения приложения не получится. Либо кэшировать такие справочники на клиенте сервере приложений, заливая при запуске и время от времени синхронизируя дифф, либо менять подход и не тащить на клиента больше полусотни строк. Можно сделать "умный" фильтр + пейджинг, который будет подтягивать только нужную страницу. Если приложение трогать нельзя, то бегите оттуда посмотрите в сторону result cache, но это надо уметь готовить не панацея. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:55 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Начал с замеров, чтобы понять где и что тормозит. Замер 1: исключить сеть как фактор. Ранее упоминалось что сеть считается очень быстрой и не потребует оптимизации. Предположения полагается проверять, поэтому мой сотрудник, системный администратор исключительных талантов, помог сделать замеры объема сетевого трафика. Получилось около 50 байтов на строку (используется сжатие между клиентом и сервером). Вывод 1 : сеть не является фактором, т.к. в один мегабайт помещается 20 тыс строчек, а мегабайт по гигабитам летает быстро. Замер 2: скорость железа клиента как фактор Замеры показали что скорость сценария зависит от скорости железа. Разница между "стандартным" и "самым быстрым" примерно вдвое. Вывод 2 : оптимизация кода на клиенте имеет смысл, и скорее всего будет необходимой. Замер 3: скорость исполнения запроса на сервере. Запрос достаточно сложный, сотни строк и десяток таблиц. Немного поломал голову, как исполнить запрос без вывода данных на экран, наконец нашел "set autotrace traceonly". Получил пять секунд для полного запроса на все имеющиеся строчки. Вывод 3 : для достижения цели будет необходимо изменить запрос. Замер 4: влияние среднего звена на общую задержку Этот замер отложил, т.к. код сервера законсервирован. Влияние возможно есть, оно будет известно лучше после оптимизации кода клиента и запроса. Уточнил у своего гуру, что архитектура "store and forward", т.е без пайплайнинга (результат запроса отдается серверу одним куском, а потом тот отдает его клиенту). Без пайплайнинга время исполнения SQL запроса и время получения/рендеринга текста на экране складываются в общую паузу ожидания, и эффект оптимизаций тоже складывается. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:57 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
env Какой сакральный смысл в передаче десятков тысяч строк на клиента? Если допустима binary сортировка, и клиент не делает fetch all, то проблемой не является. Иногда уже на первом экране (когда еще фильтр не выбран, by default ), пользователь хочет что нибудь видеть... смысла вроде нет, но пользователю так проще сориентироваться, что он на нужной форме и по каким полям нужно/можно искать (иногда из названия полей не очень очевидно, что же туда реально забивают). IMHO & AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 17:58 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
env, Да тут сразу понятно что дело труба, на древнем 32-х разрядном сервере крутится сервер приложений на Дельфях и Оракл, пытаться что то выкрутить тюнингом запросов или кешированием на стороне Оракла (кешировать все равно некуда будет, памяти то на древнем сервере нет) бессмысленно занятие, совет "бегите оттуда" реально самый здравый)) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:01 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Судя по замерам - фетч там полный ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:01 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
вщте ауув екщдд :) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:04 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
env Судя по замерам - фетч там полный или Order by ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:04 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL Запрос достаточно сложный, сотни строк и десяток таблиц. Это всё ещё про НеофитSQL Сценарий: список заказчика, который выскакивает по кнопке "выбрать заказчика". Материализовать возможности нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:05 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL результат запроса отдается серверу одним куском, а потом тот отдает его клиенту) Поменять на более ленивый вариант возможность есть? Тогда первые строки можно будет отдать быстро, а остальные подгрузить по скроллу. Как раз пока клиент пялится в экран - сервер приложений дофетчит уже. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:10 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Сразу столько комментариев! Спасибо. Попробую ответить на все. Leonid Kudryavtsev> А где тут "Архитектура традиционная 3-звенная" ? (Оракл) --- (Апп сервер) ---- (Клиент) Апп сервер обслуживает все сотни клиентов, разговаривает с ораклом через 10-20 сессий. Я понимаю, такая архитектура называется 3-звенкой, хотя термин чаще используется для вэбсайтов. Верно? graycode> А при чем тут Оракл? Я описываю задачу в целом для полноты контекста, и чтобы было интересно. Вопросы оптимизации клиента довольно простые, на мой первый взгляд. У меня будут вопросы по оптимизации, которые затронут Оракл, с которыми мне возможно помогут местные эксперты. env> Какой сакральный смысл в передаче десятков тысяч строк на клиента? Это очень правильный вопрос, один из тех что я собираюсь задать. Ответ на этот вопрос может значительно повлиять на объем работ и результат. Леонид частично на него ответил. Обычно "всех" хотят видеть руководители, а они жалуются громче рядовых сотрудников. Leonid Kudryavtsev> Т.к. фильтров может быть бесконечно много, Фильтр ограниченной сложности. Когда я написал "при всех возможных значениях фильтрА", я имел в виду самое неблагоприятную для скорости комбинацию значений. На данный момент это пустой фильтр. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:12 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Давайте на время отложим комментарии "дело труба, беги оттуда". Я очень уважаю моих сотрудников и учредителей, и эта задача мне интересна. На данный момент я собрал прототип который показывает полный список за 1.5-2 секунды. Это лучшее что мне удалось сделать без внесения изменений в архитектуру. Через пару минут расскажу что уже сделал. Дальше будет труднее, и наверное интереснее как вам, так и мне. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:17 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQLАрхитектура традиционная 3-звенная: Win32 клиент на стареньком Дельфи - Вин32 сервер на нем же И то и другое вероятнее всего сляпано мышкой из готовых компонент. Для достижения поставленной цели придётся переписать чуть менее чем полностью. В морг. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:19 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQLя имел в виду самое неблагоприятную для скорости комбинацию значений. На данный момент это пустой фильтр. Как раз пустой фильтр для стандартных дельфийских компонент практически идеальный случай. Если даже его вы сумели вытянуть только на секунду... См сообщение выше. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:23 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
env НеофитSQL результат запроса отдается серверу одним куском, а потом тот отдает его клиенту) Поменять на более ленивый вариант возможность есть? Тогда первые строки можно будет отдать быстро, а остальные подгрузить по скроллу. Как раз пока клиент пялится в экран - сервер приложений дофетчит уже. Это один из вариантов. Я вчера в первый раз ковырялся в DB контролях Дельфи (они какие-то кастом). Я заметил что ленивый фетч присутствует в настройках, но не используется нигде в приложении. Есть ньюанс, что поиск по Ctrl-F (вместо настройки фильтра) это самый ходовая команда у пользователей, ее нужно сохранить. Также, при ленивой подкачке возникнет дополнительная работа по обработке сортировок по колонкам с сохранением позиции выбранной строки. Это задача чревата большим количеством тестирования. Поскольку тестера мы не предусмотрели, я пока откладываю варианты связанные с повышенной тестовой нагрузкой. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:24 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov НеофитSQLя имел в виду самое неблагоприятную для скорости комбинацию значений. На данный момент это пустой фильтр. Как раз пустой фильтр для стандартных дельфийских компонент практически идеальный случай. Если даже его вы сумели вытянуть только на секунду... См сообщение выше. Мы оба говорим про сервер-сайд фильтр, который передается на сервер, и уменьшает количество строк, так? Пустой фильтр сегодня дает максимальное количество строк, а задержка в исполнении операции показа заказчиков растет с числом строк. На этом основании я заключил что пустой фильтр на сегодня самый медленный. (ну и прямых измерений, конечно) ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:27 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQLМы оба говорим про сервер-сайд фильтр, который передается на сервер, и уменьшает количество строк, так? Да. НеофитSQLПустой фильтр сегодня дает максимальное количество строк, а задержка в исполнении операции показа заказчиков растет с числом строк. Это бред левых компонент. Стандартные фетчат ровно столько записей, сколько отображается на экране. Для стратегии first row fast с навигацией по индексу это идеальный случай. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:47 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Что я напрототипил, и какие нашел грабли: Скорость рендеринга. У меня не было ясности что старая дельфовая обертка грида позволяет показать 20тыс строк за секунду в моей среде. Небольшой тест позволил это проверить, результаты были обнадеживающие - грид достаточно быстрый Конфигурация списка По умолчанию выводится 6 колонок, разрешается добавить еще 70, самых эзотерических) Резалт сет всегда содержит все колонки, многие из которых вычисляемые. Изолированность изменений Это был первый большой сюрприз. Оказалось, поп-ап список заказчиков (как адресная книга в аутлуке) использует не только запрос, но и всю дельфи инфраструктуру от большого экрана просмотра/добавления/изменения заказчиков. Я не разобрался все, что она тянет, но там немало. Имя SQL запроса - атрибут типа, поэтому если я хочу менять запрос под свои цели, надо отделять поп-ап выбора заказчика от кода "большого экрана" который позволяет редактирование и подробный анализ. Испытал пару подходов. 1) склонировал экран редактирования заказчиков, начал выбрасывать все ненужное. Походу рассмотрел архитектуру клиента, довольно умный хлопец его писал. В (теперь отдельном) запросе удалил опциональные колонки. Получил примерно 3 секунды. 2) собрал "с нуля" минимальную форму базового класса с базовыми виджетами позволяющий показать список, но еще отвечающий параметрам архитектуры клиента, чтоб его можно было обозначить как "попап". С тем же запросом получил 1.5-2 секунды. Это около 10К строк в секунду без "ручного кода" в клиенте - только виджеты на форме. Ctrl-F работает. На этом пока остановился - ограничение скорости заполнения грид контроля в моей среде. На более быстром компе это в 2-3 раза быстрее. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:48 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Это бред левых компонент. Стандартные фетчат ровно столько записей, сколько отображается на экране. Для стратегии first row fast с навигацией по индексу это идеальный случай. Левые компоненты вроде бы умеют, хотя еще не проверял, а в проекте они только используются в режиме целиком. У меня есть требование сохранить поиск по Ctrl-F (это наверное можно извернуться, передав в фильтр и ре-фетч, сообщив серверу критерий поиска, номер выбраной строки и критерий сортировки), и мне не совсем понятно как будет работать сортировка по колонкам с сохранением текущей строки, я предполагаю компоненты все это сами умеют делать, если им известен PK? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:58 |
|
Оптимизация интерактивного 3-звенника
|
|||
---|---|---|---|
#18+
НеофитSQL Замер 1: исключить сеть как фактор. ... Вывод 1 : сеть не является фактором, т.к. в один мегабайт помещается 20 тыс строчек, а мегабайт по гигабитам летает быстро. А ещё есть пропускная способность, измеряемая пакетами в секунду. И которая не зависит от размера пакета. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.10.2020, 18:59 |
|
|
start [/forum/topic.php?fid=52&msg=40006683&tid=1880817]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
157ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
2ms |
others: | 15ms |
total: | 283ms |
0 / 0 |