Análisis de rendimiento Utilización de la CPU del servidor Linux

Métricas de CPU

1. Rango de índice

1.1 Uso de CPU en modo de usuario + Uso de CPU en modo de sistema

Valor razonable: 60-85%. Si el tiempo de us + sy excede el 85% en un sistema multiusuario, el proceso puede tardar en esperar en la cola de ejecución, y el tiempo de respuesta y el rendimiento comercial se verán comprometidos; si demasiado grande, significa Hay procesos de usuario que consumen mucho tiempo de CPU y necesitan analizar más otros factores de software y hardware; sy es demasiado grande, lo que indica que se ha dedicado mucho tiempo a la administración del sistema, lo que indica que El subsistema del sistema tiene un cuello de botella y otros factores de software y hardware deben analizarse más a fondo.

1.2 Wa (espera)

Valor de referencia: un valor de wa inferior al 25% y superior al 25% puede indicar que el subsistema del disco puede no estar correctamente equilibrado o puede ser el resultado de cargas de trabajo intensivas en el disco. Puede haber problemas con el disco u otros / o del sistema. Puede utilizar el comando iostat / SAR -C para un análisis más detallado

1.3 Id (inactivo)

Valor de referencia: mayor que 40, si r es a menudo mayor que 4 y el id es a menudo menor que 40, significa que la carga de la CPU es muy pesada

1,4 r

Valor de referencia: menor que 4, cuando la cola es mayor que 4, indica que puede haber un problema con la CPU o la memoria del sistema. Si r es a menudo mayor que 4, y el id es a menudo menor que 40, significa que el La CPU está muy cargada. Cuando la cola se hace más larga, el tiempo que pasan los procesos en la cola esperando la ejecución de la programación de la CPU será más largo

1.5 El método para juzgar el cuello de botella de la CPU

Tiempo de respuesta muy lento (tiempo de respuesta lento)

El tiempo de inactividad de la CPU es cero (cero por ciento de la CPU inactiva)

Los usuarios demasiado grandes ocupan tiempo de CPU (porcentaje alto de CPU de usuario)

Un sistema demasiado alto ocupa tiempo de CPU (porcentaje alto de CPU del sistema)

Durante mucho tiempo, hay una cola de proceso de ejecución muy larga (tamaño de la cola de ejecución grande sostenido en el tiempo)

2. Cómo comprobar la utilización de la CPU

2.1 Utilice el comando superior para ver

Los datos provienen del archivo / proc / stat
Inserte la descripción de la imagen aquí

%us =(User time + Nice time)/CPU时间*100%
%sy=(System time + Hardirq time +Softirq time)/ CPU时间*100%
%id=(Idle time)/CPU时间*100%
%ni=(Nice time)/CPU时间*100%
%wa=(Waiting time)/CPU时间*100%
%hi=(Hardirq time)/CPU时间*100%
%si=(Softirq time)/CPU时间*100%
%st=(Steal time)/CPU时间*100%

Nota: De forma predeterminada, el comando superior se actualiza cada 3 segundos. También puede especificar la frecuencia de actualización mediante top -d <intervalo de actualización>, como top -d 0.1 o top -d 0.01. Al ejecutar top, también puede presionar la tecla "s" para modificar el intervalo de tiempo.

2.2 Ver usando vmstat
Inserte la descripción de la imagen aquí

r representa el tamaño de la cola de ejecución, b representa el número de subprocesos bloqueados debido a la espera de E / S, in representa el número de interrupciones y cs representa el número de cambios de contexto.

2.3 Otros métodos de visualización

Iostat 、 sar -q 、 sar –u 等

[Beneficios del artículo] Se necesitan materiales de aprendizaje de arquitectura / desarrollo de servidor Linux C / C ++ para agregar un grupo de intercambio técnico: 960994558 He resuelto algunos libros de aprendizaje que creo que son mejores, preguntas de entrevistas de grandes fábricas, proyectos interesantes y enseñanza de tecnología popular compartir materiales de video en él (incluidos C / C ++, Linux, Nginx, ZeroMQ, MySQL, Redis, fastdfs, MongoDB, ZK, medios de transmisión, CDN, P2P, K8S, Docker, TCP / IP, coroutine, DPDK, etc.), hay una necesidad ¡Puede agregarlo usted mismo! ~Inserte la descripción de la imagen aquí

