Russian Qt Forum
Май 04, 2024, 19:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: оптимизация обработки запросов  (Прочитано 7955 раз)
Karl-Philipp
Гость
« : Август 30, 2009, 16:21 »

Допустим есть сервер, принимающий некоторые запросы. Время обработки запроса может достигать нескольких секунд(проводятся вычисления), при этом сильно загружается процессор. Если пришло сразу несколько запросов и они загружаются для обработки, то скорость работы сервера предположительно уменьшится. Важно, чтобы каждый запрос обрабатывался как можно меньше времени.
На сервере имеется двухядерный процессор. Запросы должны обрабатываться некоторой программкой.

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

Вот как я себе это представляю:
Пришёл запрос - создать тред, запустить программу обработки запроса на одном ядре. Пришёл еще один запрос - запустить второй тред (на втором ядре) с программкой обработки запроса. Если оба ядра заняты обработкой запросов - поставить очередной пришедший запрос в очередь.

Правильно ли так делать?
Если да, то как назначить, чтобы каждый тред выполнялся на определенном (свободном) ядре?
Записан
spectre71
Гость
« Ответ #1 : Август 30, 2009, 16:39 »

Только через нативные методы.
А вообще не советую этим заниматься, это задача операционки делать affinity для thread, и явное использование привязки как правило ухудьшает производительность! Не забудь так же что в системе живет куча других процессов.
Можешь просто получить кол-во ядер и создавать соответствующее кол-во потоков, без привязки их к конкретным ядрам. Так будет правильнее и намного проще.
Записан
Karl-Philipp
Гость
« Ответ #2 : Август 30, 2009, 17:04 »

Цитировать
...Можешь просто получить кол-во ядер и создавать соответствующее кол-во потоков, без привязки их к конкретным ядрам. Так будет правильнее и намного проще.
Спасибо. А получить количество ядер - это выходит платформозависимый код?
Записан
spectre71
Гость
« Ответ #3 : Август 30, 2009, 17:31 »

Цитировать
...Можешь просто получить кол-во ядер и создавать соответствующее кол-во потоков, без привязки их к конкретным ядрам. Так будет правильнее и намного проще.
Спасибо. А получить количество ядер - это выходит платформозависимый код?

Да.
Под виндой, копай в сторону NtQuerySystemInformation
« Последнее редактирование: Август 30, 2009, 17:33 от Spectre » Записан
Rcus
Гость
« Ответ #4 : Август 30, 2009, 17:36 »

Цитировать
int QThread::idealThreadCount ()   [static]

Returns the ideal number of threads that can be run on the system. This is done querying the number of processor cores, both real and logical, in the system. This function returns -1 if the number of processor cores could not be detected.
Записан
Karl-Philipp
Гость
« Ответ #5 : Август 30, 2009, 17:53 »

Spectre, Rcus, спасибо большое Улыбающийся
Записан
spectre71
Гость
« Ответ #6 : Август 30, 2009, 19:17 »

Цитировать
int QThread::idealThreadCount ()   [static]

Returns the ideal number of threads that can be run on the system. This is done querying the number of processor cores, both real and logical, in the system. This function returns -1 if the number of processor cores could not be detected.
О... А я это просмотрел Плачущий

Кстати, для более правильной баллансировки нагрузки, надо еще знать загрузку CPU усредненную на небольшом итервале.
Тогда если:
int cpu_state;// 0-100% усредненная загрузка CPU за 50-500 ms
const int cpu_delta;// 10-30% - некоторый порог, выбирается из расчета, что издержки на переключение между Threads в системе <= cpu_delta
int cpu_count; //кол-во ядер
int thr_count; //кол-во уже запущенных Thread
bool can_add; //можно ли добавить Thread.

can_add = !thr_count  || ((100-cpu_state)*cpu_count) > cpu_delta;

Что-то типа того, в простом варианте.




Записан
Karl-Philipp
Гость
« Ответ #7 : Август 30, 2009, 19:42 »

Кстати на счёт узнать количество ядер (платформозвисимый код):
http://stackoverflow.com/questions/150355/programmatically-find-the-number-of-cores-on-a-machine
upd:
вот что еще накопал:
Код:
#if defined(Q_OS_UNIX) && !defined(Q_OS_MACX)
#   include <unistd.h>
#elif defined(Q_OS_MACX)
#   include <mach/mach.h>
#   include <mach/machine.h>
#endif

/*****************************************************************************
 *
 * static functions used to init Class PDefaults
 *
 *****************************************************************************/

static int getCpuCount()
{
    int cpuCount = 1;

#if defined(Q_OS_WIN32) || defined(Q_OS_WIN64)
    {
SYSTEM_INFO    si;
GetSystemInfo(&si);
cpuCount = si.dwNumberOfProcessors;
    }
#elif defined(Q_OS_UNIX) && !defined(Q_OS_MACX)
    cpuCount = sysconf(_SC_NPROCESSORS_ONLN);
#elif defined(Q_OS_MACX)
   kern_return_t kr;
   struct host_basic_info hostinfo;
   unsigned int count;

   count = HOST_BASIC_INFO_COUNT;
   kr = host_info(mach_host_self(), HOST_BASIC_INFO, (host_info_t)&hostinfo, &count);
   if(kr == KERN_SUCCESS) {
cpuCount = hostinfo.avail_cpus;
// totalMemory = hostinfo.memory_size; //in bytes
   }

#endif

    if( cpuCount < 1 )
cpuCount = 1;

    return cpuCount;
}
« Последнее редактирование: Август 30, 2009, 20:03 от terlan » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #8 : Август 31, 2009, 15:46 »

Не проверял, но, как говорится, "заслуживает внимания" QThread::idealThreadCount
Вообще я бы не заморачивался здесь с оптимизацией (угадать/попасть очень сложно) а спихнул бы все на пользователя: пусть он задает число threads, по умолчанию idealThreadCount. По-любому Вам надо планировать для N threads
Записан
Karl-Philipp
Гость
« Ответ #9 : Август 31, 2009, 15:50 »

да-да, спасибо Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.053 секунд. Запросов: 22.