У меня есть простое однопоточное приложение, которое выполняет почти чистую обработку
- Он использует два буфера int одинакового размера.
- It reads one-by-one all the values of the first buffer
- each value is a random index in the second buffer
- Он считывает значение по индексу во втором буфере.
- Суммирует все значения, взятые из второго буфера
- Он делает все предыдущие шаги для большего и большего размера
- В конце я печатаю количество добровольных и непроизвольных переключений контекста ЦП.
Если размер буферов становится довольно большим, мой компьютер начинает тормозить: почему? У меня 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 задач на моем процессоре. Но я знаю, что на нем запущен процесс: вроде задача не процесс?