3. Introducción a la CPU

3.1 Tiempo en el kernel

HZ es el número de veces que el reloj del sistema envía interrupciones de reloj en un segundo. HZ se puede configurar antes de compilar el kernel, por lo que puede ver la frecuencia de interrupción del reloj del sistema actual a través del siguiente comando: cat / boot / uname -rconfig- | grep CONFIG_HZ

Tick ​​es el tiempo de cada "tick" del reloj del sistema, y ​​su valor es (1 / HZ) segundo. Es decir, el intervalo de tiempo entre dos interrupciones consecutivas del reloj.

jiffies se utiliza para contar el número de ticks desde que se inició el sistema, es decir, el valor de esta variable se incrementa una vez cada vez que el reloj del sistema genera una interrupción de reloj.

3.2 Composición del tiempo de CPU

El tiempo de trabajo de la CPU se compone de tres partes: tiempo en modo usuario, tiempo en modo sistema y tiempo en modo inactivo. La composición específica es:

CPU 时间 包含 Tiempo de usuario 、 Tiempo del sistema 、 Tiempo agradable 、 Tiempo de inactividad 、 Tiempo de espera 、 Tiempo de Hardirq 、 Tiempo de Softirq 、 Tiempo de robo

空闲态时间==idle time

用户态时间==user time+ Nice time。

内核态时间==system time+ Hardirq time+ Softirq time。

user time。指CPU在用户态执行进程的时间。

system time。指CPU在内核运行的时间。

nice time。指系统花费在调整进程优先级上的时间。

idle time。系统处于空闲期,等待进程运行。

waiting time。指CPU花费在等待I/O操作上的总时间,与blokced相似。

steal time。指当前CPU被强制(involuntary wait )等待另外虚拟的CPU处理完毕时花费的时间,此时 hypervisor 在为另一个虚拟处理器服务。

Softirq time 、Hardirq time。分别对应系统在处理软硬中断时候所花费的CPU时间。

3.3 Utilización de la CPU en modo usuario

% usr. Muestra el porcentaje de tiempo de CPU invertido en modo de usuario. Los procesos que los usuarios usan en la CPU incluyen: cpu ejecuta procesos de usuario regulares, cpu ejecuta procesos precisos y cpu ejecuta procesos en tiempo real. Un proceso de Linux se puede ejecutar en modo de usuario o en modo de sistema (kernel). Cuando un proceso se está ejecutando en código de kernel, lo llamamos en modo de kernel; cuando un proceso está ejecutando el propio código del usuario, se dice que está en user Cuando se ejecuta en modo de usuario, el proceso se ejecuta en su propio código de aplicación y no requiere recursos del kernel para realizar cálculos, administrar la memoria o establecer variables.

3.4 Utilización de CPU en modo sistema

Muestra el porcentaje de tiempo de la CPU en modo sistema, incluidos los recursos de la CPU consumidos por los procesos del kernel (kprocs) y otros procesos que necesitan acceder a los recursos del kernel. Los procesos que usan la CPU en el sistema incluyen: para llamadas al sistema y para administración de E / S ( Interrupción y controlador), utilizado para la gestión de memoria (paginación e intercambio), utilizado para la gestión de procesos (cambio de contexto e inicio de proceso), si un proceso necesita recursos del kernel, debe ejecutar una llamada al sistema y, por lo tanto, cambiar al modo de sistema Hacer el recurso disponible.

3.5% wa (espera)

Muestra el porcentaje inactivo de la CPU del disco que suspende la E / S del disco local y la carga de NFS. Es la proporción de la CPU inactiva debido al proceso en espera de E / S. La E / S incluye principalmente: E / S de bloque , E / S, E / S sin formato, paginación / intercambio de VM. Si hay al menos una E / S de disco pendiente mientras se está ejecutando la espera, el evento se clasifica como tiempo de espera de E / S. Las solicitudes de E / S al disco harán que el proceso de llamada se bloquee (o duerma) hasta que se complete la solicitud Una vez que se completa la solicitud de E / S del proceso, el proceso se coloca en la cola de ejecución. Si la E / S se completa rápidamente, el proceso puede usar más tiempo de la CPU.

3.6% id (inactivo)

