Сколько дискового пространства реально экономят разделяемые библиотеки в современных дистрибутивах Linux? - PullRequest
4 голосов
/ 20 января 2010

В дебатах статических и совместно используемых библиотек я часто слышал, что совместно используемые библиотеки устраняют дублирование и сокращают общее дисковое пространство. Но сколько дискового пространства действительно экономят разделяемые библиотеки в современных дистрибутивах Linux? Сколько еще места потребуется, если все программы будут скомпилированы с использованием статических библиотек? Кто-нибудь сокрушал цифры для типичного настольного дистрибутива Linux, такого как Ubuntu? Есть ли статистика?

ДОПОЛНЕНИЕ:

Все ответы были информативными и ценятся, но, похоже, они сбили мой вопрос, а не пытались ответить на него. Калеб был на правильном пути, но он решил сократить числа для места памяти вместо места на диске (мой вопрос был о месте на диске).

Поскольку программы «платят» только за те части статических библиотек, которые они используют, практически невозможно количественно определить, какое различие дискового пространства будет для всех статических и всех совместно используемых.

Теперь я чувствую, что мне нужно разбить вопрос, когда я понимаю, что ответить практически невозможно. Но я оставлю это здесь, чтобы сохранить информативные ответы.

Так что ТАК перестает мучить меня, чтобы выбрать ответ, я собираюсь выбрать самый популярный (даже если он обходит вопрос).

Ответы [ 5 ]

9 голосов
/ 20 января 2010

Я не уверен, где вы слышали это, но уменьшенное дисковое пространство - это в основном красная сельдь, поскольку дисковое пространство приближается к копейкам за гигабайт. Реальная выгода от разделяемых библиотек приходит с обновлениями безопасности и исправлениями ошибок для этих библиотек; приложения, использующие статические библиотеки, должны быть перестроены индивидуально с новыми библиотеками, тогда как все приложения, использующие общие библиотеки, могут быть обновлены сразу, заменив только несколько файлов.

6 голосов
/ 20 января 2010

Совместно используемые библиотеки не только экономят дисковое пространство, но и экономят память, и это гораздо важнее. Здесь важен шаг предварительной ссылки ... вы не можете совместно использовать страницы памяти между двумя экземплярами одной и той же библиотеки, если они не загружены по одному и тому же адресу, и предварительная ссылка позволяет это сделать.

4 голосов
/ 23 января 2010

Общие библиотеки не обязательно сохраняют дисковое пространство или память.

Когда приложение связывается со статической библиотекой, только те части библиотеки, которые использует приложение, будут помещены в двоичный файл приложения. Библиотечный архив (.a) содержит объектные файлы (.o), и, если они хорошо проанализированы, приложение будет использовать меньше памяти, связываясь только с объектными файлами, которые оно использует. Общие библиотеки будут содержать всю библиотеку на диске и в памяти независимо от того, используются ли ее части приложениями или нет.

Для настольных и серверных систем это менее вероятно приведет к выигрышу в целом, но если вы разрабатываете встроенные приложения, стоит попробовать статическое связывание всех приложений, чтобы увидеть, дает ли это общую экономию.

2 голосов
/ 21 января 2010

Мне удалось вычислить частичный количественный ответ без необходимости выполнять непристойный объем работы. Вот моя методология (без ума от волос):

1) Используйте следующую команду, чтобы сгенерировать список пакетов с установленным размером и списком зависимостей:

dpkg-query -Wf '${Package}\t${Installed-Size}\t${Depends}

2) Разобрать результаты и построить карту статистики для каждого пакета:

struct PkgStats
{
    PkgStats() : kbSize(0), dependantCount(0) {}
    int kbSize;
    int dependentCount;
};

typedef std::map<std::string, PkgStats> PkgMap;

Где dependentCount - количество других пакетов, от которых напрямую зависит от этого пакета.

Результаты

Вот список 20 самых популярных пакетов в моей системе:

Package             Installed KB    # Deps  Dup'd MB
libc6               10096           750     7385
python              624             112     68
libatk1.0-0         200             92      18
perl                18852           48      865
gconf2              248             34      8
debconf             988             23      21
libasound2          1428            19      25
defoma              564             18      9
libart-2.0-2        164             14      2
libavahi-client3    160             14      2
libbz2-1.0          128             12      1
openoffice.org-core 124908          11      1220
gcc-4.4-base        168             10      1
libbonobo2-0        916             10      8
cli-common          336             8       2
coreutils           12928           8       88
erlang-base         6708            8       46
libbluetooth3       200             8       1
dictionaries-common 1016            7       6

где Dup'd MB - это количество мегабайт, которое было бы дублировано, если бы не было общего доступа (= installed_size * (dependants_count - 1), для dependants_count > 1).

Не удивительно видеть libc6 сверху. :) Кстати, у меня есть типичная установка Ubuntu 9.10 с несколькими установленными пакетами, связанными с программированием, а также с некоторыми инструментами ГИС.

Немного статистики:

  • Всего установленных пакетов: 1717
  • Среднее число прямых иждивенцев: 0,92
  • Общий дублированный размер без совместного использования (без учета косвенных зависимостей): 10,25 ГБ
  • Гистограмма # прямых иждивенцев (обратите внимание на логарифмическую шкалу Y): Histogram

Обратите внимание, что приведенное выше полностью игнорирует косвенные зависимости (то есть все должно быть, по крайней мере, косвенно зависеть от libc6). Что я действительно должен был сделать, так это построить график всех зависимостей и использовать его в качестве основы для моей статистики. Может быть, я когда-нибудь займусь этим и опубликую длинную статью в блоге с более подробной информацией и строгостью.

2 голосов
/ 21 января 2010

Хорошо, возможно, не ответ, но я бы посчитал экономию памяти. Экономия будет основываться на количестве загрузок библиотеки после первого приложения, поэтому давайте выясним, сколько сбережений приходится на библиотеку в системе, используя быстрый скрипт:

#!/bin/sh

lastlib=""
let -i cnt=1
let -i size=0
lsof | grep 'lib.*\.so$' | awk '{print $9}' | sort | while read lib ; do
    if [ "$lastlib" == "$lib" ] ; then
        let -i cnt="$cnt + 1"
    else
        let -i size="`ls -l $lib | awk '{print $5}'`"
        let -i savings="($cnt - 1) * $size"
        echo "$lastlib: $savings"
        let -i cnt=1
    fi
    lastlib="$lib"
done

Это даст нам экономию на одну библиотеку, как таковую:

...
/usr/lib64/qt4/plugins/crypto/libqca-ossl.so: 0
/usr/lib64/qt4/plugins/imageformats/libqgif.so: 540640
/usr/lib64/qt4/plugins/imageformats/libqico.so: 791200
...

Тогда общая экономия:

$ ./checker.sh | awk '{total = total + $2}END{print total}'
263160760

Итак, грубо говоря, в моей системе я экономлю около 250 мегабайт памяти. Ваш пробег будет варьироваться.

...