uclibc vs glibc - сравниваем потребление памяти (ram)

Используем пакеты, расширяющие возможности оборудования
Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

Сообщение Zyxmon » 10 июл 2016, 20:12

В настоящее время фиды Entware для arm и intel собираются с системной библиотекой glibc, а фид mipsel с библиотекой uclibc-ng.
Неоднократно приходилось слышать, что бинарнки 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

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 10 июл 2016, 20:19

Тесты проводились на 2х роутерах. Один на MT7620N RAM 64MB, второй MT7621AT RAM 256MB. Результаты приводятся по второму роутеру. На первом все аналогично.

Тест №1. Запущены dropbear, nginx, php-fcgi, vnstatd, shellinabox.
Результаты entware с uclibc
free_u.jpg


htop_u.jpg


php_u.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 10 июл 2016, 20:19

Аналогично для Entware с glibc:

free_g.jpg
htop_g.jpg
php_g.jpg


Как видим разница минимальная - от 0.2MБ до 1.2MБ по разным интерпретациям.
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 10 июл 2016, 21:17

Добавляем к тестам pyload (как тяжелое приложение, python). После загрузки роутера добавляем в pyload скачивание образ debian.
Результаты аналогичные. Разница практически отсутствует. Измерялка памяти free в этом тесте дает преимущество варианту с glibc. Но возможно потребление памяти pyload разное в разные моменты скачивания:
free_py_u.jpg
htop_py_u.jpg
php_py_u.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 10 июл 2016, 21:18

Вариант с glibc
free_py_g.jpg
htop_py_g.jpg
php_py_g.jpg
У вас нет необходимых прав для просмотра вложений в этом сообщении.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 10 июл 2016, 21:22

Скорее всего исследования будут продолжены. Предлагайте методики.

Не исключено, что буде выпущен отдельный feed Entware-mipsel с ядром 3.4 и glibc. Его можно будет использовать на роутерах с прошивкой Падавана, ZyXEL keenetic (прошивки 2.07 с ядром Падавана) и DD-WRT с ядрами 3.x и 4.x.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 11 июл 2016, 11:56

На ixbt был такой комментарий по этим исследованиям
так сейчас же вроде musl в тренде для эмбедеда ?

Продублирую ниже свой ответ:

При разработке прошивок есть такой тренд. Прошивка должна уместиться в ограниченную флешь память. Тут musl и uclibc в лидерах. Если (грубо) uclibc нужен 1МБ на флеше, то glibc больше 2.5.

Entware - это система, устанавливаемая на внешний накопитель. Там 2-3 лишних мегабайта hdd или на usb флешке рояли не играют.

А вот сточки зрения сборки, беглючности результата (userspace) я бы ранжировал так (1) glibc, (2) uclibc, (3) musl. В самой прошивке немного userspace и оно допилено для всех либ. Если же речь о сборке тысяч пакетов, то musl явно проигрывает. Посмотрите число патчей для musl в исходниках пакетов openwrt - оно огромно!

Аватара пользователя
Александр Рыжов
Сообщения: 443
Зарегистрирован: 12 авг 2015, 14:14
Откуда: Смоленск

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Александр Рыжов » 11 июл 2016, 13:28

Zyxmon, сравни heap\stack как Лёня советует. На примере dnsmasq из пакетов:

Код: Выделить всё

opkg install dnsmasq-full adsuck

