powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Быстродействие FB по локальной сети
25 сообщений из 64, страница 1 из 3
Быстродействие FB по локальной сети
    #39998493
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обнаружил существенное проседание скорости выполнения запросов по локальной сети по сравнению с localhost (~800 req/s против ~8000 req/s с нагрузкой данными по 6000 байт на каждый запрос, 1600 против 25000 без нагрузки).

* Скорость по локалке через iperf порядка 200 МБит/с (при нагрузке объемы порядка 40 Мбит/с - то есть канал не забит).
* FB2.5.7, но на FB3 ситуация та же.
* Клиент и сервер Win7
* Delphi, IBX
* Запросы - простой "EXECUTE PROCEDURE SP(:P_TIME, :P_DATA)", сама SP пустая. Коммит транзакции через каждые 100 запросов; повышение лимита особо ситуации не меняет.

Вопрос : есть ли средства повысить скорость обработки запросов? Трясти сетевиков?

Что пробовал:
- TcpRemoteBufferSize ставил в 32к
- Новая Тр-я каждые 500 запросов вместо 100
- Клиентская либа как от 2.5, так и от 3
- База на FB3 под Debian: результат есть! 1500 и 2500 с данными и без соответственно. Хотя все равно далеко от максимума.

Тестовый набор в аттаче и частично в спойлере

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SET SQL DIALECT 3;

SET NAMES UTF8;

CREATE DATABASE 'DB.fdb'
USER 'SYSDBA'
PAGE_SIZE 16384
DEFAULT CHARACTER SET UTF8 COLLATION UTF8;

SET TERM ^ ;

CREATE OR ALTER PROCEDURE SP (
    P_TIME TIMESTAMP,
    P_DATA VARCHAR(32000) CHARACTER SET OCTETS)
AS
BEGIN
  EXIT;
END^

SET TERM ; ^



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
const
  TransParamsRW = 'wait;write;read_committed;rec_version';
{<<specific}
  SQL = 'EXECUTE PROCEDURE SP(:P_TIME, :P_DATA)';
  DataLength = 6000;
var
  RandomData: TBytes;
{specific>>}

implementation

{$R *.dfm}

{<<specific}
procedure TForm1.Init;
var i: Integer;
begin
  IBSQL.SQL.Text := SQL;
  SetLength(RandomData, DataLength);
  for i := Low(RandomData) to High(RandomData) do
    RandomData[i] := Random(High(Byte));
end;

procedure FillParams(IBSQL: TIBSQL);
begin
  IBSQL.ParamByName('P_TIME').Value := Now;
  IBSQL.ParamByName('P_DATA').AsBytes := RandomData;
end;
{specific>>}

procedure TForm1.btnStartClick(Sender: TObject);
var
  ReqsPerTx, ReqCount, Interval: Integer;
  StartTick, EndTick: Cardinal;
begin
  if IBDatabase.DatabaseName <> eDB.Text then
    IBDatabase.Connected := False;

  if not IBDatabase.Connected then
  begin
    IBTransaction.Params.Delimiter := ';';
    IBTransaction.Params.DelimitedText := TransParamsRW;
    IBDatabase.DatabaseName := eDB.Text;
    IBDatabase.Params.Values['user_name'] := Copy(eLogin.Text, 0, Pos(':', eLogin.Text) - 1);
    IBDatabase.Params.Values['password'] := Copy(eLogin.Text, Pos(':', eLogin.Text) + 1, MaxInt);
    IBDatabase.Params.Values['sql_role_name'] := eRole.Text;
    Init;
    IBDatabase.Connected := True;
  end;
  ReqsPerTx := StrToInt(eReqPerTx.Text);
  Interval := StrToInt(eInterval.Text);
  Cancel := False;
  IBSQL.Transaction.StartTransaction;
  Log('== Start with ReqPerTx ' + eReqPerTx.Text);
  while not Cancel do
  begin
    StartTick := GetTickCount;
    ReqCount := 0;
    repeat
      FillParams(IBSQL);
      IBSQL.ExecQuery;
      Inc(ReqCount);
      if ReqCount mod ReqsPerTx = 0 then
      begin
        IBSQL.Transaction.Commit;
        IBSQL.Transaction.StartTransaction;
      end;
      EndTick := GetTickCount;
    until EndTick - StartTick > Interval;
    Log(Format('Req: %d, ReqPerSec: %.2f', [ReqCount, ReqCount*MSecsPerSec / (EndTick - StartTick)]));
    Application.ProcessMessages;
  end;
  IBSQL.Transaction.Commit;
  Log('== Finish');
