Невозможно выделить исключительно процессор для моего процесса
У меня есть простое однопоточное приложение, которое выполняет почти чистую обработку
- Он использует два целых буфера одинакового размера
- Он читает по одному все значения первого буфера
- каждое значение является случайным индексом во втором буфере
- Читает значение по индексу во втором буфере
- Суммирует все значения, взятые из второго буфера
- Это делает все предыдущие шаги для большего и большего
- В конце я печатаю количество произвольных и непроизвольных переключений контекста процессора
Если размер буферов становится достаточно большим, мой компьютер начинает замедляться: почему? У меня 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
команда?
Кстати, если вы хотите добиться меньшего времени выполнения, я предлагаю вам сделать многопоточное приложение и позволить операционной системе, а также аппаратному обеспечению ниже распараллеливать выполнение. Блокировка процесса для набора ЦП и предотвращение его переключения контекста может снизить производительность операционной системы и не является переносимым решением.