Linux usa COW para mantener el uso de memoria bajo después de una bifurcación, pero la forma en que funcionan las variables Perl 5 en perl
parece anular esta optimización. Por ejemplo, para la variable:¿Cómo puedo evitar que la memoria explote cuando los procesos secundarios tocan metadatos variables?
my $s = "1";
perl
es realmente el almacenamiento:
SV = PV(0x100801068) at 0x1008272e8
REFCNT = 1
FLAGS = (POK,pPOK)
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
Cuando se utiliza esa cadena en un contexto numérico, modifica el C struct
representación de los datos:
SV = PVIV(0x100821610) at 0x1008272e8
REFCNT = 1
FLAGS = (IOK,POK,pIOK,pPOK)
IV = 1
PV = 0x100201d50 "1"\0
CUR = 1
LEN = 16
El puntero de cadena en sí no cambió (todavía es 0x100201d50
), pero ahora está en un C struct
diferente (a PVIV
en lugar de PV
). No modifiqué el valor en absoluto, pero de repente estoy pagando un costo de VACA. ¿Hay alguna manera de bloquear la representación de perl
de una variable Perl 5 para que este ahorro de tiempo (perl
no tenga que convertir "0"
en 0
por segunda vez) hack no hace daño al uso de mi memoria?
Nota, las representaciones anteriormente fueron generados a partir de este código:
perl -MDevel::Peek -e '$s = "1"; Dump $s; $s + 0; Dump $s'
Bien, pero ¿sabes qué pasará cuando asignes unos cientos de MB de datos, ahorres pocos hijos y esos niños terminarán? GC te matará de todos modos. Es una historia triste, pero Perl es la herramienta equivocada para este tipo de trabajo.Lo solucionamos parcialmente usando el método END {kill 9 $$}, pero en este punto deberías buscar una herramienta mejor ;-) –
El GC no me molesta, el código real está basado en 'mod_perl' y cada niño se reutiliza muchas veces . El problema es que los datos de configuración que se cargan en el elemento primario se copian en cada uno de los posibles cientos de niños aunque los niños nunca lo modifiquen (desde la perspectiva de Perl 5, 'perl' se está volcando con los metadatos). La otra solución que he considerado es mover los datos de configuración a un proceso separado y dejar que los niños hablen sobre los sockets de dominio. –
También puede usar la memoria compartida, que será más rápida. –