Неоднократно приходилось слышать, что бинарнки glibc нуждаются в большем объеме памяти.
Именно этому вопросу и посвящена данная тема.
Общее сравнение разных системных библиотек можно найти тут - Comparison of C/POSIX standard library implementations for Linux. Кроме рассмотренных там системных библиотек есть и другие: bionic (используется в Android) или NewLib. Мы же ограничимся двумя glibc и uclibc-ng. В интернете я нашел только одно сравнение этих библиотек по памяти, на форуме openwrt в 2012г. Там сравнивались древняя eglib (форк glibc, сейчас он объединен с glibc) и uclibc (0.9.33.2). Вывод был сделан такой - glibc потребляет на 17% памяти больше.
TheBB решил проверить это для современных версий. В этом и я немного помогал.
Как происходила проверка. Были собраны две версии Entware для mipsel. Одна с glibc 2.23, вторая с uclibc-ng 1.0.16. gcc 5.3. Ядро 3.4.122.
Сначала мы решили сравнить бинарники с помощью утилиты pmap. Эта утилита показываем зарезервированную (mapped) память (зарезервированное адресное пространство). Бинарники, собранные с glibc требовали на 20-30-50% больше аналогичных, собранных с uclibc. Некоторые даже в 2 раза больше.
Но!!! Зарезервированное адресное пространство не всегда реально используемое. Зарезервированное адресное пространство библиотек (so - shared objects) следует делить на число запущенных бинарников, которые их используют.
Подробнее об этом
https://techtalk.intersec.com/2013/07/m ... ss-memory/
https://www.opennet.ru/base/sys/pmap_memory.txt.html (на русском)
Боольшое спасибо за эти ссылки маэстро Padavan!
Эксперименты проводились следующим образом. Готовилась флешка и настаивался автозапуск нескольких сервисов Entware. После загрузки роутера (всегда проводилось холодная загрузка роутера с отключением питания) изучалось потребление памяти командами free, htop (еще и демонстрация запущенных приложений) и в коде php (сервер nginx, поднятый на роутере).
Все эти способы фактически интерпретируют данные ядра linux (/proc/meminfo), но немного по-разному.
Вот пример данных ядра
Код: Выделить всё
cat /proc/meminfo
MemTotal: 126652 kB
MemFree: 41288 kB
Buffers: 12336 kB
Cached: 41608 kB
SwapCached: 0 kB
Active: 23020 kB
Inactive: 37392 kB
Active(anon): 6500 kB
Inactive(anon): 72 kB
Active(file): 16520 kB
Inactive(file): 37320 kB
Unevictable: 0 kB
Mlocked: 0 kB
SwapTotal: 524284 kB
SwapFree: 524284 kB
Dirty: 28 kB
Writeback: 0 kB
AnonPages: 6484 kB
Mapped: 11156 kB
Shmem: 108 kB
Slab: 14840 kB
SReclaimable: 3024 kB
SUnreclaim: 11816 kB
KernelStack: 464 kB
PageTables: 260 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 587608 kB
Committed_AS: 16676 kB
VmallocTotal: 1048372 kB
VmallocUsed: 3824 kB
VmallocChunk: 1021220 kB