BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

Balanceo de carga entre CPUs

BocaDePez
BocaDePez

Hola.

El tema va de un Windows 2000 Advance Server con 4 CPUs y como se reparte la carga entre las CPU. Este servidor esta para correr una aplicacion que soporta una gran carga, pero sin saber porque, tiene el tope en el 25% de la CPU total, lo cual es un problema y necesito que haga uso de las 4 CPU al 100% si fuese necesario (sino, menudo malgasto de pelas).

Recientemente ando investigando porque los procesos de la maquina servidora no pasan del 25% de CPU total. La maquina tiene 4 CPUs, lo cual inidicaria en un principio que toda la carga del proceso que sigo, recae en una sola CPU, lo cual no es cierto.

Las siguientes imagenes, muestran el proceso ejecutandose en distintas prioridades, en todas ellas, la carga maxima del sistema es un 26% y en procesos se ve que la aplicacion chupa el 25%.

Se ve como segun la prioridad del proceso la carga se reparte mas o no se reparte nada.

Prioridad Baja:

Prioridad Normal:

Prioridad Tiempo Real:

La prueba de carga, la he hecho con un simple programa en VB que hace un "for" de 0 hasta mil millones, lo que provoca que se sature la maquina durante unos 15 segundos o asi.

¿Alquien me puede decir que tengo que hacer para que ese proceso coja todos los recursos posibles de la maquina? Es decir, que si la situacion lo requiere, se chupe el 100% de las 4 CPUs (con que llegue al 60% me vale :P ).

Salu2.

Este tema está cerrado a nuevas respuestas. Abre un nuevo tema para retomar la conversación.
BocaDePez
BocaDePez

Arg, no va el html, probemos bbcode:

Prioridad baja:
Imagen original en http://img477.imageshack.us/img477/480/pbaja2ki.jpg

Prioridad Normal:
Imagen original en http://img477.imageshack.us/img477/5318/pnormal4fj.jpg

Prioridad Tiempo Real:
Imagen original en http://img477.imageshack.us/img477/2460/ptiemporeal1yj.jpg

BocaDePez
BocaDePez

ehh... es un problema innato de la arquitectura Von Neuman... o sea de las maquinas x86 (y casi todas las restantes) actuales...

El tema, es que si tienes un programa que se ejecuta linealmente, no puede ser dividido en 'trocitos' independientes, para que se ejecute cada uno de ellos en paralelo en cada CPU.

Las maquinas multi-cpu son ideales en el caso de tener que ejecutar multitud de procesos con alto grado de paralelismo.

En el caso de programar una aplicación 'bien' en C, tienes que pensar en que puntos puedes crear 'forks' para que los hilos que lances puedan correr por su cuenta, hasta el momento en que los mismos produzcan un resultado, y el proceso padre (que está a la espera de que finalicen) pueda recogerlos para 'presentar' el resultado final...

(en fin, resumiendo en 40 palabras, unos años de ingeniería...)

🗨️ 6
angelm

Como bien ha dicho bocadepez, no es lo mismo concurrencia que paralelismo... :D

Pero para no desanimar al creador del post, le recomiedo que inicie el servicio que quiere ofrecer (por ej. IIS) y le simule una buena carga de peticiones... ya verás como el rendimiento del servidor no es del 25% sino que da mucho más.

Debes tener en cuenta que la aplicación de prueba que has hecho no és multiproceso y no se puede paralelizar...però muchos servicios (programas servidores) de hoy en día tienen soporte para multiprocesadores.

Por último: seguramente tendrás que parametrizar IIS para que soporte debidamente el número y características de los procesadores que tienes.

Saludos, espero haber sido de ayuda.

🗨️ 5
BocaDePez
BocaDePez

Lo primero gracias a los dos por responder, te respondo a ti por ser el ultimo pero esto va para los dos.

No es IIS. Es un programa servidor para un uso concreto que hace numerosos accesos a base de datos y realiza multitud de calculos.

¿Porque entonces en funcion de la prioridad que le doy al programa las demas CPUs trabajan más o menos? No lo entiendo.

El programa esta hecho en Delphi, supuestamente con idea de multihilo asi que deberia funcionar ... bien ... o eso esperaba. Además responde a base de eventos de las conexiones que le llegan y se ejecutan de forma paralela ... o eso parece.

Por favor, define "concurrencia" y "paralelismo" a ver en cual encuadro mejor el programa :)

Gracias

Salu2.

🗨️ 4
angelm

Concurrencia es la ejecución intercalada de diversos programas. Es el comportamiento típico en un sistema monoprocesador definido como "multitarea": hace varias cosas a la vez a lo largo del tiempo, pero no llega nunca a ejecutar varias cosas en el mismo instante de tiempo.

Paralelismo es la ejecución simultánea y sincronizada de diversos programas. Normalmente se asocia un thread a un procesador (aunque no tiene porque ser así). Uno de los paradigmas de la programación paralela define, aparte de los programas, canales de comunicación: que permitiran el paso de mensajes entre procesos de manera sincrona o asíncrona y la sincronización entre estos.

Sobre este tema encontraras mucha información en el google.
Un buen inicio son los documentos de Ian Foster: www-unix.mcs.anl.gov/dbpp/

Mira en un buen manual los posibles parámetros de ejecución en Delphi, quizás tu aplicación está bien hecha y el único problema es que la maquina virtual (si funcionas con Delphi .NET) se tiene que configurar, no se...

Espero haber ayudado,

Saludos,

🗨️ 3
angelm
🗨️ 1
BocaDePez
BocaDePez
BocaDePez
BocaDePez
BocaDePez
BocaDePez

Puedes decir que aplicacion es, o esta desarrollada a medida?

🗨️ 1
BocaDePez
BocaDePez

A medida.

BocaDePez
BocaDePez

Pues si, parece ser que el problema es de un uso ineficiente o deshuso de threads en el diseño del programa.

He hecho una pequeña aplicacion que lanza distintos hilos ejecutando muchas operaciones matematicas (pero asi como 10 millones de ellas por thread x_D) y consigo cargar las 4 CPU al 100%

Gracias a todos por vuestras respuestas.

Imagen original en http://img474.imageshack.us/img474/4187/1003nr.jpg

Salu2.