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