¿Cuántos núcleos estoy usando en un servidor Linux?

30

Me pregunto cómo puedo averiguar en bash cuántos núcleos de CPU está utilizando un usuario en un servidor Linux.

Estoy enviando una buena cantidad de trabajos en segundo plano al servidor, por lo que me gustaría escribir un script bash para verificar antes de enviar un trabajo si los trabajos (procesos) en ejecución enviados por mí son demasiados, porque tengo que dejar que otros los usuarios tienen suficientes núcleos para usar en sus trabajos. Me gustaría saber qué comando bash puede decirme cuántos núcleos están usando mis trabajos ahora.

¡Gracias y saludos!

Tim
fuente

Respuestas:

39

Para obtener el número de núcleos de CPU por CPU:

grep "^core id" /proc/cpuinfo | sort -u | wc -l

O para obtener el número de CPU físicas :

grep "^physical id" /proc/cpuinfo | sort -u | wc -l
Alix Axel
fuente
¿Cómo verificar esto para un usuario determinado?
makis
26

No sé si ayuda, pero puede usar la mpstatutilidad para obtener un desglose del uso de la CPU por procesador individual (o núcleo). Por ejemplo:

$ mpstat -P ALL 1

12:49:59 PM  CPU   %user   %nice    %sys %iowait    %irq   %soft  %steal   %idle    intr/s
12:50:00 PM  all    7.89    0.00    1.25    0.88    0.00    0.00    0.00   89.97   1359.00
12:50:00 PM    0   14.00    0.00    0.00    0.00    0.00    0.00    0.00   86.00   1043.00
12:50:00 PM    1   15.84    0.00    7.92    3.96    0.00    0.99    0.00   71.29    297.00
12:50:00 PM    2    3.96    0.00    0.00    1.98    0.00    0.99    0.00   93.07      0.00
12:50:00 PM    3    3.96    0.00    0.99    2.97    0.00    0.00    0.00   92.08      0.00
12:50:00 PM    4    4.00    0.00    0.00    0.00    0.00    0.00    0.00   96.00      0.00
12:50:00 PM    5    4.95    0.00    0.99    0.00    0.00    0.00    0.00   94.06     18.00
12:50:00 PM    6   10.89    0.00    0.99    0.00    0.00    0.00    0.00   88.12      0.00
12:50:00 PM    7    5.05    0.00    0.00    0.00    0.00    0.00    0.00   94.95      0.00

En este ejemplo, se puede ver que de la CPU 0, 1y 6están haciendo más trabajo que el resto de ellos. A veces verá que una sola CPU está cerca (o al) 100%, mientras que otras están en cero. Esto puede ser un indicador de programa (o parte de un programa) que tiene un solo subproceso y solo puede usar una sola CPU a la vez.

Para instalar mpstaten un sistema Fedora, RHEL o CentOS, use yum install sysstat.

Matt Solnit
fuente
¡Un millón de gracias por dar esta respuesta! Mis colegas usaban el comando "superior" y sacaban conclusiones erróneas sobre la utilización del procesador hasta que les mostré el comando mpstat.
Nav
No disponible en Ubuntu: # aptitude search mpstat #.
Alix Axel
2
@AlixAxel intente en su aptitude search systatlugar.
Matt Solnit
@MattSolnit: Todavía no tuve suerte.
Alix Axel
mpstat es proporcionado por el paquete sysstat en Debian y en Ubuntu . Esperaría que la mayoría de las distribuciones derivadas de Debian usen el mismo nombre de paquete. En las distribuciones derivadas de Debian, comience por apt-cache search --full mpstat.
un CVn
2

A menos que esté configurado explícitamente para no (es decir, fijar un proceso a una CPU específica), se puede suponer que todos los núcleos están en uso en todo momento. El planificador asignará procesos al siguiente núcleo disponible. Caso en cuestión, "Monitor de sistema" (parte de GNOME) muestra mi carga casi igual en los 4 núcleos de mi máquina.

EmmEff
fuente
Estoy enviando una buena cantidad de trabajos en segundo plano al servidor, por lo que me gusta escribir un script bash para verificar antes de enviar un trabajo si los trabajos (procesos) enviados por mí son demasiados, porque tengo que dejar que otros usuarios tengan suficientes núcleos para usar en sus trabajos. Entonces, me gusta saber qué comando bash puede decirme cuántos núcleos están usando mis trabajos ahora.
Tim
3
No creo que hayas entendido mi respuesta. El número de núcleos en uso SIEMPRE es el número total de núcleos disponibles. Use la carga general del sistema como un factor para determinar si su envío de trabajo debe ser acelerado o no.
EmmEff 01 de
¡Gracias! Verifico la carga general del sistema. Uno de mis colegas me dijo que no puedo usar todos los núcleos porque quién sabe si otros ejecutarán sus trabajos pronto y mis trabajos durarán bastante tiempo. ¿También crees que tengo que limitar los núcleos que estoy usando?
Tim
2

