Tengo una aplicación de servidor escrita en C++. Después del inicio, utiliza alrededor de 480 KB de memoria en x86 Linux (Ubuntu 8.04, GCC 4.2.4). Creo que 480 KB es una cantidad excesiva de memoria: el servidor ni siquiera está haciendo nada, no se han conectado clientes al servidor. (Consulte también mi comentario a continuación en el que explico por qué creo que 480 KB es una gran cantidad de memoria.) Lo único que hace el servidor durante la inicialización es engendrar uno o dos hilos, configurar unos pocos sockets y otras cosas simples que no son es muy intensivo en memoria.Cómo reducir el consumo de memoria C++ por defecto?
Tenga en cuenta que estoy hablando de real uso de memoria, no el tamaño de la VM. Lo medí comenzando 100 instancias de mi servidor en una computadora portátil inactiva y midiendo el uso de memoria del sistema con 'libre' antes y después de iniciar las instancias del servidor. Ya tomé el caché del sistema de archivos y cosas así en la cuenta.
Después de algunas pruebas, parece que algo en el tiempo de ejecución de C++ hace que mi servidor use tanta memoria, incluso si el servidor no hace nada. Por ejemplo, si inserto
getchar(); return 0;
justo después
int main(int argc, char *argv[]) {
entonces el uso de memoria es todavía 410 KB por ejemplo!
Mi aplicación depende solo de Curl y Boost. Tengo una buena cantidad de experiencia con la programación C y sé que las bibliotecas C no tienden a aumentar el consumo de memoria hasta que las utilizo.
Otras cosas que he encontrado:
- Una aplicación simple hola mundo C consume alrededor de 50 KB de memoria.
- Una sencilla aplicación C de hello world vinculada a Curl, pero que de lo contrario no usa Curl, consume aproximadamente 50 KB de memoria también.
- Una aplicación Hello World C++ (sin Boost) consume aproximadamente 100 KB de memoria.
- Una sencilla aplicación de C++ de hello world que incluye algunos encabezados de Boost, pero que en realidad no usa Boost, consume aproximadamente 100 KB de memoria. Sin símbolos Boost al inspeccionar el ejecutable con 'nm'.
Por consiguiente, mi conclusión es la siguiente:
- gcc tira a la basura símbolos Boost no utilizados.
- Si mi aplicación usa Boost, , entonces algo en el tiempo de ejecución C++ (probablemente el enlazador dinámico) hace que use mucha memoria. ¿Pero qué? ¿Cómo averiguo qué son estas cosas y qué puedo hacer con ellas?
Recuerdo algunas discusiones de KDE hace varios años acerca de los problemas del enlazador dinámico de C++. El engarzador dinámico de Linux C++ generaba un tiempo de inicio lento en las aplicaciones de KDE C++ y un gran consumo de memoria. Por lo que sé, esos problemas se han solucionado desde entonces en tiempos de ejecución C++. Pero, ¿podría algo similar ser la causa del consumo excesivo de memoria que estoy viendo?
Las respuestas de gcc/dynamic linking experts son muy apreciadas.
Para aquellos que son curiosos, el servidor en cuestión es agente de registro de pasajeros Phusion: https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp
"boost" no es muy específico, es solo "una biblioteca" en el sentido de que puede obtenerlo en un archivo zip, realmente es un gran paquete de bibliotecas. Si todo lo que usa es 'boost :: shared_ptr', puede salirse con menos de 350K extra, por lo que cualquier intento de reducir su sobrecarga tiene que ser específico para lo que está usando. –
Realmente no veo el problema en 480kb/instancia. Tal vez debería preocuparse por el uso de la memoria en los casos de uso reales, en lugar de cuando no está haciendo nada. – Puppy
No estoy seguro de lo que está viendo es un problema real. Es cierto, 480kB es una gran cantidad de RAM para una aplicación de "hello world", pero los sistemas modernos no están optimizados para ejecutar "hello world" de la manera más eficiente posible. Están optimizados para ejecutar aplicaciones útiles. Entonces, la pregunta más relevante no debería ser "¿cómo hago que 'hello world' sea más pequeño", sino más bien "es mi aplicación actual usando demasiada memoria, y si es así, cómo puedo reducir eso"? –