• Publicidad

Exceso de memoria usada por forks

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Exceso de memoria usada por forks

Notapor andres » 2013-08-29 02:33 @148

Saludos, tengo un código que escucha conexiones TCP y las escribe a MySQL, tiene un proceso padre y aprox. 2000 conexiones permanentes hechas con fork ocupando 20 Gigas en RAM.

Proceso padre:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl -w
  2. use forks;
  3. use forks::shared;
  4. use IO::Socket;
  5. use strict;
  6. use warnings;
  7. use Net::hostent;
  8. use HTTP::Date;
  9. use DBD::mysql;
  10. use POSIX;
  11.  
  12. my $servidor = IO::Socket::INET->new(Proto    =>'tcp',
  13.                                   LocalPort=>$puerto,
  14.                                   Listen   =>SOMAXCONN,
  15.                                   Reuse    =>1)
  16.             or die "Error al iniciar el servidor";
  17. print "[Aceptando conexiones TCP en puerto $puerto]\n";
  18.  
  19. while ($conexion = $servidor->accept()) {
  20.         $conexion->autoflush();
  21.         $conexion->setsockopt(SOL_SOCKET,SO_KEEPALIVE,1);
  22.         threads->create(\&atender, $conexion);
  23.  
  24. **********
  25.  
  26. Procesos hijos:
  27.  
  28. sub atender($) {
  29.     $conexion = shift;
  30.     $ip = $conexion->peerhost;
  31.     print "[Conexion establecida desde $ip]\n";
  32. while ($conexion){
  33.  
  34. //escuha e inserta a mysql
  35.  
  36. }
Coloreado en 0.004 segundos, usando GeSHi 1.0.8.4


El problema es que cada proceso hijo consume 100 Megas producto de la copia en memoria de las librerías propias del script, lo que es poco eficiente pensando en que podría crecer a 20 000 conexiones por máquina. Ejemplo de utilización en memoria:
Sintáxis: [ Descargar ] [ Ocultar ]
Using text Syntax Highlighting
[root@site3 ~]# pmap -d 32171

Address           Kbytes Mode  Offset           Device    Mapping
0000000000400000       4 r-x-- 0000000000000000 008:00003 perl  
0000000000601000       8 rw--- 0000000000001000 008:00003 perl  
000000000123a000   21184 rw--- 0000000000000000 000:00000   [ anon ]
0000003ec3c00000     128 r-x-- 0000000000000000 008:00003 ld-2.12.so
0000003ec3e1f000       4 r---- 000000000001f000 008:00003 ld-2.12.so
0000003ec3e20000       4 rw--- 0000000000020000 008:00003 ld-2.12.so
0000003ec3e21000       4 rw--- 0000000000000000 000:00000   [ anon ]
0000003ec4000000       8 r-x-- 0000000000000000 008:00003 libdl-2.12.so
0000003ec4002000    2048 ----- 0000000000002000 008:00003 libdl-2.12.so
0000003ec4202000       4 r---- 0000000000002000 008:00003 libdl-2.12.so
0000003ec4203000       4 rw--- 0000000000003000 008:00003 libdl-2.12.so
0000003ec4400000    1576 r-x-- 0000000000000000 008:00003 libc-2.12.so
0000003ec458a000    2044 ----- 000000000018a000 008:00003 libc-2.12.so
0000003ec4789000      16 r---- 0000000000189000 008:00003 libc-2.12.so
0000003ec478d000       4 rw--- 000000000018d000 008:00003 libc-2.12.so
0000003ec478e000      20 rw--- 0000000000000000 000:00000   [ anon ]  
0000003ec4800000      92 r-x-- 0000000000000000 008:00003 libpthread-2.12.so
0000003ec4817000    2048 ----- 0000000000017000 008:00003 libpthread-2.12.so
0000003ec4a17000       4 r---- 0000000000017000 008:00003 libpthread-2.12.so
0000003ec4a18000       4 rw--- 0000000000018000 008:00003 libpthread-2.12.so
0000003ec4a19000      16 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec4c00000    1416 r-x-- 0000000000000000 008:00003 libperl.so        
0000003ec4d62000    2048 ----- 0000000000162000 008:00003 libperl.so        
0000003ec4f62000      36 rw--- 0000000000162000 008:00003 libperl.so        
0000003ec5000000      28 r-x-- 0000000000000000 008:00003 librt-2.12.so    
0000003ec5007000    2044 ----- 0000000000007000 008:00003 librt-2.12.so    
0000003ec5206000       4 r---- 0000000000006000 008:00003 librt-2.12.so    
0000003ec5207000       4 rw--- 0000000000007000 008:00003 librt-2.12.so    
0000003ec5400000     524 r-x-- 0000000000000000 008:00003 libm-2.12.so      
0000003ec5483000    2044 ----- 0000000000083000 008:00003 libm-2.12.so      
0000003ec5682000       4 r---- 0000000000082000 008:00003 libm-2.12.so      
0000003ec5683000       4 rw--- 0000000000083000 008:00003 libm-2.12.so      
0000003ec5800000     116 r-x-- 0000000000000000 008:00003 libselinux.so.1  
0000003ec581d000    2044 ----- 000000000001d000 008:00003 libselinux.so.1  
0000003ec5a1c000       4 r---- 000000000001c000 008:00003 libselinux.so.1  
0000003ec5a1d000       4 rw--- 000000000001d000 008:00003 libselinux.so.1  
0000003ec5a1e000       4 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec6000000      88 r-x-- 0000000000000000 008:00003 libresolv-2.12.so
0000003ec6016000    2048 ----- 0000000000016000 008:00003 libresolv-2.12.so
0000003ec6216000       4 r---- 0000000000016000 008:00003 libresolv-2.12.so
0000003ec6217000       4 rw--- 0000000000017000 008:00003 libresolv-2.12.so
0000003ec6218000       8 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec6c00000      88 r-x-- 0000000000000000 008:00003 libnsl-2.12.so    
0000003ec6c16000    2044 ----- 0000000000016000 008:00003 libnsl-2.12.so    
0000003ec6e15000       4 r---- 0000000000015000 008:00003 libnsl-2.12.so    
0000003ec6e16000       4 rw--- 0000000000016000 008:00003 libnsl-2.12.so    
0000003ec6e17000       8 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec7000000      28 r-x-- 0000000000000000 008:00003 libcrypt-2.12.so  
0000003ec7007000    2048 ----- 0000000000007000 008:00003 libcrypt-2.12.so  
0000003ec7207000       4 r---- 0000000000007000 008:00003 libcrypt-2.12.so  
0000003ec7208000       4 rw--- 0000000000008000 008:00003 libcrypt-2.12.so  
0000003ec7209000     184 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec7400000     408 r-x-- 0000000000000000 008:00003 libfreebl3.so    
0000003ec7466000    2048 ----- 0000000000066000 008:00003 libfreebl3.so    
0000003ec7666000       4 r---- 0000000000066000 008:00003 libfreebl3.so    
0000003ec7667000       4 rw--- 0000000000067000 008:00003 libfreebl3.so    
0000003ec7668000      16 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec7800000    1488 r-x-- 0000000000000000 008:00003 libcrypto.so.1.0.0
0000003ec7974000    2044 ----- 0000000000174000 008:00003 libcrypto.so.1.0.0
0000003ec7b73000     100 r---- 0000000000173000 008:00003 libcrypto.so.1.0.0
0000003ec7b8c000      40 rw--- 000000000018c000 008:00003 libcrypto.so.1.0.0
0000003ec7b96000      16 rw--- 0000000000000000 000:00000   [ anon ]        
0000003ec7c00000    1240 r-x-- 0000000000000000 008:00003 libmysqlclient.so.16.0.0
0000003ec7d36000    2044 ----- 0000000000136000 008:00003 libmysqlclient.so.16.0.0
0000003ec7f35000     312 rw--- 0000000000135000 008:00003 libmysqlclient.so.16.0.0
0000003ec7f83000       4 rw--- 0000000000000000 000:00000   [ anon ]              
0000003ec8000000      12 r-x-- 0000000000000000 008:00003 libcom_err.so.2.1      
0000003ec8003000    2044 ----- 0000000000003000 008:00003 libcom_err.so.2.1      
0000003ec8202000       4 r---- 0000000000002000 008:00003 libcom_err.so.2.1      
0000003ec8203000       4 rw--- 0000000000003000 008:00003 libcom_err.so.2.1      
0000003ec8400000     260 r-x-- 0000000000000000 008:00003 libgssapi_krb5.so.2.2  
0000003ec8441000    2048 ----- 0000000000041000 008:00003 libgssapi_krb5.so.2.2  
0000003ec8641000       4 r---- 0000000000041000 008:00003 libgssapi_krb5.so.2.2  
0000003ec8642000       8 rw--- 0000000000042000 008:00003 libgssapi_krb5.so.2.2  
0000003ec8800000       8 r-x-- 0000000000000000 008:00003 libutil-2.12.so        
0000003ec8802000    2044 ----- 0000000000002000 008:00003 libutil-2.12.so        
0000003ec8a01000       4 r---- 0000000000001000 008:00003 libutil-2.12.so        
0000003ec8a02000       4 rw--- 0000000000002000 008:00003 libutil-2.12.so        
0000003ec8c00000     164 r-x-- 0000000000000000 008:00003 libk5crypto.so.3.1      
0000003ec8c29000    2048 ----- 0000000000029000 008:00003 libk5crypto.so.3.1      
0000003ec8e29000       4 r---- 0000000000029000 008:00003 libk5crypto.so.3.1      
0000003ec8e2a000       4 rw--- 000000000002a000 008:00003 libk5crypto.so.3.1      
0000003ec8e2b000       4 rw--- 0000000000000000 000:00000   [ anon ]              
0000003eca000000     876 r-x-- 0000000000000000 008:00003 libkrb5.so.3.3          
0000003eca0db000    2044 ----- 00000000000db000 008:00003 libkrb5.so.3.3          
0000003eca2da000      40 r---- 00000000000da000 008:00003 libkrb5.so.3.3          
0000003eca2e4000       8 rw--- 00000000000e4000 008:00003 libkrb5.so.3.3          
0000003eca800000       8 r-x-- 0000000000000000 008:00003 libkeyutils.so.1.3      
0000003eca802000    2044 ----- 0000000000002000 008:00003 libkeyutils.so.1.3      
0000003ecaa01000       4 r---- 0000000000001000 008:00003 libkeyutils.so.1.3      
0000003ecaa02000       4 rw--- 0000000000002000 008:00003 libkeyutils.so.1.3      
0000003ecac00000      40 r-x-- 0000000000000000 008:00003 libkrb5support.so.0.1  
0000003ecac0a000    2044 ----- 000000000000a000 008:00003 libkrb5support.so.0.1  
0000003ecae09000       4 r---- 0000000000009000 008:00003 libkrb5support.so.0.1  
0000003ecae0a000       4 rw--- 000000000000a000 008:00003 libkrb5support.so.0.1  
0000003ecb000000     340 r-x-- 0000000000000000 008:00003 libssl.so.1.0.0        
0000003ecb055000    2048 ----- 0000000000055000 008:00003 libssl.so.1.0.0        
0000003ecb255000      12 r---- 0000000000055000 008:00003 libssl.so.1.0.0        
0000003ecb258000      20 rw--- 0000000000058000 008:00003 libssl.so.1.0.0        
00007ffdb0148000     132 rw--- 0000000000000000 000:00000   [ anon ]              
00007ffdb0169000      48 r-x-- 0000000000000000 008:00003 libnss_files-2.12.so    
00007ffdb0175000    2048 ----- 000000000000c000 008:00003 libnss_files-2.12.so    
00007ffdb0375000       4 r---- 000000000000c000 008:00003 libnss_files-2.12.so    
00007ffdb0376000       4 rw--- 000000000000d000 008:00003 libnss_files-2.12.so    
00007ffdb0377000      84 r-x-- 0000000000000000 008:00003 libz.so.1.2.3
00007ffdb038c000    2044 ----- 0000000000015000 008:00003 libz.so.1.2.3
00007ffdb058b000       4 r---- 0000000000014000 008:00003 libz.so.1.2.3
00007ffdb058c000       4 rw--- 0000000000015000 008:00003 libz.so.1.2.3
00007ffdb059d000     132 r-x-- 0000000000000000 008:00003 mysql.so
00007ffdb05be000    2044 ----- 0000000000021000 008:00003 mysql.so
00007ffdb07bd000      12 rw--- 0000000000020000 008:00003 mysql.so
00007ffdb07c0000     128 r-x-- 0000000000000000 008:00003 DBI.so
00007ffdb07e0000    2048 ----- 0000000000020000 008:00003 DBI.so
00007ffdb09e0000       4 rw--- 0000000000020000 008:00003 DBI.so
00007ffdb09e1000      28 r-x-- 0000000000000000 008:00003 forks.so
00007ffdb09e8000    2044 ----- 0000000000007000 008:00003 forks.so
00007ffdb0be7000       4 rw--- 0000000000006000 008:00003 forks.so
00007ffdb0be8000      80 r-x-- 0000000000000000 008:00003 Storable.so
00007ffdb0bfc000    2048 ----- 0000000000014000 008:00003 Storable.so
00007ffdb0dfc000       4 rw--- 0000000000014000 008:00003 Storable.so
00007ffdb0dfd000      16 r-x-- 0000000000000000 008:00003 IO.so
00007ffdb0e01000    2048 ----- 0000000000004000 008:00003 IO.so
00007ffdb1001000       4 rw--- 0000000000004000 008:00003 IO.so
00007ffdb1002000      20 r-x-- 0000000000000000 008:00003 Socket.so
00007ffdb1007000    2044 ----- 0000000000005000 008:00003 Socket.so
00007ffdb1206000       8 rw--- 0000000000004000 008:00003 Socket.so
00007ffdb1208000       8 r-x-- 0000000000000000 008:00003 Damn.so
00007ffdb120a000    2044 ----- 0000000000002000 008:00003 Damn.so
00007ffdb1409000       4 rw--- 0000000000001000 008:00003 Damn.so
00007ffdb140a000      36 r-x-- 0000000000000000 008:00003 Util.so
00007ffdb1413000    2044 ----- 0000000000009000 008:00003 Util.so
00007ffdb1612000       4 rw--- 0000000000008000 008:00003 Util.so
00007ffdb1613000     108 r-x-- 0000000000000000 008:00003 POSIX.so
00007ffdb162e000    2044 ----- 000000000001b000 008:00003 POSIX.so
00007ffdb182d000      12 rw--- 000000000001a000 008:00003 POSIX.so
00007ffdb1830000      12 r-x-- 0000000000000000 008:00003 Fcntl.so
00007ffdb1833000    2048 ----- 0000000000003000 008:00003 Fcntl.so
00007ffdb1a33000       4 rw--- 0000000000003000 008:00003 Fcntl.so
00007ffdb1a34000     104 r-x-- 0000000000000000 008:00003 MoreUtils.so
00007ffdb1a4e000    2044 ----- 000000000001a000 008:00003 MoreUtils.so
00007ffdb1c4d000       4 rw--- 0000000000019000 008:00003 MoreUtils.so
00007ffdb1c4e000    2000 r---- 0000000000000000 008:00003 locale-archive
00007ffdb1e42000      24 rw--- 0000000000000000 000:00000   [ anon ]
00007ffdb1e58000       4 rw--- 0000000000000000 000:00000   [ anon ]
00007ffdb1e59000      24 r-x-- 0000000000000000 008:00003 HiRes.so
00007ffdb1e5f000    2044 ----- 0000000000006000 008:00003 HiRes.so
00007ffdb205e000       4 rw--- 0000000000005000 008:00003 HiRes.so
00007fff3c2c4000      84 rw--- 0000000000000000 000:00000   [ stack ]
00007fff3c3ff000       4 r-x-- 0000000000000000 000:00000   [ anon ]
ffffffffff600000       4 r-x-- 0000000000000000 000:00000   [ anon ]
mapped: 105896K    writeable/private: 22284K    shared: 0K
 
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Entre las soluciones sería instalar el SO con el mínimo de librerías o programar el código en C++.
¿Alguna sugerencia?
andres
Perlero nuevo
Perlero nuevo
 
Mensajes: 1
Registrado: 2013-08-29 02:18 @138

Publicidad

Re: Exceso de memoria usada por forks

Notapor explorer » 2013-08-29 10:42 @487

Bienvenido a los foros de Perl en Español, andres.

Bueno, el caso es que no importa que los procesos hijo consuman 100 MB. Lo importante es que los procesos hijo compartan buena parte de esos 100 MB.

Sería interesante ver cuánta memoria ocupa un hijo solo en memoria, y luego ir aumentando el número de hijos, y cómo se va consumiendo realmente la memoria principal. Con módulos como Linux::Smaps y GTop (ejemplo y más doc sobre memoria compartida) se puede saber lo que realmente está consumiendo cada proceso. La información que devuelve top y ps, no es del todo exacta (lo que muestran como "memoria compartida" es aquella que, explícitamente, se ha solicitado como tal. No es la memoria que se comparte en un proceso copy-on-write, como ocurre en un fork).

Entonces, si el proceso padre carga todas las librerías, y los procesos hijo heredan todo ese espacio de memoria, deberían ocupar al principio muy poca memoria extra. Y solo al cabo de un cierto tiempo, empezar a crecer (a medida que van necesitan reservar más memoria para sus variables y procesos propios), hasta que deciden que no deben seguir vivos.

En el volcado de pmap que nos has mandado, indica que ese proceso no tiene ninguna memoria compartida, pero no sabemos si se refiere al padre o a uno de sus hijos.

Aquí tienes un ejemplo de cálculo de la memoria consumida, y del cálculo del máximo teórico de hijos que podrían generarse en un sistema.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados