У меня есть серверное приложение, написанное на С++. После запуска он использует около 480 КБ памяти на x86 Linux (Ubuntu 8.04, GCC 4.2.4). Я думаю, что 480 КБ - это чрезмерный объем памяти: сервер еще ничего не делает, клиенты не подключены к серверу. (См. Также мой комментарий ниже, в котором я объясняю, почему я думаю, что 480 КБ - большая часть памяти.) Единственное, что делает сервер во время инициализации, - это генерация одного или двух потоков, настройка нескольких сокетов и другие простые вещи, которые не очень интенсивные для памяти.
Обратите внимание, что я говорю об использовании реальной памяти, а не о VM. Я измерил его, запустив 100 экземпляров моего сервера на незанятом ноутбуке и измерив использование системной памяти с "свободным" до и после запуска экземпляров сервера. Я уже принял кэш файловой системы и все такое.
После некоторого тестирования оказалось, что что-то в среде выполнения С++ заставляет мой сервер использовать эту большую память, даже если сам сервер ничего не делает. Например, если я вставляю
getchar(); return 0;
сразу после
int main(int argc, char *argv[]) {
тогда использование памяти по-прежнему составляет 410 КБ на экземпляр!
Мое приложение зависит только от Curl и Boost. У меня есть большой опыт работы с программированием на С, и я знаю, что библиотеки C не имеют тенденций увеличивать потребление памяти, пока я их не использую.
Другие вещи, которые я нашел:
- Простое приложение приветствия Clo потребляет около 50 КБ памяти.
- Простое приложение hello world C, связанное с Curl, но в противном случае не используя Curl, также потребляет около 50 КБ памяти.
- Простое приложение С++ для hello world (без Boost) потребляет около 100 КБ памяти.
- Простое приветственное приложение С++, включающее некоторые заголовки Boost, но на самом деле не использует Boost, потребляет около 100 КБ памяти. Нет символов Boost при проверке исполняемого файла с помощью "nm".
Поэтому я заключу следующее:
- Gcc выбрасывает неиспользуемые символы Boost.
- Если мое приложение использует Boost, , то что-то в среде выполнения С++ (возможно, динамический компоновщик) заставляет его использовать много памяти. Но что? Как узнать, что это такое, и что я могу сделать с ними?
Я помню несколько дискуссий KDE несколько лет назад о проблемах динамического компоновщика С++. Тогда динамический компоновщик Linux С++ вызвал медленное время запуска приложений KDE С++ и большое потребление памяти. Насколько я знаю, эти проблемы были исправлены во время выполнения С++. Но может ли что-то подобное быть причиной чрезмерного потребления памяти, которое я вижу?
Ответы экспертов gcc/dynamic linking приветствуются.
Для тех, кому интересно, сервер, о котором идет речь, является агентом регистрации Phusion Passenger: https://github.com/FooBarWidget/passenger/blob/master/ext/common/LoggingAgent/Main.cpp