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

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

  1. Он использует два буфера int одинакового размера.
  2. It reads one-by-one all the values of the first buffer
    • each value is a random index in the second buffer
  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

Если у меня были непроизвольные переключения контекста, значит, на моем ядре запущены другие процессы: Как это возможно? Что я должен сделать, чтобы получить Число непроизвольных переключений контекста = 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 задач на моем процессоре. Но я знаю, что на нем запущен процесс: вроде задача не процесс?


person Philippe MESMEUR    schedule 19.11.2016    source источник


Ответы (1)


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

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

Что нужно сделать, чтобы количество непроизвольных переключений контекста было равно 0?

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

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

person nandsito    schedule 19.11.2016