Pregunta Asignación de procesos a núcleos de CPU


Tengo acceso a un servidor web CentOS 6 (un foro PHP / MySQL) que ejecuta Apache 2.2.15 y MySQL 5.1.52. Esta caja tiene Xeons de doble núcleo oct.

Lo que encuentro al analizar los gráficos de la CPU es que los dos primeros núcleos (0 y 1) alcanzan el 90% de uso, mientras que los otros catorce solo alcanzan el 30-40% de uso. El núcleo 8, que creo que es el primer núcleo del segundo procesador, tiene un alto uso (hasta un 90%), pero luego, como se mencionó, todos los demás son bajos.

Apache enciende unos 20 procesos y sospecho que en su estado predeterminado, no puede entender, y hace uso de todos los núcleos de forma natural. Este debería ser el trabajo de kernels que creo (¿alguien puede confirmarlo?). Sin embargo, con esos núcleos al máximo, hay una notable caída en el rendimiento a pesar de la memoria RAM y la E / S de repuesto.

¿Hay algo que pueda modificar en Apache para que lo haga "consciente" de todos los otros núcleos, o quizás un núcleo peramater para asignar cierto proceso a ciertos núcleos? ¿Puedo excluir los núcleos 0 y 1, por ejemplo, para que no se utilicen para Apache y MySQL?


4
2018-01-01 13:19


origen


Un montón de información adicional ayudaría. ¿Estás sirviendo páginas estáticas? Páginas dinámicas? ¿Cómo se ve el nivel de tráfico de la red? ¿Cómo se sintoniza apache actualmente? - David Schwartz
Al igual que la nota: NO tiene xeones de núcleo de doble oct. - no hay ninguno. Tiene dos núcleos QUAD xeons con Hyperthreading, donde cada núcleo muestra como 2 que a veces no pueden hacer lo mismo al mismo tiempo. No es el mísmo. - TomTom


Respuestas:


Afinidad del proceso de tunning con tasket

por ejemplo, asignar el proceso actual a cpu-core 0,1,3

$ taskset -cp 0,1,3 $$

La lista de afinidad actual de pid 21698: 0-7

Nueva lista de afinidad de pid 21698: 0,1,3

Aísle las CPU para ejecutar solo un proceso en particular. El parámetro del núcleo "isolcpus" puede aislar a las CPU particulares de realizar otras tareas. Junto con el conjunto de tareas, puede tener CPU específicas para ejecutar solo las tareas designadas. Por ejemplo, poner "isolcpus = 2,3" en grub.conf aislará la CPU 2 y 3.

http://honglus.blogspot.com/2011/03/tune-interrupt-and-process-cpu-affinity.html


3
2018-01-28 12:22





No todo el tráfico de aplicaciones es altamente paralizable. Tenemos una aplicación web interna que es resueltamente de un solo hilo, incluso cuando se ejecuta en un monstruo de 24 núcleos. En nuestro caso, el servidor web usará felizmente tantos núcleos como lo lanzemos para el servicio estático; pero cuando está vinculado a un servidor de aplicaciones específico, se queda con uno.

Si observamos el uso por núcleo cuando ese proceso de un solo hilo se ejecuta, cada núcleo se ejecutará a un porcentaje de 100 * (1 / n). El núcleo está moviendo la carga a través de múltiples núcleos como debería, pero solo se utiliza el 100% de la capacidad de un procesador.

En nuestro caso, estamos ejecutando una pila LAMx. Donde (x) no está definido en esta respuesta. Como resultado, lo que (x) representa es bastante importante. Entonces, sí, la capacidad de usar muchos núcleos depende de todos los pasos de la pila, no solo de las partes LAM.


5
2018-01-01 14:32



Esto se conoce como "Ley de Amdahl". Ver Wikipedia - mpez0
Entonces, ¿está sugiriendo que en mi caso (x = PHP), quizás deberíamos revisar la configuración de PHP? - jwbensley
Y posiblemente la programación. Hay algo en el lado de la programación que puede hacer que la ejecución sea efectivamente un solo hilo. En mi opinión, una aplicación de ASp "lenta" hace años que usaba una conexión de base de datos almacenada centralmente y las páginas esperaban en línea para acceder a ella. - TomTom
Gracias por la información TomTom. Lo que me pregunto es, los 20 hilos de Apache que se activan, hay alguna forma de ejecutarlos en núcleos individuales. De acuerdo con mi publicación original, el núcleo 1 en el chip 1 está en un 90% y 2,3 y 4 tal vez en un 30%. Todas esas instancias de Apache y solo se agrupan alrededor de un núcleo. Mencioné PHP, como lo entiendo, cada instancia de Apache llama a PHP; Entonces, al difundir las instancias de Apache en todos los núcleos, efectivamente extendería PHP, si esto fuera posible, ¿no? - jwbensley


Es, de hecho, el trabajo del núcleo programar tareas. En un entorno de varios núcleos, a veces (pero no siempre), sucede que el kernel asigna trabajo a todos los núcleos, pero en uno o dos núcleos se asignan todos los procesos de servicio pesado, como apache.
Idealmente, su kernel ya debería estar consciente de que hay múltiples núcleos en su máquina. Todavía ejecuta lo siguiente para confirmar como superusuario:

dmidecode|grep Core

En mi máquina de doble núcleo dice:

Version: Intel(R) Core(TM) i5-2410M CPU @ 2.30GHz
Core Count: 2
Core Enabled: 2

2
2018-01-01 13:35



Hola, gracias por la respuesta :) No tengo dmidecode pero 'cat / proc / cpuino' muestra 16 núcleos (0-15) cada uno a 3GHz como se esperaba :) - jwbensley