Entonces verá que hay respuestas aquí que le dirán cómo se están utilizando sus núcleos.

SIN EMBARGO - esto realmente no te está haciendo un servicio. Has hecho una suposición básica que simplemente no es válida: que tus trabajos tenderán a agruparse en algún subconjunto de núcleos.

En cambio, sus trabajos se distribuirán en todos los núcleos, a menos que implemente algo que los mantenga "encerrados" de alguna manera. (Nota: no lo recomiendo; solo digo "a menos que")

Aquí hay una estrategia alternativa: identifique para su sistema particular cuál es el nivel de CARGA cuando considere que es "aceptable" que otros usuarios agreguen más trabajos. Luego, cree algo que solo envíe un nuevo trabajo en segundo plano cuando el nivel de carga esté por debajo de ese límite.

De esa manera, la solución será independiente del conteo de núcleos, más portátil, más flexible y más fácil de "ajustar".

pbr
fuente
Acabo de notar un comentario que agregaste a la respuesta de otro póster, indicando que esto se debe a algo que un colega te dijo. Entonces, de hecho, parece que la idea falsa es suya, no tuya. ¡Lo siento por eso!
pbr
¡Gracias! En cuanto a "Identificar para su sistema particular cuál es el nivel de CARGA cuando considera que es" aceptable "que otros usuarios agreguen más trabajos", si la carga actual no es causada principalmente por mis trabajos en ejecución, me sentiría más libre de usar el resto de las CPU, pero si en la carga actual mis trabajos en ejecución toman una cantidad considerable, entonces probablemente tenga que renunciar a usar las CPU restantes. Entonces, ¿todavía cree que no tengo que estimar el uso de CPU de mis trabajos en ejecución totales?
Tim
No, realmente no creo que tenga sentido distinguir entre la cantidad de carga actual de sus trabajos y otros trabajos. Considere la simplicidad: su trabajo trata de ser un buen ciudadano, y solo se presenta si la carga está por debajo de un nivel que considera aceptable. La idea es NUNCA utilizar toda la capacidad restante; eso deja a otros futuros usuarios en apuros. Idealmente, todos los usuarios estarían usando la misma lógica para esto.
pbr
2

Si desea hacer esto para que funcione en Linux y OS X, puede hacer lo siguiente:

CORES=$(grep -c ^processor /proc/cpuinfo 2>/dev/null || sysctl -n hw.ncpu)
tim_yates
fuente
1

Puede obtener una estimación aproximada ejecutando top, presionando ' U' y especificando su nombre de usuario, y luego sumando la utilización de la CPU de sus pocos procesos principales.

dmckee
fuente
Me gusta conocer un comando bash que me puede decir el número, ya que quiero usarlo en un script bash.
Tim
@Tim toppuede ejecutarse en modo por lotes con el modificador -b. Combínelo con el modificador -n para obtener la cantidad de iteraciones que necesita.
nagul
1
¿Puede dar un ejemplo de código para obtener el número de núcleos utilizados por todos los trabajos (procesos) enviados por un usuario?
Tim
@Tim No fuera del bate. Tendría que escribir tal script analizando la topsalida o google para ver si alguien ya lo ha hecho. Sin embargo, no estoy convencido de que valga la pena el esfuerzo porque creo que obtendré diferentes resultados para cada ejecución dada la velocidad a la que ocurre el cambio de contexto. ¿No es el sistema cargar un indicador suficientemente bueno? Efectivamente le dice cuántos núcleos virtuales son necesarios para manejar la cola de procesos (procesos que esperan en la CPU).
nagul
@ nagul: Sí, la carga del sistema es buena y también lo compruebo. Sin embargo, algunas personas siguen diciéndome que no puedo usar todos los núcleos porque quién sabe si otros ejecutarán sus trabajos pronto. Así que supongo que tengo que limitar los núcleos que estoy usando. Por cierto, ¿ha visto en algún lugar scripts en línea que verifican la carga de la CPU y la memoria y envían trabajos dinámicamente en función del uso? Los he estado buscando por mucho tiempo. ¡Gracias!
Tim