tengo - Linux: no puede asignar más de 32 GB/64 GB de memoria en un solo proceso debido al límite de memoria virtual
ver memoria ram linux terminal (1)
Este es un problema de configuración de sistema y ulimit, no un problema de c ++.
Puedo ejecutar su código modificado adecuadamente en un tipo de instancia de Amazon EC2 r3.4xlarge
sin problema. Estos cuestan menos de $ 0.20 / hora en el mercado spot, por lo que le sugiero que alquile uno, y tal vez eche un vistazo en / etc y compare su propia configuración ... o tal vez necesite recompilar un kernel de Linux para usar ese mucha memoria ... pero no es un problema de C ++ o gcc.
Ubuntu en la máquina EC2 ya estaba configurado para memoria de proceso ilimitada.
$ sudo su
# ulimit -u
--> unlimited
Este tiene 125GB de ram
# free
total used free shared buffers cached
Mem: 125903992 1371828 124532164 344 22156 502248
-/+ buffers/cache: 847424 125056568
Swap: 0 0 0
Modifiqué los límites de tu programa para subir a 149GB.
Aquí está la salida. Se ve bien hasta 118 GB.
root@ip-10-203-193-204:/home/ubuntu# ./memtest
allocation of 1 x 25 GB of data. Ok? yes
allocation of 1 x 26 GB of data. Ok? yes
allocation of 1 x 27 GB of data. Ok? yes
allocation of 1 x 28 GB of data. Ok? yes
allocation of 1 x 29 GB of data. Ok? yes
allocation of 1 x 30 GB of data. Ok? yes
allocation of 1 x 31 GB of data. Ok? yes
allocation of 1 x 32 GB of data. Ok? yes
allocation of 1 x 33 GB of data. Ok? yes
allocation of 1 x 34 GB of data. Ok? yes
allocation of 1 x 35 GB of data. Ok? yes
allocation of 1 x 36 GB of data. Ok? yes
allocation of 1 x 37 GB of data. Ok? yes
allocation of 1 x 38 GB of data. Ok? yes
allocation of 1 x 39 GB of data. Ok? yes
allocation of 1 x 40 GB of data. Ok? yes
allocation of 1 x 41 GB of data. Ok? yes
allocation of 1 x 42 GB of data. Ok? yes
allocation of 1 x 43 GB of data. Ok? yes
allocation of 1 x 44 GB of data. Ok? yes
allocation of 1 x 45 GB of data. Ok? yes
allocation of 1 x 46 GB of data. Ok? yes
allocation of 1 x 47 GB of data. Ok? yes
allocation of 1 x 48 GB of data. Ok? yes
allocation of 1 x 49 GB of data. Ok? yes
allocation of 1 x 50 GB of data. Ok? yes
allocation of 1 x 51 GB of data. Ok? yes
allocation of 1 x 52 GB of data. Ok? yes
allocation of 1 x 53 GB of data. Ok? yes
allocation of 1 x 54 GB of data. Ok? yes
allocation of 1 x 55 GB of data. Ok? yes
allocation of 1 x 56 GB of data. Ok? yes
allocation of 1 x 57 GB of data. Ok? yes
allocation of 1 x 58 GB of data. Ok? yes
allocation of 1 x 59 GB of data. Ok? yes
allocation of 1 x 60 GB of data. Ok? yes
allocation of 1 x 61 GB of data. Ok? yes
allocation of 1 x 62 GB of data. Ok? yes
allocation of 1 x 63 GB of data. Ok? yes
allocation of 1 x 64 GB of data. Ok? yes
allocation of 1 x 65 GB of data. Ok? yes
allocation of 1 x 66 GB of data. Ok? yes
allocation of 1 x 67 GB of data. Ok? yes
allocation of 1 x 68 GB of data. Ok? yes
allocation of 1 x 69 GB of data. Ok? yes
allocation of 1 x 70 GB of data. Ok? yes
allocation of 1 x 71 GB of data. Ok? yes
allocation of 1 x 72 GB of data. Ok? yes
allocation of 1 x 73 GB of data. Ok? yes
allocation of 1 x 74 GB of data. Ok? yes
allocation of 1 x 75 GB of data. Ok? yes
allocation of 1 x 76 GB of data. Ok? yes
allocation of 1 x 77 GB of data. Ok? yes
allocation of 1 x 78 GB of data. Ok? yes
allocation of 1 x 79 GB of data. Ok? yes
allocation of 1 x 80 GB of data. Ok? yes
allocation of 1 x 81 GB of data. Ok? yes
allocation of 1 x 82 GB of data. Ok? yes
allocation of 1 x 83 GB of data. Ok? yes
allocation of 1 x 84 GB of data. Ok? yes
allocation of 1 x 85 GB of data. Ok? yes
allocation of 1 x 86 GB of data. Ok? yes
allocation of 1 x 87 GB of data. Ok? yes
allocation of 1 x 88 GB of data. Ok? yes
allocation of 1 x 89 GB of data. Ok? yes
allocation of 1 x 90 GB of data. Ok? yes
allocation of 1 x 91 GB of data. Ok? yes
allocation of 1 x 92 GB of data. Ok? yes
allocation of 1 x 93 GB of data. Ok? yes
allocation of 1 x 94 GB of data. Ok? yes
allocation of 1 x 95 GB of data. Ok? yes
allocation of 1 x 96 GB of data. Ok? yes
allocation of 1 x 97 GB of data. Ok? yes
allocation of 1 x 98 GB of data. Ok? yes
allocation of 1 x 99 GB of data. Ok? yes
allocation of 1 x 100 GB of data. Ok? yes
allocation of 1 x 101 GB of data. Ok? yes
allocation of 1 x 102 GB of data. Ok? yes
allocation of 1 x 103 GB of data. Ok? yes
allocation of 1 x 104 GB of data. Ok? yes
allocation of 1 x 105 GB of data. Ok? yes
allocation of 1 x 106 GB of data. Ok? yes
allocation of 1 x 107 GB of data. Ok? yes
allocation of 1 x 108 GB of data. Ok? yes
allocation of 1 x 109 GB of data. Ok? yes
allocation of 1 x 110 GB of data. Ok? yes
allocation of 1 x 111 GB of data. Ok? yes
allocation of 1 x 112 GB of data. Ok? yes
allocation of 1 x 113 GB of data. Ok? yes
allocation of 1 x 114 GB of data. Ok? yes
allocation of 1 x 115 GB of data. Ok? yes
allocation of 1 x 116 GB of data. Ok? yes
allocation of 1 x 117 GB of data. Ok? yes
allocation of 1 x 118 GB of data. Ok? yes
allocation of 1 x 119 GB of data. Ok? nope
allocation of 1 x 120 GB of data. Ok? nope
allocation of 1 x 121 GB of data. Ok? nope
allocation of 1 x 122 GB of data. Ok? nope
allocation of 1 x 123 GB of data. Ok? nope
allocation of 1 x 124 GB of data. Ok? nope
allocation of 1 x 125 GB of data. Ok? nope
allocation of 1 x 126 GB of data. Ok? nope
allocation of 1 x 127 GB of data. Ok? nope
allocation of 1 x 128 GB of data. Ok? nope
allocation of 1 x 129 GB of data. Ok? nope
allocation of 1 x 130 GB of data. Ok? nope
allocation of 1 x 131 GB of data. Ok? nope
allocation of 1 x 132 GB of data. Ok? nope
allocation of 1 x 133 GB of data. Ok? nope
allocation of 1 x 134 GB of data. Ok? nope
allocation of 1 x 135 GB of data. Ok? nope
allocation of 1 x 136 GB of data. Ok? nope
allocation of 1 x 137 GB of data. Ok? nope
allocation of 1 x 138 GB of data. Ok? nope
allocation of 1 x 139 GB of data. Ok? nope
allocation of 1 x 140 GB of data. Ok? nope
allocation of 1 x 141 GB of data. Ok? nope
allocation of 1 x 142 GB of data. Ok? nope
allocation of 1 x 143 GB of data. Ok? nope
allocation of 1 x 144 GB of data. Ok? nope
allocation of 1 x 145 GB of data. Ok? nope
allocation of 1 x 146 GB of data. Ok? nope
allocation of 1 x 147 GB of data. Ok? nope
allocation of 1 x 148 GB of data. Ok? nope
allocation of 1 x 149 GB of data. Ok? nope
Ahora, sobre esos US $ 0,17 que gasté en esto ...
Tengo una computadora con 128 GB de RAM, ejecutando Linux (3.19.5-200.fc21.x86_64). Sin embargo, no puedo asignar más de ~ 30 GB de RAM en un solo proceso. Más allá de esto, malloc
falla:
#include <stdlib.h>
#include <iostream>
int main()
{
size_t gb_in_bytes = size_t(1)<<size_t(30); // 1 GB in bytes (2^30).
// try to allocate 1 block of ''i'' GB.
for (size_t i = 25; i < 35; ++ i) {
size_t n = i * gb_in_bytes;
void *p = ::malloc(n);
std::cout << "allocation of 1 x " << (n/double(gb_in_bytes)) << " GB of data. Ok? " << ((p==0)? "nope" : "yes") << std::endl;
::free(p);
}
}
Esto produce el siguiente resultado:
/tmp> c++ mem_alloc.cpp && a.out
allocation of 1 x 25 GB of data. Ok? yes
allocation of 1 x 26 GB of data. Ok? yes
allocation of 1 x 27 GB of data. Ok? yes
allocation of 1 x 28 GB of data. Ok? yes
allocation of 1 x 29 GB of data. Ok? yes
allocation of 1 x 30 GB of data. Ok? yes
allocation of 1 x 31 GB of data. Ok? nope
allocation of 1 x 32 GB of data. Ok? nope
allocation of 1 x 33 GB of data. Ok? nope
allocation of 1 x 34 GB of data. Ok? nope
Busqué bastante tiempo y descubrí que esto está relacionado con el tamaño máximo de la memoria virtual:
~> ulimit -all
[...]
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
virtual memory (kbytes, -v) 32505856
[...]
Puedo aumentar este límite a ~ 64 GB a través de ulimit -v 64000000
, pero no más. Más allá de esto, obtengo errores de operation not permitted
:
~> ulimit -v 64000000
~> ulimit -v 65000000
bash: ulimit: virtual memory: cannot modify limit: Operation not permitted
~> ulimit -v unlimited
bash: ulimit: virtual memory: cannot modify limit: Operation not permitted
Algunas búsquedas más revelaron que, en principio, debería ser posible establecer estos límites a través de la entrada "as" (espacio de direcciones) en /etc/security/limits.conf
. Sin embargo, al hacer esto, solo podía reducir la cantidad máxima de memoria virtual, no aumentarla .
¿Hay alguna manera de elevar este límite de memoria virtual por proceso por completo, o aumentarlo más allá de 64 GB? Me gustaría usar toda la memoria física en una sola aplicación.
EDITAR:
Después de Ingo Leonhardt, probé
ulimits -v unlimited
luego de iniciar sesión como root, no como usuario estándar. Al hacerlo, se resuelve el problema de root (el programa puede asignar toda la memoria física mientras está conectado como root). Pero esto funciona solo para root, no para otros usuarios. Sin embargo, al menos esto significa que, en principio, el kernel puede manejar esto muy bien, y que solo hay un problema de configuración.En cuanto a
limits.conf
: intenté agregar explícitamente- difícil como ilimitado
- suave como ilimitado
a
/etc/security/limits.conf
, y reiniciando. Esto no tuvo efecto. Después de iniciar sesión como usuario estándar,ulimit -v
aún devuelve alrededor de 32 GB, yulimit -v 65000000
todavía dice que sepermission denied
(mientras queulimit -v 64000000
funciona). El resto delimits.conf
está comentado, y en/etc/security/limits.d
solo hay otra entrada no relacionada (que limitanproc
a 4096 para usuarios no root). Es decir, el límite de la memoria virtual debe provenir de otra parte quelimits.conf
sealimits.conf
. ¿Alguna idea de qué más podría llevar aulimits -v
no ser "ilimitado"?
EDIT / RESOLUCIÓN:
Fue causado por mi propia estupidez. Tenía un programa (largamente olvidado) en mi configuración de usuario que utilizaba
setrlimit
para restringir la cantidad de memoria por proceso para evitar que Linux se canse hasta la muerte. Fue copiado involuntariamente de una máquina de 32 GB a la máquina de 128 GB. Gracias a Paul, Andrew Janke y a todos los demás por ayudarnos a rastrearlo. Lo siento a todos: /.Si alguien más se encuentra con esto:
ulimit/setrlimit
en la configuración bash y de perfil, y los programas que potencialmente puedan invocar esos (suyos y los de todo el sistema / etc) y asegúrese de que/security/limits.conf
no incluya esto límite ... (o al menos intente crear un nuevo usuario, para ver si esto sucede en su usuario o en la configuración del sistema)