LINUX.ORG.RU

Снизить нагрузку на процессор в сетевом потоке.

 , ,


0

3

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

В потоке обработки клиента сейчас такой бред:

while(true)
{
  if (!socket->available())
  {
	std::this_thread::sleep_for(std::chrono::milliseconds(0));
	continue;
  }

  //работаем
}

★★

Возможно глупый совет. Но может быть стоит хотя бы немного давать процу поспать? std::this_thread::sleep_for(std::chrono::milliseconds(10));

Dead ★★★★
()

Нужно кроссплатформенное решение, которое бы убрало эту проблему. Boost использовать можно и нужно, заранее спасибо.

Сам же и ответил — Boost.Asio.

i-rinat ★★★★★
()

стяни с гит хаба пару высороконагруженных серверов, неважно С или С++ и поизучай, у тебя нулевые знание в области нетворк программирования и знания этих самых сетевых технологий для программирования, прокачай скилл, и не через сидения на лоре, а самостоятельно углубись, почитай, разберись, иначе то что у тебя там было 5 лет назад с С++ видится как то смешно

anonymous
()
Ответ на: комментарий от Booster

Спасибо, а совет можешь дать, чтобы быстро починить?

Booster ★★
() автор топика
Ответ на: комментарий от anonymous

Мне не нужен высоконагруженный сервер в данной задаче. Когда будет нужен, тогда и буду его делать, к примеру через асинхронные сокеты. Сервер должен держать только несколько клиентов. Это у тебя нулевые знания, не порть настроение.

Booster ★★
() автор топика
Последнее исправление: Booster (всего исправлений: 2)
Ответ на: комментарий от Booster

если ты планируешь все же устраиваться нетворк программером, то нужно прокачать скилл, по созданию высоко нагруженных серверов, построение архитектуры итд итп, тупо что то слепить что бы как то работало + с помощу лора = это для чего? если это продолжения выполнения ТЗ то это феил. Прокачаешь скилл и сможешь попробовать податься в нормальную компанию для начала http://hh.ru/vacancy/13732468 http://hh.ru/vacancy/13849429 http://hh.ru/vacancy/14470653

anonymous
()
Ответ на: комментарий от hateyoufeel

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

anonymous
()
Ответ на: комментарий от hateyoufeel

Меня все устраивает, нужно только снизить загрузку цп. Я могу полинг и асинхронные сокеты сделать, но это просто не нужно в данной задаче.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

Твои знания в сетевом программировании нулевые, вместо того что бы злиться, пошел бы да прокачал их самостоятельно, тебе от души советуют,с помощью форумов и тем более лора такие знание не прокачиваются, если самообучаемость у тебя стремится к нулю, то сиди здесь дальше

anonymous
()
Ответ на: комментарий от Booster

нужно только снизить загрузку цп

Я могу полинг и асинхронные сокеты сделать, но это просто не нужно в данной задаче

Тогда заюзай green threads. Этого тут ещё не предлагали.

hateyoufeel ★★★★★
()
Ответ на: комментарий от Booster

Если по простому, то sleep пробовал не 0 ставить? Я в бусте не силен, не знаю что делает socket->available(). Но если сокет в большинстве случаев недоступен, то будет жор.

Dead ★★★★
()
Ответ на: комментарий от anonymous

с помощью форумов и тем более лора такие знание не прокачиваются

Ну почему же. Я вот C++ выучил поливая его говном на ЛОРе много лет назад под другим аккаунтом.

hateyoufeel ★★★★★
()
Ответ на: комментарий от anonymous

Да почему ты так уверен, что они нулевые? Думаешь не могу асинхронные сокеты в boost::asio использовать, это решит эту проблему моментально, но не хочу, просто не нужно.

Booster ★★
() автор топика

Asio и пул потоков, оно конечно не супер быстрое, но всё лучше, чем это :)

И необходимость в

На сервере заводится отдельный поток на каждого клиента

пропадёт сама собой.

Вообще - сетевым взаимодействием обычно занимается не более одного потока на ядро (и то это обычно много, если у тебя не 10G[+] железо установленно).

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

Асинхронный i/o как бэ рулит в простых случаях, осиль его.

pon4ik ★★★★★
()
Ответ на: комментарий от Booster

а кто решил что нужно в этой задаче? если бы я тебя нанимал на работу, то самое важное и нужное и за что действительно хочеться взять человека на работу, так это его умение правильно выстраивать архитектуру, а не просто налепить что бы это как то работало и показать - TASK DONE, - EPIC FAIL, таких говнокодеров пруд пруди, удивляйся дальше почему тебя никуда не берут

anonymous
()
Ответ на: комментарий от Booster

Ой не дочитал.

Слушай отвали уже. Ты мене не знаешь, чтобы судить о моих знаниях.

Ну тогда придумай как снизить нагрузку, раз ты такой знающий. Ещё про кроссплатформу вещаешь, до 2012 сервера у тебя воообще процентов 30 от твоего слипа будет уходить на то, что бы виндовый сетевой стек просрался.

pon4ik ★★★★★
()
Ответ на: комментарий от hateyoufeel

Ну почему же. Я вот C++ выучил поливая его говном на ЛОРе много лет назад под другим аккаунтом.

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

m0rph ★★★★★
()
Ответ на: комментарий от Booster

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

pon4ik ★★★★★
()
Ответ на: комментарий от Booster

Можно и без асинхронщины не жрать процессор. Что ты делаешь в клиентском потоке? Ждешь данных с клиента – используй блокирующий read. Ждешь события от основного потока? Используй мутексы. Говнокод, да.

staseg ★★★★★
()
Ответ на: комментарий от Booster

ты таймаут увеличил, чудо? тебе уже два раза сказали. это самый простой способ, одну цифру поменять. вполне вероятно эффект будет ожидаемый.

AndreyKl ★★★★★
()
Ответ на: комментарий от m0rph

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

Если ты не смог, это не значит, что другие не могут.

hateyoufeel ★★★★★
()
Ответ на: комментарий от hateyoufeel

Если ты не смог, это не значит, что другие не могут.

Насколько я понимаю, ты только что заявил, что _полностью_ выучил C++? Да ты крут!

m0rph ★★★★★
()
Ответ на: комментарий от Booster

не могу асинхронные сокеты в boost::asio использовать, это решит эту проблему моментально, но не хочу, просто не нужно.

Проблема-то у тебя оттого, что ты УЖЕ используешь неблокирующие вызовы, но пишешь при этом в блокирующем стиле.

Надо либо позволить send и recv ждать поступления данных, тогда твой поток отправится спать пока данные не уйдут или не придут. Либо поллить сокеты, тогда твой поток будет просыпаться при возможности принять или передать данные.

Сейчас ты используешь активное ожидание, что-то вроде спинлока. Этот подход по своей сути будет жрать CPU. Можно жор уменьшить, вставив задержки, но этим ты ограничишь предельную скорость и вносишь latency.

i-rinat ★★★★★
()

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

while(true) {
  
  size_t bytes_received = socket->receive(...);
  // работаем
}
Поток заснёт на вызове socket::receive() и проснётся когда приедут данные. Как вариант можно использовать asio::null_buffers, а затем посмотреть через socket::available(), сколько там приехало байт.

Euphorian
()
Ответ на: комментарий от Euphorian

Это не универсальное решение, так как на стороне отправителя нужно делать отправку данных, а они не всегда сразу готовы. Ладно вопрос снят, перешел на асинхронные сокеты.

Booster ★★
() автор топика

Не совсем кросс-платформенное - SO_REUSEPORT.

xpahos ★★★★★
()

что тебе нада?

chg ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.