2013-12-12 6 views
0

У меня есть поиск вопросов/ответов о близости процессора и чтение результатов, но я все еще не могу получить свои потоки, чтобы прибить к одному процессору.Почему системный монитор не показывает правильную близость процессора?

Я работаю над приложением, которое будет запускаться на выделенной Linux-ящике, поэтому меня не интересуют другие процессы, только мои собственные. Это приложение в настоящее время порождает один pthread, а затем основной поток входит в цикл while для обработки управляющих сообщений с использованием очередей POSIX msg. Это в то время как цикл блокирует ожидания ввода контрольного сообщения, а затем обрабатывает его. Таким образом, основной поток очень прост и не критичен. Мой код работает очень хорошо, так как я могу отправить это сообщение приложения, и он будет обрабатывать их просто отлично. Все управляющие сообщения очень маленькие по размеру и используются для простого управления функциональностью приложения, то есть только несколько управляющих сообщений когда-либо отправляются/получаются.

Прежде чем я войду в этот цикл while, я использую sched_getaffinity() для регистрации всех доступных ЦП. Затем я использую sched_setaffinity(), чтобы установить этот процесс на один процессор. Затем я снова вызываю sched_getaffinity(), чтобы проверить, будет ли он работать только на одном CPU, и это действительно правильно.

Единственный pthread, который был порожден, делает аналогичную вещь. Первое, что я делаю во вновь создаваемом pthread, это вызов pthread_getaffinity_np() и проверка доступных CPU, а затем вызов pthread_setaffinity_np(), чтобы установить его на другой процессор, затем вызвать pthread_getaffinity_np(), чтобы проверить, установлено ли оно по желанию, и это действительно верный.

Это то, что сбивает с толку. Когда я запускаю приложение и просматриваю историю CPU в системном мониторе, я не вижу никакого отличия от того, когда я запускаю приложение без всего этого набора атрибутов. Планировщик все еще выполняет пару секунд в каждом из четырех процессоров на этом четырехъядерном ящике. Таким образом, похоже, что планировщик игнорирует мои настройки близости.

Я ошибаюсь в ожидании увидеть некоторые доказательства того, что основной поток и pthread фактически работают в их собственном одном CPU? или я забыл сделать что-то еще, чтобы заставить это работать, как я собираюсь?

Спасибо,

-Andres

ответ

0

У вас нет ответа, я дам вам то, что я могу: некоторые частичная помощь

Предполагая, что вы проверили возвращаемые значения из pthread_setaffinity_np:

Как вы назначаете свой cpuset очень важно, создайте его в основном потоке. За то, что вы хотите. Он будет распространяться на последовательные потоки. Вы проверили коды возврата?

Вы, на самом деле, получите перекресток аппаратного обеспечения cpus и определяемого вами cpuset. min.h в приведенном ниже коде является общим файлом, включающим сборку. Вы должны определить _GNU_SOURCE - обратите внимание, что comment on the last line of the code.CPUSET и CPUSETSIZE являются макросами. Думаю, я определяю их где-то еще, я не помню. Они могут быть в стандартном заголовке.

#define _GNU_SOURCE 
#include "min.h" 
#include <pthread.h> 


int 
main(int argc, char **argv) 
{ 
    int s, j; 
    cpu_set_t cpuset; 
    pthread_t tid=pthread_self(); 

    // Set affinity mask to include CPUs 0 & 1 

    CPU_ZERO(&cpuset); 
    for (j = 0; j < 2; j++) 
     CPU_SET(j, &cpuset); 

    s = pthread_setaffinity_np(tid, sizeof(cpu_set_t), &cpuset); 
    if (s != 0) 
    { 
     fprintf(stderr, "%d ", s); 
     perror(" pthread_setaffinity_np"); 
     exit(1); 
    } 
    // lets see what we really have in the actual affinity mask assigned our thread 

    s = pthread_getaffinity_np(tid, sizeof(cpu_set_t), &cpuset); 
    if (s != 0) 
    { 
     fprintf(stderr, "%d ", s); 
     perror(" pthread_setaffinity_np"); 
     exit(1); 
    } 

    printf("my cpuset has:\n"); 
    for (j = 0; j < CPU_SETSIZE; j++) 
     if (CPU_ISSET(j, &cpuset)) 
      printf(" CPU %d\n", j); 
    // @Andres note: any pthread_create call from here on creates a thread with the identical 
    // cpuset - you do not have to call it in every thread. 
    return 0; 
} 
Смежные вопросы