Ir al contenido


Foto

Consumo de Memoria en Servicio

Servicios Memoria WMI

  • Por favor identifícate para responder
8 respuestas en este tema

#1 ramflores

ramflores

    Member

  • Miembros
  • PipPip
  • 42 mensajes
  • LocationMonterrey, Mexico

Escrito 20 septiembre 2016 - 08:46

Buen dia Foro.

 

Antes que nada quiero compartir con ustedes una clases para el consumo de WMI

https://github.com/R...class-generator

 

Tengo un servicio que esta monitoreando la carga de UPS, mi problema es que no se libera la memoria, el consumo empieza a incrementarce con el tiempo, ya le agregue dos codigoa para liberar memoria pero no funciona, el servicio esta corriendo sobre un server Window 2008 R2 64bit les dejo el codigo que se ejecuta

 

1. Este se ejecuta cada 5segundos con un timer


delphi
  1. procedure TService1.Timer1Timer(Sender: TObject);
  2. var
  3. LBatery : TWin32_Battery;
  4. begin
  5. LIB_IniLoad;
  6. LBatery := TWin32_Battery.Create;
  7. if ((LBatery.EstimatedChargeRemaining <= _INI_LECTURA_MIN) And (Length(LBatery.Name)>0)) then
  8. begin
  9. LIB_GrabaLog('Dando de baja el servidor .. carga al '+IntToStr(LBatery.EstimatedChargeRemaining));
  10. BajaServer;
  11. end;
  12. LBatery.Free;
  13. Application.ProcessMessages;
  14. LiberarMemoria;
  15. Optimizar_memoria;
  16. end;

2. Estos son los procedimientos que implemente para la liberarción de memoria


delphi
  1. procedure LiberarMemoria;
  2. begin
  3. if Win32Platform = VER_PLATFORM_WIN32_NT then
  4. SetProcessWorkingSetSize(GetCurrentProcess, $FFFFFFFF, $FFFFFFFF);
  5. end;
  6.  
  7. procedure Optimizar_memoria;
  8. var
  9. MainHandle : THandle;
  10. begin
  11. try
  12. MainHandle := OpenProcess(PROCESS_ALL_ACCESS, false, GetCurrentProcessID);
  13. SetProcessWorkingSetSize(MainHandle,DWORD(-1),DWORD(-1));
  14. finally
  15. CloseHandle(MainHandle);
  16. end;
  17. end;

Gracias de Antemano


  • 0

#2 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 septiembre 2016 - 10:46

Tengo entendido que SetProcessWorkingSetSize "sólo controla" el contenido de la memoria llegando a incrementar la misma, por lo que no libera la misma, si no es así, corrígenme.


  • 0

#3 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 20 septiembre 2016 - 10:49

Viendolo mejor, por qué no cambias $FFFFFF por -1 en SetProcessWorkingSetSize? en el procedimiento LiberarMemoria.


  • 0

#4 ramflores

ramflores

    Member

  • Miembros
  • PipPip
  • 42 mensajes
  • LocationMonterrey, Mexico

Escrito 20 septiembre 2016 - 11:02

Gracias por responder , en realidad no entiendo bien eso, que diferencia haria ese cambio o el porque?, mas que nada para entenderlo bien

 

Gracias de antenano


  • 0

#5 ramflores

ramflores

    Member

  • Miembros
  • PipPip
  • 42 mensajes
  • LocationMonterrey, Mexico

Escrito 20 septiembre 2016 - 11:04

Me marca error:


php
  1. SetProcessWorkingSetSize(GetCurrentProcess, -1, -1)


  • 0

#6 genriquez

genriquez

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 539 mensajes
  • LocationCali, Colombia

Escrito 22 septiembre 2016 - 01:39

Hola, yo tengo varios servicios y siempre y cuando realices un Free a los objetos creados es suficiente para que libere la memoria.  por cada objeto que se inicialice o módulo que se cree debe existir el respectivo free.

 

 

es de aclarar que el manejador de memoria no baja inmediatamente la memoria de la aplicación, esto se podría ver después de algunos segundos o minutos, esto varía de acuerdo como el sistema vaya eliminando la memoria asignada.  

 

tal vez podrías mostrarnos que hacen algunas rutinas a ver si es necesario bajar memoria, como "LIB_IniLoad"

 

Saludos.


  • 0

#7 ramflores

ramflores

    Member

  • Miembros
  • PipPip
  • 42 mensajes
  • LocationMonterrey, Mexico

Escrito 22 septiembre 2016 - 04:52

Muchas Gracias por responder

 

El "LIB_IniLoad" carga variables de parametros desde un archivo ini


delphi
  1. procedure LIB_IniLoad;
  2. var
  3. sFileName : String;
  4. FileIni : TIniFile;
  5. begin
  6. sFileName := ChangeFileExt(Application.ExeName,'.ini');
  7. FileIni := TIniFile.Create(sFileName);
  8.  
  9. _INI_SERVER := FileIni.ReadString('BD','Servidor', 'localhost' );
  10. _INI_BASEDATOS := FileIni.ReadString('BD','BaseDatos', 'basedatos' );
  11. _INI_USUARIO := FileIni.ReadString('BD','Usuario', 'user' );
  12. _INI_PASSWORD := FileIni.ReadString('BD','Password', 'pass' );
  13.  
  14. _INI_LECTURA_MIN := FileIni.ReadInteger('Alerta','LecturaMIN', 30 );
  15. _INI_SUCURSAL := FileIni.ReadInteger('Alerta','Sucursal', 0 );
  16.  
  17. FreeAndNil( FileIni );
  18. end;


  • 0

#8 Agustin Ortu

Agustin Ortu

    Advanced Member

  • Moderadores
  • PipPipPip
  • 831 mensajes
  • LocationArgentina

Escrito 22 septiembre 2016 - 09:01

Este tipo de problemas de fugas de memoria, no se puede capturar con el manejador de memoria (FastMM)? Me refiero a usar ReportMemoryLeaksOnShutdown := True;

 

ue tal si se usa FastMM en "full debug mode"?  Full debug mode seria utilizar la version completa del manejador, es decir la original, y no la version que viene por defecto en Delphi que le quitaron algunas cosillas

 

Si buscas en internet justamente, FastMM full debug mode vas a encontrar enseguida como se hace


  • 0

#9 ramflores

ramflores

    Member

  • Miembros
  • PipPip
  • 42 mensajes
  • LocationMonterrey, Mexico

Escrito 23 septiembre 2016 - 07:11

Muchas gracias por tu respuesta Agustin, voy a checarlo y les retroalimento


  • 0





Etiquetado también con una o más de estas palabras: Servicios, Memoria, WMI

IP.Board spam blocked by CleanTalk.