Russian Qt Forum

Программирование => Алгоритмы => Тема начата: Karl-Philipp от Август 30, 2009, 16:21



Название: оптимизация обработки запросов
Отправлено: Karl-Philipp от Август 30, 2009, 16:21
Допустим есть сервер, принимающий некоторые запросы. Время обработки запроса может достигать нескольких секунд(проводятся вычисления), при этом сильно загружается процессор. Если пришло сразу несколько запросов и они загружаются для обработки, то скорость работы сервера предположительно уменьшится. Важно, чтобы каждый запрос обрабатывался как можно меньше времени.
На сервере имеется двухядерный процессор. Запросы должны обрабатываться некоторой программкой.

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

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

Правильно ли так делать?
Если да, то как назначить, чтобы каждый тред выполнялся на определенном (свободном) ядре?


Название: Re: оптимизация обработки запросов
Отправлено: spectre71 от Август 30, 2009, 16:39
Только через нативные методы.
А вообще не советую этим заниматься, это задача операционки делать affinity для thread, и явное использование привязки как правило ухудьшает производительность! Не забудь так же что в системе живет куча других процессов.
Можешь просто получить кол-во ядер и создавать соответствующее кол-во потоков, без привязки их к конкретным ядрам. Так будет правильнее и намного проще.


Название: Re: оптимизация обработки запросов
Отправлено: Karl-Philipp от Август 30, 2009, 17:04
Цитировать
...Можешь просто получить кол-во ядер и создавать соответствующее кол-во потоков, без привязки их к конкретным ядрам. Так будет правильнее и намного проще.
Спасибо. А получить количество ядер - это выходит платформозависимый код?


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

Да.
Под виндой, копай в сторону NtQuerySystemInformation


Название: Re: оптимизация обработки запросов
Отправлено: Rcus от Август 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.


Название: Re: оптимизация обработки запросов
Отправлено: Karl-Philipp от Август 30, 2009, 17:53
Spectre, Rcus, спасибо большое :)


Название: Re: оптимизация обработки запросов
Отправлено: spectre71 от Август 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;

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






Название: Re: оптимизация обработки запросов
Отправлено: Karl-Philipp от Август 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;
}


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


Название: Re: оптимизация обработки запросов
Отправлено: Karl-Philipp от Август 31, 2009, 15:50
да-да, спасибо :)