Las condiciones de inactividad distintas de WIO anteriores muestran el porcentaje de tiempo que la CPU está inactiva o esperando cuando no hay E / S de disco local. Si no hay ningún hilo para ejecutar (la cola de ejecución está vacía), el sistema envía un hilo llamado esperar, que se puede llamar inactivo kproc. Si el informe ps muestra que el tiempo total de este subproceso es alto, indica que hay un período de tiempo en el que no hay otros subprocesos listos para ejecutarse o esperar a que se ejecuten en la CPU. Por lo tanto, el sistema está mayormente inactivo o esperando nuevas tareas.

3.7 r (ejecutarq-sz)

La longitud de la cola del proceso en ejecución. Para el tamaño del número de procesos en un estado ejecutable, estos procesos están listos en la memoria.

4. Introducción al concepto

4.1 Modo de usuario + modo de kernel

En términos generales, un proceso que se ejecuta en la CPU puede tener dos modos de operación, tanto en modo de usuario como en modo de kernel (es decir, el proceso funciona en modo de usuario y modo de kernel, respectivamente, mientras que trabajar en modo de kernel sigue siendo Este proceso, a menos que se cambie el proceso). Por lo general, el sistema operativo divide el espacio de direcciones virtuales en espacio de usuario y espacio de kernel. Por ejemplo, el espacio de direcciones virtuales del sistema Linux en la plataforma x86 es 0x00000000 0xffffffff, los primeros 3 GB (0x00000000 0xbfffffff) son el espacio de usuario y el último 1GB (0xc0000000 ~ 0xffffffff) es el espacio del kernel. El programa de usuario se carga en el espacio de usuario y se ejecuta en modo de usuario, pero no puede acceder a los datos del kernel ni saltar al código del kernel para su ejecución. Esto puede proteger el kernel.Si un proceso accede a una dirección ilegal, como máximo, este proceso se bloqueará sin afectar la estabilidad del kernel y de todo el sistema. Cuando la CPU genera una interrupción o excepción, no solo salta al servicio de interrupciones o excepciones de la ciudad oeste, sino que también cambia automáticamente el modo, del modo de usuario al modo privilegiado, por lo que el programa del servidor de interrupciones o excepciones puede saltar al núcleo. código para su ejecución. De hecho, todo el núcleo está compuesto por varios manejadores de interrupciones y excepciones. Es decir, en circunstancias normales, el procesador ejecuta el programa de usuario en el modo de usuario y, en caso de una interrupción o excepción, el procesador cambia al modo privilegiado para ejecutar el programa del kernel y luego regresa al modo de usuario para continuar. ejecutar el programa de usuario después de procesar la interrupción o la excepción, por ejemplo, el proceso de usuario A La llamada al sistema del kernel se llama para obtener el conteo de tic del reloj actual.Cuando se ejecuta la instrucción de llamada del sistema en el proceso de usuario A, el estado actual del registro, como IP y CS del proceso del usuario actual se guardará, y luego saltará al espacio del kernel (es decir, el área de código del kernel)) Para ejecutar la función de llamada del sistema como Ying para obtener los tics del reloj actual. Después de la ejecución, regrese al proceso A a través de la instrucción IRET (es decir, restablezca la información guardada en el momento de la entrada en el registro correspondiente), y luego ejecute las instrucciones del proceso A desde la dirección CS: EIP

Cuando se crea un proceso, además de crear el bloque de control del proceso, la pila del kernel del proceso también se crea en el kernel. Después de que el proceso ingresa al kernel a través de una llamada al sistema (como fopen () o open () ), el procesador está en un nivel privilegiado. Se ejecuta en el código del kernel más alto (nivel 0). Cuando el proceso está en el estado del kernel, el código del kernel ejecutado utilizará la pila del kernel del proceso actual y apuntará al contexto del proceso.

Los permisos del modo kernel son mayores que los del modo usuario.

Nivel de usuario. Los usuarios del sistema pueden interactuar con el sistema operativo, como ejecutar aplicaciones y comandos del sistema. El nivel de usuario accede al nivel del kernel a través de la interfaz de llamada del sistema, el nivel del kernel. El sistema operativo ejecuta automáticamente algunas funciones, operan principalmente en el hardware

4.2 Programación del proceso

Si algún proceso quiere ocupar la CPU, para que esté realmente en estado de ejecución, debe ser programado a través del proceso. El mecanismo de programación del proceso involucra principalmente el método de programación, el tiempo de programación y la estrategia de programación.