end;


...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998497
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3*Вопрос*: есть ли средства повысить скорость обработки запросов?

Есть. Сделать то, для чего клиент-сервер предназначен изначально: перейти на
многопользовательскую работу.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998502
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

Есть. Сделать то, для чего клиент-сервер предназначен изначально: перейти на
многопользовательскую работу.

Она есть: два писателя и десяток читателей. Бенч сделан для настройки и выяснения максимума скорости самого движка в идеальных условиях. Значение будет взято за эталон, а дальше уже навешивается логика и мультиюзерность.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998506
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3Скорость по локалке через iperf порядка 200 МБит/с (при нагрузке объемы порядка 40 Мбит/с - то есть канал не забит).
я с похожим парадоксом столкнулся.
Сеть 1gb, iperf показывает прокачку 100 мегабайт в секунду, всё норм. Файлы по сетке летают как положено.
При этом рестор на удаленный комп - выше 10 мегабит (!!!) не поднимается, бэкап 3 гиг ресторится в базу 4гиг аж 2 часа.
Попробовал принудительно загрубить сетку до 100мбит, iperf показывает опять же честные 10 мегабайт в секунду.
И ... точно такой же рестор идет со скоростью 9 мегабит, т.е. не сильно медленнее чем по сетке 1гбит.
При этом по сетке при ресторе эти самые 9-10 мбит распределены так - 2.5-3мбит на прием, и остальные 6.5-7 мбит на передачу.

Параметры никакие не крутил, т.к. не понял, что это, и чем и куда крутить.
На одном компе, через тцп (localhost) - в 5 раз быстрее (через -se в 28 раз быстрее).

Это что, раундтрипы такие? Или как это вообще происходит, что сетки 1гб и 100мб по скорости рестора (передачи данных ФБ) почти не отличаются?
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998507
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3Она есть: два писателя и десяток читателей.

Доведи число писателей до полудюжины хотя бы. У тебя латентность сети уже начинает ролять.
Ну или ты используешь какую-то кривую библиотеку доступа, которая делает гораздо больше
роунд-трипов, чем необходимо.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998509
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvЭто что, раундтрипы такие?

Ага. Чисто для сравнения попробуй рестор через stdin fbsvcmgr.

Про то, чтобы испытать скорость Fireswarm, я уже не говорю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998519
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kdv
я с похожим парадоксом столкнулся.

Мда, я ожидал раундтрипы на запросах, но чтоб на ресторе...
Dimitry Sibiryakov

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

6 писателей с нагрузкой по 6000 байт - 400-430 r/s. На сервере 16.5 Мбайт/с на прием. Но это на супере (fbserver.exe -a)

На Debian ситуация намного лучше по причине того, что в винде сетевой стек говно?))
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998526
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3,

если планируешь перейти а 4.0, то попробуй Batch API

22080521
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998527
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3400-430 r/s

