Можете ли вы переопределить использование ядра ЦП в уже запущенном процессе? [закрыто]

Las dos cosas que te faltan aquí son:

  1. docker exec... <command>no ejecuta <command>en un shell de forma predeterminada, solo ejecuta <command>en el contenedor sin shell.

    Si desea ejecutar un comando en la ventana acoplable en un shell interactivo no -, utilice:

    docker exec <container> bash -c '<command>'
    

    Si <command>tiene más de una palabra, debe estar entre comillas simples -o dobles -para que el comando completo se pase a bash -c.

    por ej.sudo docker exec 2543e7235fa9 bash -c 'echo $XYZ'

 

  1. Cuando haces eso, hay dos caparazones que importan:

    • el shell que está ejecutando sudo docker exec...en (llámelo "Shell A")
    • el shell que se ejecuta dentro del contenedor (lo llama "Shell B" ).

     

    Si no barra invertida -escape o cita -$en el shell A, entonces el shell A interpolará su propio valor para$XYZ(incluso si no lo hace tener uno, que devuelve una cadena vacía ).

    Entonces, si XYZ=5en Shell A, entonces su sudo docker exec 2543e7235fa9 echo $XYZes lo mismo queexec 2543e7235fa9 echo 5(y no habría Shell B porque no le dijo a Docker que ejecutarabash -c...).

    Si realiza escape o -comilla simple $, entonces se pasa al shell B como -, y el shell B interpola su valor para $XYZ.

En otras palabras, utilice:

sudo docker exec 2543e7235fa9 bash -c 'echo $XYZ'

o

sudo docker exec 2543e7235fa9 bash -c "echo \$XYZ"

El formulario único -citado es, en mi opinión, más fácil de entender lo que está haciendo y lo que debe usar la mayor parte del tiempo. No ocurre ninguna interpolación de variables dentro de comillas simples -, por lo que el comando se pasa exactamente como está al shell B.

La forma de comillas dobles -es útil cuando necesita pasar variables del shell A al shell B. Si también necesita pasar un literal $entonces debe tener una barra invertida -con escape. p.ej.para hacer que el shell B haga eco del shell A $ABCy el suyo propio$XYZ:

sudo docker exec 2543e7235fa9 bash -c "echo $ABC \$XYZ"

Si el shell A $ABCes igual a 10y el shell B $XYZes igual a 123, entonces generaría:

10 123

Tenga en cuenta :a menos que $XYZesté definido en uno de los archivos de inicio de shell B, o con docker run -e XYZ=123como usó en su ejemplo (o con -env-file), no tendrá un valor.

0
25.01.2017, 14:32
2 ответа

Не совсем.

Это, конечно, нельзя сделать переносным способом. Вы не указали, в какой системе вы пытаетесь это сделать. Я предполагаю, что это Linux, так как это то, что я знаю лучше всего, но не стесняйтесь уточнить.

Ядро Linux имеет два системных вызова, связанных с «сходством процессора», sched_setaffinity () и sched_getaffinity () . Их можно использовать, чтобы сообщить ядру, на каких ядрах процесс может запускаться. Если количество процессоров меньше, чем количество потоков, которые процесс в настоящее время использует, то по необходимости он начнет использовать меньше ядер. Однако проблема с этим методом заключается в том, что он заставляет определенный набор ядер ЦП для запуска процесса. Если это работа с интенсивным использованием ЦП, то это означает, что эти ядра могут нагреваться; если система не имеет достаточного охлаждения для охлаждения процессора, чтобы это было менее проблематично, то обычно решение заключается в том, что ядро ​​перенастраивает рассматриваемый процесс на другое ядро, позволяя тому, которое только что использовалось для охлаждения немного тем временем. При принудительном запуске набора ядер этот метод больше не работает, и вместо этого ядру придется вернуться к изменению частоты процессора. Однако, если вы пытаетесь ограничить количество ядер, потому что есть и другие процессы, которым вы хотите выделить некоторое время ЦП, то это, вероятно, не имеет большого значения.

К системным вызовам sched_setaffinity () и sched_getaffinity () можно получить доступ из командной строки с помощью команды taskset :

taskset -p 0x3 $PID

сообщит ядру что процесс с pid $ PID с этого момента может выполняться только на ядрах процессора 0 и 1. (0x3 - это битовая маска, где бит 1 относится к ядру 0, а бит 2 относится к ядру 1).

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

0x1 - cpu0
0x2 - cpu1
0x3 - cpu0 and cpu1
0x4 - cpu2
0x5 - cpu0 and cpu2
0x6 - cpu1 and cpu2
0x7 - cpu0, cpu1 and cpu2
0x8 - cpu3
0x9 - cpu0 and cpu3
0xA - cpu1 and cpu3
0xB - cpu0, cpu1 and cpu3
0xC - cpu2 and cpu3
0xD - cpu0, cpu2 and cpu3
0xE - cpu1, cpu2 and cpu3
0xF - cpu0, cpu1, cpu2 and cpu3
2
29.04.2021, 00:05

Я нашел способ !!

cpulimit отлично подходит для этого:

https://github.com/opsengine/cpulimit

0
29.04.2021, 00:05

Теги

Похожие вопросы