Чтение страницы руководства bash
дает следующую информацию:
for ((expr1; expr2; expr3)) ; сделать список; done
Сначала арифметическое выражение
expr1
вычисляется в соответствии с правилами, описанными ниже в разделе «АРИФМЕТИЧЕСКАЯ ОЦЕНКА». [...]
и затем мы получаем этот раздел
АРИФМЕТИЧЕСКАЯ ОЦЕНКА
Оболочка позволяет вычислять арифметические выражения при определенных обстоятельствах (см.
let
иобъявить
встроенные команды и арифметическое расширение). Оценка выполняется в целых числах фиксированной ширины без проверки переполнения [...]
Таким образом, ясно видно, что вы не можете использовать цикл for
с нецелочисленными значениями. .
Одним из решений может быть простое умножение всех компонентов цикла на 100, что позволяет использовать их в дальнейшем, например:
for ((k=400;k<542;k+=2))
do
i=$(bc <<<"scale=2; $k / 100" ) # when k=402 you get i=4.02, etc.
...
done
Primero abra la terminal y haga cat /proc/cpuinfo
para listar todos los núcleos. Núcleo 0 = 1.er núcleo, Núcleo 1 = 2.º núcleo...
Entonces
CORENUM=0
ps -e -o pid,psr,cpu,cmd | grep -E "^[[:space:]][[:digit:]]+[[:space:]]+${CORENUM}"
para ver qué tiene el núcleo 1 (, reemplace 0 en CORENUM=
con el número de núcleo deseado )asignado.
En circunstancias normales, los procesos de Linux no se anclan explícitamente a un núcleo determinado; por lo general, no hay razón para hacerlo, pero es posible.
Puede administrar la afinidad de los procesos usando taskset
o ver qué proceso se ejecuta en qué CPU en el instante presente usando ps con el campo 'psr'.
Comprobar la afinidad de CPU actual del proceso 27395:
$ ps -o psr 27395
PSR
6
Verifique la lista de afinidad del proceso 27395:
$ taskset -pc 27395
pid 27395's current affinity list: 0-7
Establecer afinidad del proceso 27395 a la CPU 3
$ taskset -pc 3 27395
pid 27395's current affinity list: 0-7
pid 27395's new affinity list: 3
Comprobar la afinidad de CPU actual del proceso 27395:
$ ps -o psr 27395
PSR
3
Para verificar si algún proceso está anclado a cualquier CPU, puede recorrer los identificadores de su proceso y ejecutar taskset -p
contra ellos:
$ for pid in $(ps -a -o pid=); do taskset -pc $pid 2>/dev/null; done
pid 1803's current affinity list: 0-7
pid 1812's current affinity list: 0-7
pid 1986's current affinity list: 0-7
pid 2027's current affinity list: 0-7
pid 2075's current affinity list: 0-7
pid 2083's current affinity list: 0-7
pid 2122's current affinity list: 0-7
pid 2180's current affinity list: 0-7
pid 2269's current affinity list: 0-7
pid 2289's current affinity list: 0-7
pid 2291's current affinity list: 0-7
pid 2295's current affinity list: 0-7
pid 2300's current affinity list: 0-7
pid 2302's current affinity list: 0-7
pid 3872's current affinity list: 0-7
pid 4339's current affinity list: 0-7
pid 7301's current affinity list: 0-7
pid 7302's current affinity list: 0-7
pid 7309's current affinity list: 0-7
pid 13972's current affinity list: 0-7
Вы можете использовать переключатель -F
на ps
, чтобы увидеть, на каком ядре (vCPU )процесс выполняется в данный момент. В столбце PSR указано, какой:
$ man ps
...
psr PSR processor that process is currently assigned to.
...
Например,:
$ ps -Fae | head
UID PID PPID C SZ RSS PSR STIME TTY TIME CMD
root 1 0 0 211946 655576 13 Oct17 ? 00:51:28 /usr/lib/systemd/systemd --system --deserialize 14
root 2 0 0 0 0 16 Oct17 ? 00:00:02 [kthreadd]
root 6 2 0 0 0 0 Oct17 ? 00:50:36 [ksoftirqd/0]
root 7 2 0 0 0 0 Oct17 ? 00:02:04 [migration/0]
root 8 2 0 0 0 0 Oct17 ? 00:00:00 [rcu_bh]
root 9 2 0 0 0 0 Oct17 ? 02:02:22 [rcu_sched]
root 10 2 0 0 0 5 Oct17 ? 00:00:00 [lru-add-drain]
root 11 2 0 0 0 0 Oct17 ? 00:00:10 [watchdog/0]
root 12 2 0 0 0 1 Oct17 ? 00:00:09 [watchdog/1]
Нечто подобное можно сделать, используя top
и выбрав поле P
, добавив его через f .
- P -- Last used CPU (SMP)
A number representing the last used processor. In a true SMP environment this will likely change frequently since the kernel intentionally uses weak affinity. Also, the very act of running top may break this weak affinity and cause more processes to change CPUs more often (because of the extra demand for cpu time).
Например,.:
Tasks: 623 total, 3 running, 620 sleeping, 0 stopped, 0 zombie
%Cpu(s): 8.7 us, 11.0 sy, 0.0 ni, 79.2 id, 0.1 wa, 0.0 hi, 1.0 si, 0.0 st
KiB Mem : 26397158+total, 18521476+free, 35842280 used, 42914536 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 22101484+avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND P
2061 root 20 0 414648 15104 9068 S 38.6 0.0 2:06.82 sssd_be 2
58915 root 20 0 2366608 130232 12288 S 29.5 0.0 478:46.62 filebeat 15
4851 root 20 0 3740952 125192 18412 S 15.9 0.0 2944:25 metricbeat 4
104253 1007430+ 20 0 16.0t 2.0g 1.6g S 13.6 0.8 138:59.97 java 3
7617 root 20 0 5160288 399292 49324 S 11.4 0.2 12066:35 hyperkube 5
100062 1002840+ 20 0 52440 17892 3800 R 11.4 0.0 0:00.34 cub 8
100202 smingol+ 20 0 172872 2984 1712 R 11.4 0.0 0:00.09 top 8
112115 1007680+ 20 0 5747228 1.2g 23428 S 11.4 0.5 1457:10 java 11
2645 root 20 0 5425332 253544 18132 S 9.1 0.1 4549:50 dockerd-current 12
Если вас больше интересует привязка процесса к конкретному виртуальному ЦП, вы можете использовать для этого taskset
. Ниже мы видим процесс (sleep
), который был привязан к конкретным vCPU в 1-м примере и разрешен для запуска на любом во 2-м:
$ taskset -c 0,2,4,6 sleep 10000 &
[1] 119472
$ taskset -cp 119472
pid 119472's current affinity list: 0,2,4,6
$ sleep 10001 &
[2] 85436
$ taskset -cp 85436
pid 85436's current affinity list: 0-71
Чтобы увидеть все процессы на ящике:
$ ps -ae -o pid= | xargs -n 1 taskset -cp
pid 116921's current affinity list: 47
pid 117171's current affinity list: 0-71
pid 117189's current affinity list: 0-71
pid 117248's current affinity list: 36
pid 117665's current affinity list: 0-71
pid 117681's current affinity list: 10
pid 118635's current affinity list: 0-71
pid 118665's current affinity list: 0-71
pid 118873's current affinity list: 44
pid 119472's current affinity list: 0,2,4,6
...