Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / C++ Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
 httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Пытаюсь сделать простенький HTTP сервер с использованием библиотеки httplib.
Смущает скорость обмена: если "всё по умолчанию", то примерно один запрос GET в одну-две секунды.
Если клиент включает keep-alive, то скорость возрастает до 2 запросов в секунду. Что также удручает.

Опыта написания http клиентов и серверов нет, может, это нормально?
9 апр 21, 19:13    [22306695]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Клиент посылает GET - запросы вида /id=число, например:
/id=123

Сервер возвращает ответы вида
Echo 123
.

Код сервера:
#include <httplib.h>
namespace htl = httplib;

int main()
{
	htl::Server srv;
	srv.Get("/id=(d+)", [](const htl::Request& req, htl::Response& res) {
		auto param = req.matches[1];
		auto result = "Echo " + param.str();
		res.set_content(result, "text/plain");
	});
	srv.listen("0.0.0.0", 8080);
}
9 апр 21, 19:16    [22306699]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Извинения, код сервера чуть подправлен:
#include <httplib.h>

namespace htl = httplib;

int main()
{
	htl::Server srv;
	srv.Get(R"(/id=(\d+))", [](const htl::Request& req, htl::Response& res) {
		auto param = req.matches[1];
		auto result = "Echo " + param.str();
		res.set_content(result, "text/plain");
	});
	srv.listen("0.0.0.0", 8080);
}

Код клиента:
#include <httplib.h>
#include <ctime>

namespace htl = httplib;

int main()
{
	htl::Client cli("localhost", 8080);

//	cli.set_keep_alive(true); // Если установить - будет быстрее
	
	time_t my_time = time(NULL);
	printf("%s", ctime(&my_time));

	for (auto i = 0; i < 10; i++) {
		std::string req = "/id=1";// +std::to_string(i);
		auto res = cli.Get(req.c_str());
	}

	my_time = time(NULL);
	printf("%s", ctime(&my_time));

}
9 апр 21, 19:35    [22306718]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
может там еще какие таймауты влияют

c set_keep_alive(true) конечно будет быстрее, сейчас в броузерах это по дефолту имхо

set_keep_alive_max_count выставь (черт знает сколько, 5-10 допустим)

надо все Сеттеры смотреть, что они делают
9 апр 21, 19:52    [22306729]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Alex_Ustinov,

да. Увеличение set_keep_alive_max_count увеличивает скорость.
Запросто можно и 500 (и выше) сообщений в секунду получить.
Но - вот беда: первое сообщение хоть убей 2 секунды. Т.е., время коннекта.
Т.обр., нужно учесть характер данных и алгоритм обмена.

Огромное спасибо.
9 апр 21, 20:34    [22306753]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
ъъъъъ
Т.е., время коннекта.

Радует, что "тормоза" - на стороне клиента. Т.е., праллельные коннекты сервер почти не замедляют.
Спасибо ещё раз.
9 апр 21, 20:38    [22306755]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

ъъъъъ
Смущает скорость обмена: если "всё по умолчанию", то примерно один запрос GET в одну-две
секунды.

Кто клиент и какой протокол? Если браузер без явного указания префикса протокола, то он
пробует щемиться по https сначала и только если не вышло - переключается на http. А если у
тебя https, то там безумный handshake с проверкой сертификатов и обращением к 100500
центрам сертификации перед началом собственно обмена.

Posted via ActualForum NNTP Server 1.5

9 апр 21, 22:06    [22306779]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Dimitry Sibiryakov,

клиент - тоже я (см. код 22306718). :)

Протокол HTTP 1.1, не использую никаких SSL/TLS.
9 апр 21, 22:21    [22306786]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
ъъъъъ, используй пул из нескольких соединений.
9 апр 21, 22:25    [22306790]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
mayton
ъъъъъ, используй пул из нескольких соединений.


Э... клиент должен быть с сервером постоянно на связи? Если да, то, наверное, никак. Да и не особо нужно.

Задержка при коннекте на стороне клиента не особо важна. Я сперва подумал, что это сервер тормозит, сие было бы грустно: например, с утра десятки тысяч клиентов лезут к серверу, это скорее сдохнешь, чем результат получишь...
А так - нормально, торможение в момент коннекта фактически только на клиенте.
Результаты удовлетворительны, если что - буду копать глубже.
Спасибо.
9 апр 21, 22:34    [22306792]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
mayton
Member

Откуда: loopback
Сообщений: 51389
А в чем проблема? Пул объектов - нормальный порождающий шаблон проектирования.
Он тут как раз подходит. Можно его наделить логикой idle_timeout когда созданные соединения
после часа простоя - отключаются. Тогда не нужна постоянная связь.
9 апр 21, 23:14    [22306811]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
mayton
А в чем проблема?

Да по логике не нужно. Предполагается, что при старте любого "бизнес-приложения" нашего программного комплекса будет стартовать крошечное приложение - этот самый http-клиент, проверяющий наличие обновлений.
Приложение будет работать параллельно (проверка наличия обновлений и, если нужно, загрузка), даже когда "бизнес-приложение" завершит работу. То есть, если потратится лишние 2 сек на первоначальный коннект - это вовсе не беда. И даже если связи не будет совсем - тоже не беда, потом скачают, или курьера (как сейчас) пошлют. Я боялся, что затык сервера будет, так как таких клиентов довольно много.
9 апр 21, 23:24    [22306819]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

