У меня есть двоичный файл для программы, написанной на C / C ++, которая будет запускаться много раз на одном сервере (Linux CentOS 7, x64), чтобы имитировать нагрузочный тест на удаленном сервере. Исполняемый файл может быть либо статически связан (.a), либо динамически связан (.so) с зависимыми библиотеками.
Чтобы запустить как можно больше копий, мы пытаемся запустить версию, которая использует динамический c связывание, чтобы разделить как можно больше памяти между процессами, однако, похоже, это не имеет никакого значения (во всяком случае, это немного хуже).
Например, для запуска 9000 копий статически связанного процесса используется 43 ГБ RAM, при использовании динамически связанного используется 48 ГБ RAM).
При использовании pmap -XX может показаться, что общие объекты используются правильно (например, для одного из них libPocoFoundation.so):
Address Perm Offset Device Inode Size Rss Pss Shared_Clean Shared_Dirty Private_Clean Private_Dirty Referenced Anonymous AnonHugePages Swap KernelPageSize MMUPageSize Locked VmFlagsMapping
7f6a9498c000 r-xp 00000000 fd:00 26053805 1940 844 422 844 0 0 0 844 0 0 0 4 4 0 rd ex mr mw me sd libPocoFoundation.so
7f6a94b71000 ---p 001e5000 fd:00 26053805 2044 0 0 0 0 0 0 0 0 0 0 4 4 0 mr mw me sd libPocoFoundation.so
7f6a94d70000 r--p 001e4000 fd:00 26053805 60 60 60 0 0 0 60 32 60 0 0 4 4 0 rd mr mw me ac sd libPocoFoundation.so
7f6a94d7f000 rw-p 001f3000 fd:00 26053805 16 16 16 0 0 0 16 16 16 0 0 4 4 0 rd wr mr mw me ac sd libPocoFoundation.so
Существует значительное значение Shared_Clean для libPocoFoundation.so, поэтому я думаю, это работает нормально.
Все инструменты, которые я могу найти для проверки свободной памяти (meminfo.py, top, free, smem, htop), похоже, примерно согласны с тем, что количество используемой и свободной памяти одинаково, поэтому я склонен верить цифрам.
Все библиотеки (и исполняемый файл) скомпилированы с -fPI C с использованием gcc / g ++ 4.9.2 (должна быть более старая версия, так как этот продукт скомпилирован на очень старых платформах).
Может ли кто-нибудь объясните, почему это не работает (или, по крайней мере, не работает) или что я делаю неправильно?
Большое спасибо.