Tengo un problema desconcertante. Tengo una biblioteca que usa sg para ejecutar CDB personalizados. Hay un par de sistemas que habitualmente tienen problemas con la asignación de memoria en sg . Por lo general, el controlador sg tiene un límite estricto de alrededor de 4 mb, pero lo vemos en estos pocos sistemas con ~ 2.3 mb de solicitudes. Es decir, los CDB se están preparando para asignar una transferencia de 2.3mb. No debería haber ningún problema aquí: 2.3 <4.0.
Ahora, el perfil de la máquina. Es una CPU de 64 bits pero ejecuta CentOS 6.0 de 32 bits (no los construí ni tengo nada que ver con esta decisión). La versión del kernel para esta distribución CentOS es 2.6.32. Tienen 16 gb de RAM.
Así es como se ve el uso de la memoria en el sistema (sin embargo, debido a que este error ocurre durante las pruebas automatizadas, aún no he verificado si esto refleja el estado en el que se devuelve este error de sg ).
top - 00:54:46 up 5 days, 22:05, 1 user, load average: 0.00, 0.01, 0.21
Tasks: 297 total, 1 running, 296 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 15888480k total, 9460408k used, 6428072k free, 258280k buffers
Swap: 4194296k total, 0k used, 4194296k free, 8497424k cached
Encontré este artículo de Linux Journal que trata sobre la asignación de memoria en el núcleo. El artículo está fechado pero parece pertenecer a 2.6 (algunos comentarios sobre el autor a la cabeza). El artículo menciona que el núcleo está limitado a aproximadamente 1 gb de memoria (aunque no está completamente claro en el texto si ese 1 gb es físico, virtual o total). Me pregunto si esta es una declaración precisa para 2.6.32. En última instancia, me pregunto si estos sistemas están alcanzando este límite.
Aunque esto no es realmente una respuesta a mi problema, me pregunto sobre la veracidad del reclamo de 2.6.32. Entonces, ¿cuál es el límite real de memoria para el núcleo? Es posible que esto deba considerarse para la resolución de problemas. Cualquier otra sugerencia es bienvenida. Lo que hace que esto sea tan desconcertante es que estos sistemas son idénticos a muchos otros que no muestran este mismo problema.
fuente
Quiero agregar un poco a la excelente respuesta de Warren Young , porque las cosas son realmente peores de lo que escribe.
El espacio de direcciones del núcleo de 1 GB se divide en dos partes. 128 MB son para
vmalloc
y 896 MB paralowmem
. No importa lo que realmente signifique. Al asignar memoria, el código del núcleo debe elegir cuál de estos quiere. No puede obtener memoria de la agrupación que tenga espacio libre.Si elige
vmalloc
, tiene un límite de 128 MB. Ahora 1GB no se ve tan mal ...Si elige
lowmem
, tiene un límite de 896 MB. No muy lejos de 1 GB, pero en este caso, todas las asignaciones se redondean a la siguiente potencia de 2. Por lo tanto, una asignación de 2,3 MB realmente consume 4 MB. Además, no puede asignar más de 4 MB en una llamada cuando se usalowmem
.64 bits realmente es la respuesta correcta.
fuente