ъъъъъ
клиент - тоже я (см. код 22306718
Протокол HTTP 1.1, не использую никаких SSL/TLS.

Тогда хрень какая-то. Ответ должен приходить со скоростью пинга.

Posted via ActualForum NNTP Server 1.5

10 апр 21, 00:20    [22306842]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Dimitry Sibiryakov
ъъъъъ
клиент - тоже я (см. код 22306718
Протокол HTTP 1.1, не использую никаких SSL/TLS.

Тогда хрень какая-то. Ответ должен приходить со скоростью пинга.

Да. Если на сервере вместо
	srv.listen("0.0.0.0", 8080);

задать
	srv.listen("localhost", 8080);

или сетевое имя компьютера - то всё очень-очень быстро.
10 апр 21, 02:39    [22306870]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
В общем, это я тормоз. Клиент должен коннектиться не localhost, а к 127.0.0.1, тогда не будет задержки при коннекте.
Или серверу следует указывать привязку не к "0.0.0.0", а к "::". Тогда пофиг, что клиент будет указывать при коннекте - localhost, 127.0.0.1 или сетевое имя компьютера.
Что-то связано с ipv4/ipv6, завтра разберусь. Спать пошел.
10 апр 21, 04:06    [22306874]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
это виноват "местный" dns, разрешение имен, частая сетевая проблема
10 апр 21, 09:10    [22306891]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394
Не DNS, а hosts в данном случае. Он ресольвит localhost в два адреса - IPv6 и IРv4. По умолчанию IPv6 имеет приоритет и клиент пытается использовать его. Кривая библиотека: достаточно умная чтобы использовать IPv6, но недостаточно умная для коннекта сразу на все полученные адреса.

Сообщение было отредактировано: 10 апр 21, 12:29
10 апр 21, 12:32    [22306935]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3797
hosts и есть "местный" локальный ДНС
10 апр 21, 13:07    [22306941]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Сокет (клиентский и серверный) создается в https://github.com/yhirose/cpp-httplib/blob/master/httplib.h#L2061
В клиенте функция getaddrinfo() (коннект к "localhost") возвращает список addrinfo структур, в которых addrinfo с протоколом ipv6 идут первыми, а затем иду ipv4. А в сервере (бинд к "0.0.0.0") формируется список только из addrinfo с ipv4.
Таким образом, клиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды, берет следующий addrinfo с ipv4, получает правильный коннект. Если сервер биндится в "::", то в итоге он будет "висеть" на сокете ipv6 (все та же getaddrinfo()).
...
Если в https://github.com/yhirose/cpp-httplib/blob/master/httplib.h#L2069 задать хинт, вместо
  hints.ai_family = AF_UNSPEC;

задать, например,
  hints.ai_family = AF_INET;

то и клиент и сервер будет работать по ipv4.

Или в настройках ОС клиента изменить порядок приоритета, задав ipv4 более приоритетным:
В HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip6\Parameters создать/задать переменную DisabledComponents со значением 20 (hex).
Подробности: https://docs.microsoft.com/en-US/troubleshoot/windows-server/networking/configure-ipv6-in-windows.
13 апр 21, 14:59    [22308270]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 8256
ъъъъъ,
Угу.
Большинство ПО прописывают что вырубать ipv6 и не парятся по этому поводу.
13 апр 21, 15:13    [22308283]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
PetroNotC Sharp,

MSDN
Internet Protocol version 6 (IPv6) is a mandatory part of Windows Vista and Windows Server 2008 and newer versions. We do not recommend that you disable IPv6 or its components. If you do, some Windows components may not function.

We recommend using Prefer IPv4 over IPv6 in prefix policies instead of disabling IPV6.

Кто я такой, чтобы идти против MS-Soft.
13 апр 21, 15:17    [22308290]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

ъъъъъ
клиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды,
берет следующий addrinfo с ipv4, получает правильный коннект.

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

Posted via ActualForum NNTP Server 1.5

13 апр 21, 15:21    [22308295]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Dimitry Sibiryakov
ъъъъъ
клиент создает сокет ipv6, который лезет к серверу ipv4, обламывается через 2 секунды,
берет следующий addrinfo с ipv4, получает правильный коннект.

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

Да, библиотека https://github.com/yhirose/cpp-httplib - "блокирующая".

Ну, в плане создания клиентского сокета, думаю, можно чуток и подшаманить.
Спасибо.
13 апр 21, 15:28    [22308302]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53394

ъъъъъ
Да, библиотека https://github.com/yhirose/cpp-httplib - "блокирующая".

Это сугубо всё равно. Блокирующей библиотеке никто не запрещает использовать неблокирующие
сокеты с select/poll/и т.п.

Posted via ActualForum NNTP Server 1.5

13 апр 21, 15:33    [22308304]     Ответить | Цитировать Сообщить модератору
 Re: httplib: скорость клиент-серверного обмена (HTTP 1.1)  [new]
ъъъъъ
Member

Откуда:
Сообщений: 2114
Dimitry Sibiryakov,

да.
13 апр 21, 15:49    [22308320]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3 4   вперед  Ctrl      все
Все форумы / C++ Ответить