2011-06-22 7 views
5

Actualmente estoy ejecutando Perl 5.8.8 en un servidor y estoy tratando de instalar 5.14.¿Por qué IPC :: SysV-> shmget responde con EINVAL?

Lo configuré para utilizar y usar 64 bits y, de lo contrario, los valores predeterminados que sugería.

maquillaje corrió sin problemas, pero hacen la prueba está fallando, en

../cpan/IPC-SysV/t/ipcsysv.t 
../cpan/IPC-SysV/t/shm.t 

así:

# ./perl harness ../cpan/IPC-SysV/t/shm.t ../cpan/IPC-SysV/t/ipcsysv.t 
../cpan/IPC-SysV/t/shm.t ...... IPC::SharedMem->new failed: Invalid argument at t/shm.t line 54. 
../cpan/IPC-SysV/t/shm.t ...... Dubious, test returned 22 (wstat 5632, 0x1600) 
No subtests run 
../cpan/IPC-SysV/t/ipcsysv.t .. 1/38 shmget failed: Invalid argument at t/ipcsysv.t line 100. 
# Looks like you planned 38 tests but ran 17. 
# Looks like your test exited with 22 just after 17. 
../cpan/IPC-SysV/t/ipcsysv.t .. Dubious, test returned 22 (wstat 5632, 0x1600) 
Failed 21/38 subtests 

Test Summary Report 
------------------- 
../cpan/IPC-SysV/t/shm.t (Wstat: 5632 Tests: 0 Failed: 0) 
    Non-zero exit status: 22 
    Parse errors: No plan found in TAP output 
../cpan/IPC-SysV/t/ipcsysv.t (Wstat: 5632 Tests: 17 Failed: 0) 
    Non-zero exit status: 22 
    Parse errors: Bad plan. You planned 38 tests but ran 17. 
Files=2, Tests=17, 0 wallclock secs (0.01 usr 0.00 sys + 0.13 cusr 0.00 csys = 0.14 CPU) 
Result: FAIL 

Ambas pruebas están reportando el argumento no válido ', pero cuando miro a la fuente , No puedo ver nada que parezca no válido No estoy seguro de cómo proceder ... ¿algún apuntador?

ACTUALIZACIÓN

me corrieron

strace perl -MIPC::SysV=IPC_PRIVATE,S_IRWXU -e 'shmget(IPC_PRIVATE, 8, S_IRWXU) or die $!' 

en dos servidores: uno que está teniendo estos problemas y uno que no lo es.

Hubo una gran cantidad de la producción, pero lo que parece interesante es la siguiente:

BUENO:

. 
. 
. 
stat64("/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/site_perl/5.8.8/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/site_perl/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/5.8.8/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/auto/IPC/SysV", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so", {st_mode=S_IFREG|0755, st_size=15072, ...}) = 0 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.bs", 0x9d7f0c8) = -1 ENOENT (No such file or directory) 
futex(0x4d106c, FUTEX_WAKE_PRIVATE, 2147483647) = 0 
open("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so", O_RDONLY) = 4 
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \v\0\0004\0\0\0"..., 512) = 512 
fstat64(4, {st_mode=S_IFREG|0755, st_size=15072, ...}) = 0 
mmap2(NULL, 17948, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x588000 
mmap2(0x58c000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x3) = 0x58c000 
close(4)        = 0 
close(3)        = 0 
shmget(IPC_PRIVATE, 8, 0700)   = 7438344 
exit_group(0)      

MALO:

. 
. 
. 
stat64("/usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/site_perl/5.8.8/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/site_perl/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/5.8.8/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/vendor_perl/auto/IPC/SysV", 0x8d290c8) = -1 ENOENT (No such file or directory) 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so", {st_mode=S_IFREG|0755, st_size=15072, ...}) = 0 
stat64("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.bs", 0x8d290c8) = -1 ENOENT (No such file or directory) 
futex(0x94306c, FUTEX_WAKE_PRIVATE, 2147483647) = 0 
open("/usr/lib/perl5/5.8.8/i386-linux-thread-multi/auto/IPC/SysV/SysV.so", O_RDONLY) = 4 
read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \v\0\0004\0\0\0"..., 512) = 512 
fstat64(4, {st_mode=S_IFREG|0755, st_size=15072, ...}) = 0 
mmap2(NULL, 17948, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0x6a4000 
mmap2(0x6a8000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x3) = 0x6a8000 
close(4)        = 0 
close(3)        = 0 
shmget(IPC_PRIVATE, 8, 0700)   = -1 EINVAL (Invalid argument) 
open("/usr/share/locale/locale.alias", O_RDONLY) = 3 
fstat64(3, {st_mode=S_IFREG|0644, st_size=2528, ...}) = 0 
mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7dbe000 
read(3, "# Locale name alias data base.\n#"..., 4096) = 2528 
read(3, "", 4096)      = 0 
close(3)        = 0 
munmap(0xb7dbe000, 4096)    = 0 
open("/usr/share/locale/en_US.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/share/locale/en_US.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/share/locale/en_US/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/share/locale/en.UTF-8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/share/locale/en.utf8/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
open("/usr/share/locale/en/LC_MESSAGES/libc.mo", O_RDONLY) = -1 ENOENT (No such file or directory) 
write(2, "Invalid argument at -e line 1.\n", 31Invalid argument at -e line 1. 
) = 31 
exit_group(22)       = ? 

Por lo tanto, parece que el mismo está ocurriendo en ambos servidores, es solo que en uno, veo shmget (IPC_PRIVATE, 8, 0700) = 7438344

y el otro, veo

shmget(IPC_PRIVATE, 8, 0700)   = -1 EINVAL (Invalid argument) 

Las versiones del IPC :: SysV son los mismos en ambos servidores ... pero parece a mí que esto no es relevante, y que el problema es el de la código que hace que el sistema llame ... ¿verdad?

¿Qué sigue?

** ** ACTUALIZACIÓN 2

Después de algunas google, me encontré con lo siguiente:

BUENO:

# cat /proc/sys/kernel/shmmax 
4294967295 

MALO:

# cat /proc/sys/kernel/shmmax 
0 

Por lo tanto, lo que explica la EINVAL, desde (desde the man pages)

EINVAL

Un nuevo segmento iba a ser creado y tamaño < SHMMIN o tamaño> SHMMAX, o ningún nuevo segmento se iba a crear, un segmento con clave dada existía, pero el tamaño es mayor que el tamaño de ese segmento.

Ahora, mi pregunta es, ¿hay una buena razón por la cual se podría establecer en cero?

+1

¿Intentar hacer la prueba? – bdonlan

+0

Además, probablemente deba informar esto al mantenedor de IPC :: SysV – bdonlan

+0

Parece que IPC :: SharedMem-> new() falla con un argumento no válido porque shmget() falla. La definición de shmget es 'int shmget (key_t key, size_t size, int shmflg);', como el nuevo() constructor. Algo sale mal, tal vez con el parámetro shmflg ... ¿Qué edad tiene tu kernel? ¿Has intentado construir sobre un kernel más reciente? –

Respuesta

5

Problema resuelto.

El archivo /etc/sysctl.conf contenía los siguientes:

kernel.shmmax = 137438953472 

Este es un valor de 64 bits, pero el sistema es un sistema de 32 bits.

Como resultado, el valor SHMMAX se estableció en 0, lo que hace que todas las llamadas a shmget fallen.

Si lo cambia a

kernel.shmmax = 4294967295 

Y el uso de

echo 4294967295 >/proc/sys/kernel/shmmax 

he cambiado el valor de SHMMAX y la prueba finalizado con éxito.