Если это "записи в секунду", то что-то ты реально делаешь криво в приложении.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998528
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Выдача из WireShark при размере нагрузки = 1 байт. Полный цикл - старт транзакции, выполнение запроса с параметрами, коммит. Странноват такой объем (1314*4 + 1070) для пустого запроса, это нормально?
"No.""Time""Source""Destination""Protocol""Length""Info""200""2.543925""Local""Remote""GDS DB""74""Transaction""201""2.546028""Remote""Local""GDS DB""86""Response""202""2.549990""Local""Remote""GDS DB""1314""Execute""203""2.549996""Local""Remote""TCP""1314""54487 → 3050 [ACK] Seq=1281 Ack=33 Win=258 Len=1260""204""2.550000""Local""Remote""TCP""1314""54487 → 3050 [ACK] Seq=2541 Ack=33 Win=258 Len=1260""205""2.550002""Local""Remote""TCP""1314""54487 → 3050 [ACK] Seq=3801 Ack=33 Win=258 Len=1260""206""2.550005""Local""Remote""TCP""1070""54487 → 3050 [PSH ACK] Seq=5061 Ack=33 Win=258 Len=1016""207""2.550500""Remote""Local""TCP""60""3050 → 54487 [ACK] Seq=33 Ack=3801 Win=516 Len=0""208""2.550754""Remote""Local""TCP""60""3050 → 54487 [ACK] Seq=33 Ack=6077 Win=516 Len=0""209""2.550755""Remote""Local""GDS DB""86""Response""210""2.550838""Local""Remote""GDS DB""62""Commit""211""2.552636""Remote""Local""GDS DB""86""Response""214""2.750058""Local""Remote""TCP""54""54487 → 3050 [ACK] Seq=6085 Ack=97 Win=257 Len=0"
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998532
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Dimitry SibiryakovЧисто для сравнения попробуй рестор через stdin fbsvcmgr.
через stdin тест был, разумеется, но через гбак, а не fbsvcmgr. В любом случае удаленный комп засасывал бэкап с локального.
Ну и - stdin в полтора раза медленнее, чем локально -se. Т.е. в сумме рестор шел со скоростью 6 мегабайт в секунду. Ну и прокачка по сетке там была где-то не меньше 100мбит, я не помню уже.
Грубо говоря, на 1гбит рестор через stdin по сетке быстрее, чем локальный рестор через xnet :-)
Василий 3но чтоб на ресторе...
рестор - это массовые препарированные инсерты в длинной транзакции.
И тут два вопроса - с какого фига при таких инсертах сервер возвращает клиенту треть трафика, и почему всё это так тормозится, как будто передается одна запись на сетевой пакет.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998533
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Симонов Денис
если планируешь перейти а 4.0, то попробуй Batch API

Пока на трешку только медленно перехожу)) а есть описание? Порылся, но поисковики про этот АПИ не в курсе. Мне бы, наверно, пригодилось - все равно уже сейчас по 100-200 инсертов в секунду идут
Dimitry Sibiryakov

Если это "записи в секунду", то что-то ты реально делаешь криво в приложении.

Да, запросы в секунду. Возможно и криво - знать бы, что...
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998546
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvИ тут два вопроса - с какого фига при таких инсертах сервер возвращает клиенту треть
трафика, и почему всё это так тормозится, как будто передается одна запись на сетевой пакет.

Ну и ответы соответствующие: потому что статус-вектор это 20 целых чисел и таки да, одна
запись на сетевой пакет. Это с сервера на клиент они буферизуются, а туда - опаньки.

Василий 3Возможно и криво - знать бы, что...

Как минимум - параметр процедуры размером в 32кб.
И wireshark почему-то утверждает, что идёт всего один запрос на транзакцию и 6000 байт
данных (что, впрочем, и написано в коде).
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998562
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3,

как обычно Release Notes
\examples\interfaces\11.batch.cpp
\examples\interfaces\12.batch_isc.cpp
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998564
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3
Обнаружил существенное проседание скорости выполнения запросов по локальной сети по сравнению с localhost (~800 req/s против ~8000 req/s с нагрузкой данными по 6000 байт на каждый запрос, 1600 против 25000 без нагрузки).
А чего не 36000 байт ? :) Попробуй теперь 600 и 60 байт
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998574
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvlad,

мне-то чего пробовать, интересно.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998580
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
hvlad,

мне-то чего пробовать, интересно.
Ты про традиционный рестор по сети ? Про то, как делать не надо ? :)
Попробуй 4-ку - gbak и сервер.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998637
Василий 3
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov

И wireshark почему-то утверждает, что идёт всего один запрос на транзакцию и 6000 байт
данных (что, впрочем, и написано в коде).

Да, верно :) запутался в процессе разных условий тестирования. При нагрузке в 1 байт ситуация ожидаемая,
"No.""Time""Source""Destination""Protocol""Length""Info""34""2.333609""Local""Remote""GDS DB""74""Transaction""35""2.335440""Remote""Local""GDS DB""86""Response""36""2.336426""Local""Remote""GDS DB""114""Execute""37""2.337006""Remote""Local""GDS DB""86""Response""38""2.337098""Local""Remote""GDS DB""62""Commit""39""2.338922""Remote""Local""GDS DB""86""Response""40""2.543392""Local""Remote""TCP""54""9375 → 3050 [ACK] Seq=89 Ack=97 Win=259 Len=0"

Dimitry Sibiryakov

Как минимум - параметр процедуры размером в 32кб.

А что здесь не так? Мне надо писать данные вплоть до такого размера. Или такой параметр создаёт большую нагрузку? Попробую уменьшить.

Симонов Денис
Василий 3,

как обычно Release Notes
\examples\interfaces\11.batch.cpp
\examples\interfaces\12.batch_isc.cpp

Спасибо!

hvlad
А чего не 36000 байт ? :) Попробуй теперь 600 и 60 байт

6кб - типичный размер в моей задаче, вот на нем и проверял. Конечно, чем больше размер данных, тем меньше req/s
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998644
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3,

в 2.5/3.0 можно попробовать в execute block запихать пачку операторов. Правда в 2.5 сильно не разгонишься, помешает ограничение в 64K на длину входного сообщения.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998685
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Василий 3А что здесь не так? Мне надо писать данные вплоть до такого размера.

Эва... А можно поинтересоваться что это за "данные вплоть до такого размера"?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998712
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНу и ответы соответствующие: потому что статус-вектор это 20 целых чисел и таки да, одна
запись на сетевой пакет. Это с сервера на клиент они буферизуются, а туда - опаньки.
То есть, получается, что если из бэкапа прочитано 100 записей размером 80 байт, то они влезли в 1 пакет 8к, а на это сервер гбаку отвечает 100 пакетами по 20 байт?
Всё равно не сходится. Хотя общий принцип торможения понятен:
1. получаем пакет из 100 записей
2. вставляем запись (дисковые операции, то-сё)
3. отправляем пакет про результат вставки по сетке
4. тут вроде клиент должен отправить подтверждение серверу, что "он понял", +1 пакет.
5. goto 2

как результат - ни диск не загружен, ни сеть. В результате 35 миллионов записей ресторятся по сетке со скоростью 5000 записей в секунду.
Отсюда же - 5кратная разница между рестором на localhost и -se (или 2.5 кратная с xnet)
hvladПопробуй 4-ку - gbak и сервер.
если там идет через batch, так понятно, что будет пулей.
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998730
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvТо есть, получается, что если из бэкапа прочитано 100 записей размером 80 байт, то они
влезли в 1 пакет 8к, а на это сервер гбаку отвечает 100 пакетами по 20 байт?

Нет. Вплоть до четвёрки получается, что эти записи влезли в 100 пакетов по 160 байт, а
сервер на это отвечает 100 пакетами по 80 байт. Не забывай про message-обвязку и то, что в
статус-векторе лежат целые числа, а не байты.

И да, это очень сильный источник торможения.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998732
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv
То есть, получается, что если из бэкапа прочитано 100 записей размером 80 байт, то они влезли в 1 пакет 8к
Чушь какая-то, извини.
Каждая запись - это отдельный insert, т.е. выполнение запроса.
До появления батчей нет способа отправить несколько запросов серверу в одном пакете.
И - да, каждый запрос получает свой ответ. А как ты хотел ?
И - нет - очередная феерическая чушь от ДС про то, что статус всегда шлётся как 20 чисел (даже пустой).

kdv
hvladПопробуй 4-ку - gbak и сервер.

если там идет через batch, так понятно, что будет пулей.Лишь бы не проверять, вот что это за позиция такая ?
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998735
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то мне вчера ускользнуло:
kdvчерез stdin тест был, разумеется, но через гбак, а не fbsvcmgr.

Это две совершенно разные вещи. gbak до сих пор не умеет заливать поток с клиента.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Быстродействие FB по локальной сети
    #39998737
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hvladИ - нет - очередная феерическая чушь от ДС про то, что статус всегда шлётся как 20 чисел
(даже пустой).

Чушь, конечно, но тем не менее:
Код: plaintext
"37"	"2.337006"	"Remote"	"Local"	"GDS DB"	"86"	"Response"

Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 64, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Быстродействие FB по локальной сети
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]