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

У меня есть простое однопоточное приложение, которое выполняет почти чистую обработку

  1. Он использует два целых буфера одинакового размера
  2. Он читает по одному все значения первого буфера
    • каждое значение является случайным индексом во втором буфере
  3. Читает значение по индексу во втором буфере
  4. Суммирует все значения, взятые из второго буфера
  5. Это делает все предыдущие шаги для большего и большего
  6. В конце я печатаю количество произвольных и непроизвольных переключений контекста процессора

Если размер буферов становится достаточно большим, мой компьютер начинает замедляться: почему? У меня 4 ядра с гиперпоточностью, так что 3 ядра остаются. Только один занят на 100%. Это потому, что мой процесс использует почти 100% для "RAM-шины"?

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

$ cat /sys/devices/system/cpu/cpu3/topology/core_id 
3
$ cat /sys/devices/system/cpu/cpu7/topology/core_id 
3

$ cset set -c 3,7 -s my_cpuset
$ cset set -l
cset: 
         Name       CPUs-X    MEMs-X Tasks Subs Path
 ------------ ---------- - ------- - ----- ---- ----------
         root        0-7 y       0 y   934    1 /
    my_cpuset        3,7 n       0 n     0    0 /my_cpuset

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

$ taskset -c 7 ./TestCpuset # Here, I launch my process
...
$ ps -mo pid,tid,fname,user,psr -p 25244 # 25244 being the PID of my process
  PID   TID COMMAND  USER     PSR
25244     - TestCpus phil       -
    - 25244 -        phil       7

PSR = 7: мой процесс хорошо работает на ожидаемом потоке процессора. Я надеюсь, что он работает только на нем, но в конце мой процесс отображает:

Number of voluntary context switch:   2
Number of involuntary context switch: 1231

Если у меня были невольные переключения контекста, это означает, что другие процессы выполняются на моем ядре: как это возможно? Что я должен сделать для того, чтобы получить Number of вынужденное переключение контекста = 0?

Последний вопрос: когда мой процесс запущен, если я запускаю

$ cset set -l
cset: 
         Name       CPUs-X    MEMs-X Tasks Subs Path
 ------------ ---------- - ------- - ----- ---- ----------
         root        0-7 y       0 y  1031    1 /
    my_cpuset        3,7 n       0 n     0    0 /my_cpuset

Еще раз я получаю 0 заданий на моем процессоре. Но я знаю, что на нем запущен процесс: кажется, что задача - это не процесс?

1 ответ

Если размер буферов становится достаточно большим, мой компьютер начинает замедляться: почему? У меня 4 ядра с гиперпоточностью, так что 3 ядра остаются. Только один занят на 100%. Это потому, что мой процесс использует почти 100% для "RAM-шины"?

Вы достигли аппаратного предела производительности однопоточного приложения, то есть 100% процессорного времени на одном процессоре, на который выделена ваша программа. Поток вашего приложения не будет работать одновременно на нескольких процессорах (ссылка).

Что я должен сделать для того, чтобы получить Number of вынужденное переключение контекста = 0?

Вы не пропали --cpu_exclusive вариант в cset set команда?

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

Другие вопросы по тегам