1. Método de programación

El método de programación del kernel de Linux básicamente adopta el método de "prioridad preventiva", es decir, cuando el proceso se ejecuta en modo de usuario, independientemente de si es voluntario, bajo ciertas condiciones (como el intervalo de tiempo agotado o esperando a que / O), el kernel puede privarlo temporalmente de la operación y programar otros procesos para que entren en operación. Sin embargo, una vez que el proceso se cambia para ejecutarse en modo kernel, continuará ejecutándose sin las restricciones anteriores y la programación del proceso no ocurrirá hasta que regrese al modo de usuario.

La estrategia de programación en el sistema Linux básicamente hereda la programación basada en prioridades de Unix. En otras palabras, el núcleo calcula una prioridad para cada proceso en el sistema, y ​​la prioridad refleja la elegibilidad de un proceso para obtener el derecho de usar la CPU, es decir, los procesos con alta prioridad tienen prioridad para ejecutarse. El núcleo selecciona un proceso con la prioridad más alta de la cola de proceso listo, le asigna un intervalo de tiempo de CPU y lo pone en funcionamiento. Durante el proceso en ejecución, la prioridad del proceso actual disminuye con el tiempo, lo que logra el efecto de "retroalimentación negativa": después de un período de tiempo, el proceso original de nivel inferior se "actualiza" relativamente y tiene la posibilidad de ejecutarse. Cuando la prioridad de todos los procesos se vuelve 0, se recalcula la prioridad de todos los procesos.

2. Estrategia de programación

El sistema Linux proporciona tres estrategias de programación diferentes para diferentes tipos de procesos, a saber, SCHED_FIFO, SCHED_RR y SCHED_OTHER.

SCHED_FIFO es adecuado para procesos en tiempo real. Tienen requisitos de tiempo relativamente fuertes y el tiempo requerido para cada ejecución es relativamente corto. Una vez que este proceso está programado para comenzar a ejecutarse, debe ejecutarse hasta que voluntariamente ceda la CPU o se le dé prioridad. El proceso alto se adelanta a su ejecución hasta que lo es.

SCHED_RR corresponde al "método de rotación de intervalo de tiempo", que es adecuado para procesos en tiempo real que requieren mucho tiempo en cada ejecución. A un proceso en ejecución se le asigna un intervalo de tiempo (por ejemplo, 200 milisegundos). Cuando se agota el intervalo de tiempo, otro proceso se apropia de la CPU y el proceso se envía de vuelta al final de la misma cola de prioridad. SCHED_OTHER es una estrategia de programación tradicional de Unix, adecuada para procesos interactivos de tiempo compartido. La prioridad de este tipo de proceso depende de dos factores. Un factor es la cuota de tiempo restante del proceso. Si el proceso se agota del tiempo asignado, la prioridad correspondiente es 0; el otro es el número de prioridad del proceso nice, que se hereda del sistema Unix Cuanto menor sea el número de prioridad, mayor será la prioridad.

El rango de valores de agradable es 19-20. El usuario puede usar el comando nice para establecer el valor agradable del proceso. Sin embargo, los usuarios generales solo pueden establecer valores positivos, lo que reduce activamente su prioridad; solo los usuarios privilegiados pueden establecer el valor de nice en un número negativo. La prioridad del proceso es la suma de los dos anteriores. El núcleo ajusta dinámicamente la prioridad del proceso del modo de usuario. De esta forma, un proceso debe pasar por múltiples ciclos de retroalimentación desde la creación hasta la finalización de la tarea. Cuando el proceso esté programado para ejecutarse nuevamente, continuará ejecutándose desde el último punto de interrupción. Para procesos en tiempo real, el valor de prioridad es (1000 + valor positivo establecido), por lo tanto, al menos 1000. Por tanto, la prioridad de los procesos en tiempo real es mayor que la de otros tipos de procesos. Además, la cuota de tiempo y el valor agradable no tienen nada que ver con la prioridad del proceso en tiempo real. Si hay un proceso en tiempo real en el sistema en un estado listo, el proceso que no es en tiempo real no se puede programar para que se ejecute hasta que se completen todos los procesos en tiempo real, el proceso que no es en tiempo real tiene la oportunidad de ocupar el UPC.

El comando en segundo plano (con un ampersand al final del comando, como gcc f1.c &) corresponde a un proceso en segundo plano (también conocido como trabajo en segundo plano), y la prioridad del proceso en segundo plano es menor que la de cualquier interactivo ( primer plano) proceso. Por lo tanto, el proceso en segundo plano solo está programado para ejecutarse cuando no hay ningún proceso interactivo en ejecución en el sistema. Los procesos en segundo plano a menudo se programan para ejecutarse en lotes.

3. Programación del tiempo

El tiempo de la programación del proceso central tiene las siguientes situaciones:

(1) El proceso actual llama a la llamada del sistema nanosleep () o pause () para ponerse en un estado de suspensión y renunciar activamente al derecho de usar la CPU durante un período de tiempo;

(2) El proceso finaliza y el uso de la CPU se abandona permanentemente;

(3) Durante la ejecución del manejador de interrupción del reloj, se encuentra que el proceso actual se ha estado ejecutando continuamente durante demasiado tiempo;

(4) Al despertar un proceso inactivo, se encuentra que el proceso despertado está más calificado para ejecutarse que el proceso actual;

(5) Un proceso cambia la estrategia de programación o reduce su propia prioridad (como el comando nice) al ejecutar una llamada al sistema, lo que provoca una programación inmediata.

4. Algoritmo de programación

El algoritmo de programación de procesos debería ser relativamente simple para reducir la sobrecarga del sistema durante la programación frecuente. Cuando Linux ejecuta la programación de procesos, primero busca todos los procesos en la cola lista y selecciona un proceso con la prioridad más alta y en la memoria. Si hay procesos en tiempo real en la cola, los procesos en tiempo real se ejecutarán primero. Si el proceso más necesario para ejecutarse no es el proceso actual, entonces el proceso actual se suspende y todos los estados de la máquina involucrados en su escena se guardan, incluido el contador del programa y los registros de la CPU, etc., y luego la escena se reanuda por el proceso seleccionado.

4.3 Subprocesos a nivel de usuario y subprocesos a nivel de kernel

En muchos sistemas similares a Unix, como Linux, FreeBSD, Solaris, etc., el proceso siempre ha sido la unidad más pequeña de llamadas al kernel del sistema operativo, y el modelo multiproceso también se adopta para el desarrollo de programas. Posteriormente se introdujo el concepto de hilo. Hay dos conceptos de hilo:

Hilo de nivel de usuario (ULT). El proceso de la aplicación utiliza la biblioteca de subprocesos para crearlo y administrarlo. No implementa subprocesos en el kernel. Solo simula subprocesos múltiples en el modo de usuario. No depende del núcleo del sistema operativo y el kernel del sistema operativo no conoce el existencia de multiproceso en absoluto.

Subproceso de nivel de kernel (KLT), también conocido como subproceso compatible con el kernel o proceso ligero. Se implementa en el espacio del núcleo. El núcleo establece un bloque de control del hilo en el espacio del núcleo para que cada hilo registre el identificador del hilo, el valor de registro, el estado, la prioridad y otra información del hilo. Todas las operaciones en el hilo, como Creación , la cancelación y el cambio son completados por el programa de procesamiento correspondiente en el kernel a través de llamadas a funciones del sistema. El kernel mantiene el cambio de contexto de procesos y subprocesos y el cambio de subprocesos. Los sistemas tipo Unix generalmente se implementan modificando la implementación del proceso, que se puede utilizar de forma incompleta El método de creación de procesos crea un proceso que comparte espacio de datos En Linux, esta llamada al sistema es clone (), y en FreeBSD es rfork ().

5. Malentendidos comunes

5.1 Una alta utilización de la CPU significa recursos de CPU insuficientes

Cuando el contador de la CPU no está en el rango, no se debe necesariamente a que los recursos de la CPU no sean suficientes, porque otros recursos también lo causarán. Por ejemplo, cuando la memoria es insuficiente, la CPU estará ocupada con la administración de la memoria. En la superficie, puede ser que la utilización de la CPU sea del 100%.

Las deficiencias anteriores son bienvenidas para señalar la discusión, amigos que se sienten bien, esperan obtener su apoyo.

Supongo que te gusta

Origin blog.csdn.net/weixin_52622200/article/details/113058528
Recomendado
Clasificación