el cálculo del promedio de carga se considera mejor como un promedio móvil de procesos en la cola de ejecución de Linux marcada como ejecutable o ininterrumpible. Las palabras «pensamiento de» fueron elegidas por una razón: así es como las medidas deben ser interpretadas, pero no exactamente lo que sucede detrás de la cortina. Es en esta coyuntura en nuestro viaje cuando la realidad de itall, como la mecánica Quantum, parece no encajar en la forma intuitiva como se presenta.,
los promedios de carga que muestran los comandos top y uptime se obtienen directamente desde / proc. Si está ejecutando Linux kernel 2.4 o posterior, puede leer esos valores usted mismo con el comando cat/proc / loadavg. Sin embargo, es el núcleo Linux el que produce estos valores en /proc. Específicamente, temporizador.c y sched.h trabajar juntos todo el cómputo. Para entender qué temporizador.c se gana la vida, elconcepto de cortar el tiempo y el contador jiffy ayudan a completar la imagen.
en el núcleo Linux, cada proceso despachable recibe una cantidad fija de tiempo en la CPU por despacho., De forma predeterminada, esta cantidad es de 10 milisegundos,o 1/100 de segundo. Para ese corto lapso de tiempo, el proceso se asigna una CPU física en la que ejecutar sus instrucciones y se le permite tomar el procesador overthat. La mayoría de las veces, el proceso abandonará el control antes de que los 10ms se activen a través de llamadas a sockets, llamadas de E/S o llamadas al núcleo. (En un procesador Intel 2.6 GHz, 10ms es tiempo suficiente para que se produzcan aproximadamente 50 millones de instrucciones. Eso es más que suficiente tiempo de procesamiento para la mayoría de los ciclos de aplicación.,) Si el proceso utiliza su tiempo de CPU asignado de 10ms, el hardware genera una interrupción y el núcleo recupera el control del proceso. El kernel entonces promptlypenalize el proceso para ser un cerdo. Como se puede ver, que timeslicing es un concepto de diseño importante para hacer que su sistema parece torun sin problemas en el exterior. También es el vehículo que produce los valores medios de carga.
el segmento de tiempo de 10 ms es un concepto lo suficientemente importante como para garantizar aname por sí mismo: valor cuántico., No hay necesariamente anythinginherently especial sobre 10ms, pero hay sobre el valor cuántico en general, porque cualquiera que sea el valor que se establece (es configurable, pero 10ms es el valor predeterminado), controla la frecuencia con la que, como mínimo, el kernel toma el control del sistema desde las aplicaciones. Uno de los manychores que el núcleo realiza cuando recupera el control Es incrementar el contador jiffies. El contador jiffies mide el número de garrapatas QUANTUM que se han producido desde que se inició el sistema. Cuando el temporizador Quantum explote, temporizador.c se introduce en una función del núcleo llamada calledtimer.,c: do_timer (). Aquí, todas las interrupciones están deshabilitadas Para que el código no funcione con destinos en movimiento. El contador jiffies se incrementa en 1, y el cálculo del promedio de carga se comprueba para ver si debe ser computed.In en la actualidad, el cálculo de la carga Media no se calcula realmente en cada tick cuántico, sino que es impulsado por un valor variable que se basa en el ajuste de frecuencia de la Hz y se prueba en cada tick cuántico. (HZ no debe confundirse con la clasificación de MHz del procesador. Esta variable establece el pulserate de la actividad particular del kernel de Linux y 1HZ es igual a un or10ms cuántico por defecto.,) Aunque el valor HZ se puede configurar en algunas versiones del kernel, normalmente se establece en 100. El código de cálculo utiliza el valor de HZ para determinar la frecuencia de cálculo. Específicamente, el temporizador.C: la función calc_load () ejecutará el algoritmo de promediación cada 5 * HZ, o aproximadamente cada cinco segundos. A continuación se muestra esa función en itsentirety:
el array de avenrun contiene los tres promedios que hemos estado discutiendo. La funcióncalc_load () es llamada por update_times (), también encontrada en timer.c, y es el código responsable de suministrar a la función calc_load () el parámetro sticks., Desafortunadamente, esta función no revela su aspecto más interesante: el cómputo en sí. Sin embargo, que canbe situado fácilmente en sched.h, un encabezado utilizado por gran parte del núcleo code.In allí, la macro CALC_LOAD y sus valores asociados están disponibles:
Aquí es donde los neumáticos se encuentran con el pavimento. Ahora debería demostrarse que la realidad no parece coincidir con la ilusión. Por lo menos, este no es ciertamente el tipo de promedio que la mayoría de nosotros se enseña en la escuela de grado. Sin embargo, es un promedio., Técnicamente, es una función exponentialdecay y es la media móvil de elección para la mayoría de los sistemas UNIX, así como Linux. Examinemos sus detalles.
la macro toma tres parámetros: el bucket load-average (uno de los tres elementos en avenrun), un exponente constante y el número de procesos en ejecución/ininterrumpidos actualmente en la cola de ejecución. Las constantes de exponentes posibles están listadas arriba: EXP_1 para el intervalo de 1 minuto, EXP_5 para el promedio de 5 minutos y EXP_15 para el intervalo de 15 minutos. El punto importante a notar es que el valor disminuye con la edad., Las constantes son números mágicos que se calculan mediante la función matemática que se muestra a continuación:
Cuando x = 1, luego y=1884; cuando x=5, Luego y=2014; y cuando x=15, luego y=2037. El propósito de los números mágicos es que permite que la macro CALC_LOAD utilice la representación de precisión de punto fijo de fracciones. Los números mágicos no son más que multiplicadores utilizados contra el promedio de carga de ejecución para convertirlo en un promedio móvil. (Las matemáticas de la representación de puntos fijos están más allá del alcance de este artículo, así que no intentaré una explicación.,) El propósito de la función de decaimiento exponencial es que no solo suaviza las caídas y picos al mantener una línea de tendencia útil, sino que disminuye con precisión la calidad de lo que mide a medida que la actividad envejece. A medida que el tiempo avanza, los eventos sucesivos de la CPU aumentan su importancia en el promedio de carga. Esto es lo que queremos, porque la actividad más reciente de la CPU probablemente tenga más impacto en el estado actual que los eventos antiguos., Al final, los promedios de carga dan una tendencia suave de 15 minutos a través del minuto actual y nos dan una ventana en no solo el uso de la CPU, sino también la demanda promedio de las CPU. A medida que el promedio de carga supera el número de CPU físicas, cuanto más se usa la CPU y más demanda hay para ella. Y, a medida que retrocede, menos demanda hay. Con esta comprensión, el promedio de carga se puede utilizar con el porcentaje de CPU para obtener una vista más precisa de la actividad de la CPU.,
Es mi esperanza que esto sirva no solo como una interpretación práctica de los promedios de carga de Linux, sino que también ilumine algunas de las sombras matemáticas oscuras detrás de ellos. Para más información, un estudio de la función de pago exponencial y sus aplicaciones arrojaría más luz sobre el tema. Pero para los más prácticos de mente, el trazado de la carga averagevs. un número controlado de procesos (es decir, modelando los efectos del algoritmo CALC_LOAD en un bucle controlado) le daría una idea de la relación real y cómo se aplica el filtro en descomposición.