В конфиге dnsmasq достаточно раскоментировать одну строчку port, чтобы он работал на нестандартном порту.

  • «Пустой»:

    Код: Выделить всё

    /opt/sbin/dnsmasq
    pmap -dp 14690
    14690:   /opt/sbin/dnsmasq
    Address   Kbytes Mode  Offset           Device    Mapping
    00400000     264 r-x-- 0000000000000000 008:00001 /opt/sbin/dnsmasq
    00451000       4 rw--- 0000000000041000 008:00001 /opt/sbin/dnsmasq
    00452000       4 rwx-- 0000000000000000 000:00000   [ anon ]
    007ee000      28 rwx-- 0000000000000000 000:00000   [ anon ]
    77496000     640 r-x-- 0000000000000000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77536000      64 ----- 0000000000000000 000:00000   [ anon ]
    77546000       4 r---- 00000000000a0000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77547000       4 rw--- 00000000000a1000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77548000      20 rw--- 0000000000000000 000:00000   [ anon ]
    7754d000      28 r-x-- 0000000000000000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    77561000       8 rw--- 0000000000000000 000:00000   [ anon ]
    77563000       4 r---- 0000000000006000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    77564000       4 rw--- 0000000000007000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    7f850000     132 rwx-- 0000000000000000 000:00000   [ stack ]
    7ffff000       4 r-x-- 0000000000000000 000:00000   [ anon ]
    mapped: 1212K    writeable/private: 204K    shared: 0K
    
    
  • С большим подгруженным hosts-файлом:

    Код: Выделить всё

    /opt/sbin/dnsmasq --addn-hosts=/opt/etc/adsuck/Hosts.pub
    ps afx | grep dnsmasq
    pmap -dp 14676
    14676:   /opt/sbin/dnsmasq --addn-hosts=/opt/etc/adsuck/Hosts.pub
    Address   Kbytes Mode  Offset           Device    Mapping
    00400000     264 r-x-- 0000000000000000 008:00001 /opt/sbin/dnsmasq
    00451000       4 rw--- 0000000000041000 008:00001 /opt/sbin/dnsmasq
    00452000       4 rwx-- 0000000000000000 000:00000   [ anon ]
    008a0000      28 rwx-- 0000000000000000 000:00000   [ anon ]
    008a7000    7316 rwx-- 0000000000000000 000:00000   [ anon ]
    77ab6000     640 r-x-- 0000000000000000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77b56000      64 ----- 0000000000000000 000:00000   [ anon ]
    77b66000       4 r---- 00000000000a0000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77b67000       4 rw--- 00000000000a1000 008:00001 /opt/lib/libuClibc-1.0.13.so
    77b68000      20 rw--- 0000000000000000 000:00000   [ anon ]
    77b6d000      28 r-x-- 0000000000000000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    77b81000       8 rw--- 0000000000000000 000:00000   [ anon ]
    77b83000       4 r---- 0000000000006000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    77b84000       4 rw--- 0000000000007000 008:00001 /opt/lib/ld-uClibc-1.0.13.so
    7fcec000     132 rwx-- 0000000000000000 000:00000   [ stack ]
    7ffff000       4 r-x-- 0000000000000000 000:00000   [ anon ]
    mapped: 8528K    writeable/private: 7520K    shared: 0K

7316КБ во втором случае — размер кучи.

Аватара пользователя
Zyxmon
Администратор
Сообщения: 1911
Зарегистрирован: 09 авг 2015, 15:33

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Zyxmon » 11 июл 2016, 14:19

Александр Рыжов писал(а):Источник цитаты 7316КБ во втором случае — размер кучи.

И что это показывает? Программа запросила данные из heap для входных данных. Она это сделает с любым вариантом libc. Или там в сырцах иначе?

Аватара пользователя
Александр Рыжов
Сообщения: 443
Зарегистрирован: 12 авг 2015, 14:14
Откуда: Смоленск

uclibc vs glibc - сравниваем потебление памяти (ram)

Сообщение Александр Рыжов » 11 июл 2016, 14:24

Zyxmon писал(а):Источник цитаты И что это показывает? Программа запросила данные из heap для входных данных. Она это сделает с любым вариантом libc. Или там в сырцах иначе?
Есть возможность сравнить как набивают кучу разные варианты. Размеры структур-то могут отличаться.

Это покажет разницу в прожорливости malloc(), если такова вообще обнаружится.


Вернуться в «Entware/Qnapware/Optware/Zyxware - обсуждаем репозитории пакетов»

Кто сейчас на конференции

Всего 2 посетителя :: 0 зарегистрированных, 0 скрытых и 2 гостя (основано на активности пользователей за последние 5 минут)
Больше всего посетителей (162) здесь было 16 ноя 2019, 18:33

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя