Ускоряем pacman при работе с базой данных

Внимание! Использование изложенного материала может нанести вред и стать причиной неработоспособности операционной системы. Если Вы не понимаете суть вводимых команд, не используйте данный материал. В будущем эти рекомендации могут оказаться деструктивными. Участники этого обсуждения не несут ответственности за Вашу безответственность.
:evil:

Неоднократно встречаю в сети высказывания типа: “pacman тормоз!”. В большей степени, пользователи относят это к работе pacman с его же базой данных при операциях поиска, обновлениях. Если Вы сторонник данного высказывания, то эта статья может побудить Вас исправить своё мнение.

База данных pacman расположена в файловой системе в каталоге /var/lib/pacman. Здесь содержится информация о пакетах из репозитория (sync) и локально установленных(local). В своей структуре это каталоги с названиями пакетов и их версиями (на примере local):
tunguska% ls /var/lib/pacman/local | head
a52dec-0.7.4-4
abs-2.3.3-1
acl-2.2.48-1
acpid-1.0.10-1
acpitool-0.5.1-1
akonadi-1.2.1-3
alsa-lib-1.0.21.a-1
alsa-utils-1.0.21-1
amarok-2.2.1-2
apr-1.3.9-1
В которых мета информация содержится в 2-х или более маленьких текстовых файлах (на примере a52dec):
tunguska% ls -l /var/lib/pacman/local/a52dec-0.7.4-4/
итого 3
-rw-r--r-- 1 root root  17 Ноя 17 17:45 depends
-rw-r--r-- 1 root root 288 Ноя 17 17:45 desc
-rw-r--r-- 1 root root 444 Ноя 17 17:45 files

Теперь о цифрах. Репозитории core, extra, community в общей сложности содержат примерно 5000 пакетов, а локально установленных (у меня) - чуть более 700. В сумме ~6 000 пакетов или столько же каталогов в база данных pacman. Умножаем это число на два и получаем как минимум 12 000 маленьких файлов с метаданными о пакетах. Дальше ещё интереснее.

На какой файловой системе хранится база данных pacman? У меня это ext4 размером 20GB монтируемая в корень (/). Учитывая размеры ФС и количество маленьких файлов метаданных пакетов, не трудно догадаться, какими требовательными будут операции файловой подсистемы, особенно при первом обращении (пустом кеше ФС) к базе данных pacman. Уже близко.

Сколько же всё это добро использует дискового пространства? Смотрим:
tunguska% du -hs /var/lib/pacman
72M     /var/lib/pacman
Вы скажете: “72MB? Да у меня диск читает со скоростью 100MB/s”. Угу, правильно. Правильно, но к файловым система это имеет посредственное отношение. В общем, 72MB как минимум двенадцати тысяч мелких файлов а) занимают много места ФС; б) очень долго открываются. Поэтому основная задача сводится к избавлению от этих недостатков. Приехали.

План свержения расточительного руководства pacman и захват власти в “свои руки”:
  1. Резервное копирование базы данных pacman;
  2. Создание “крохотной” ФС внутри раздела /var/lib;
  3. Монтирование полученной ФС;
  4. Перенос базы данных на новую ФС;

    И так начнём (все команды требуют привилегий пользователя root):
    Забыл предупредить, что устанавливать или удалять пакеты, пока не принято решение оставить этот способ, категорически не рекомендуется.
  5. Резервное копирование базы данных pacman:
    tar cfj ~/pacman.db.tar.bz2 /var/lib/pacman
  6. Создание “крохотной” ФС:
    dd if=/dev/zero of=/var/lib/pacman.db bs=1M count=100
    mkfs.ext4 /var/lib/pacman.db
  7. Монтирование полученной ФС:
    echo "/var/lib/pacman.db /var/lib/pacman ext4 loop 0 0" >> /etc/fstab
    sed -i "s/MODULES=(/MODULES=(loop /" /etc/rc.conf
    mount -a
  8. Перенос базы данных на новую ФС:
    cd /
    tar xfj ~/pacman.db.tar.bz2
  9. Profit!!!

    Теперь вся база данных pacman находится в одном большом файле и занимает:
    tunguska% du -hs /var/lib/pacman
    24M     /var/lib/pacman
    против прежних 72MB. Разница примерно в три раза. Тестирование скорости обработки данных, я думаю, Вы оцените сами. :)

    ЗЫ: Не удалена старая база (она перекрылась монтированием). Возврат к прежней схеме хранения базы данных после установки или удаления пакетов возможен при синхронизации каталога local.

    ЗЫЫ: На оригинальность не претендую, возможно, кто-то уже пользуется таким или иным методом ускорения pacman. Замечания и поправки приветствуются.
Разберемся, голубчик!
Интересно, сейчас попробую.
После последней команды:
# tar xfj ~/pacman.db.tar.bz2                                        
tar: var/lib/pacman/local/gclient-svn-72-1/files: Невозможно open: На устройстве кончилось место
tar: var/lib/pacman/local/gclient-svn-72-1/depends: Невозможно open: На устройстве кончилось место
tar: var/lib/pacman/local/xorg-fonts-encodings-1.0.3-1: Невозможно mkdir: На устройстве кончилось место
tar: var/lib/pacman/local/xorg-fonts-encodings-1.0.3-1/desc: Невозможно open: Нет такого файла или каталога
tar: var/lib/pacman/local/xorg-fonts-encodings-1.0.3-1/install: Невозможно open: Нет такого файла или каталога
tar: var/lib/pacman/local/xorg-fonts-encodings-1.0.3-1/files: Невозможно open: Нет такого файла или каталога  
tar: var/lib/pacman/local/xorg-fonts-encodings-1.0.3-1/depends: Невозможно open: Нет такого файла или каталога
tar: var/lib/pacman/local/kdelibs3-3.5.10-7: Невозможно mkdir: На устройстве кончилось место    
???
 pacman -Syu                                                                                            
:: Синхронизируются базы данных пакетов...                                                                                 
ошибка: не удалось начать запрос (не удалось заблокировать базу данных)
  если вы уверены, что pacman не запущен, можете
  удалить /var/lib/pacman/db.lck
 pacman -Syu                                                                                            
:: Синхронизируются базы данных пакетов...                                                                                 
ошибка: не удалось начать запрос (не удалось заблокировать базу данных)
  если вы уверены, что pacman не запущен, можете
  удалить /var/lib/pacman/db.lck

Вот такие дела.
Сразу вспоминается красная надпись. :(
стоит ли ради 5 секунд такой огород городить?
лучше б гимп ускорили ;)
такие дела.
pioner14
На устройстве кончилось место
Сразу вспоминается красная надпись. :(
конечно. я же ошибку допустил :)

посмотри какого размера у тебя файл /var/lib/pacman.db
Разберемся, голубчик!
В ходе обсуждения на irc канале выяснился прирост в производительности
<amigo> pacman -Si 1,85s user 2,64s system 36% cpu 12,348 total
<amigo> против
<amigo> pacman -Si 0,72s user 0,64s system 39% cpu 3,442 total
Разберемся, голубчик!
исправил п.4
cd /var/lib/pacman
на
cd /
Разберемся, голубчик!
Amigo
pioner14
На устройстве кончилось место
Сразу вспоминается красная надпись. :(
конечно. я же ошибку допустил :)

посмотри какого размера у тебя файл /var/lib/pacman.db
du -hs /var/lib/pacman.db
101M /var/lib/pacman.db

Как исправить????
На ноуте jfs, попробывать погонять ext4 в таком хотя бы варианте:) да! jfs зло, или мне не везет - бывает содержимоей файлов теряется, даже при нормальном завершении работы, что-то тут не чисто. Где то был проект там базу засунули в мускуль, но тут уже нужно сам пакман фиксить
systemd должен умереть.
Amigo
исправил п.4
cd /var/lib/pacman
на
cd /

Может
cd ~/

Все таки?
 
Зарегистрироваться или войдите чтобы оставить сообщение.