# Improve pacman performance (Русский)

Эта страница нуждается в сопроводителе

Статья не гарантирует актуальность информации. Помогите русскоязычному сообществу поддержкой подобных страниц. См. Команда переводчиков ArchWiki

## Увеличение скорости доступа к базе данных

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

Самый безопасный и самый простой метод выполнить команду с правами root

    pacman-optimize && sync

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

    # pacman -Sc && pacman-optimize

## Увеличение скорости загрузки

Примечание: Если у вас низкая скорость загрузки, убедитесь, что не используете зеркало ftp.archlinux.org (новость с марта 2007 г.), вместо него используйте другие зеркала из списка зеркал.

Скорость Pacman'а при загрузке пакетов также можно улучшить, если использовать другое приложение для загрузки вместо встроенного в Pacman менеджера закачек.

В любом случае, прежде чем делать какие-либо изменения, убедитесь, что используете самый свежий Pacman.

    pacman -Syu

### Использование wget

Если Вам нужны более мощные настройки прокси, нежели те, которые предоставляет встроенный менеджер закачек pacman'а - использование wget может быть более удобным.

Для того чтобы использовать `wget`, сначала установите его с помощью команды `pacman -S wget`, а затем отредактируйте `/etc/pacman.conf`, приведя в секции `[options]` строку XferCommand = к следующему виду:

    XferCommand = /usr/bin/wget -c --passive-ftp -c %u

Вместо того чтобы размещать параметры `wget` в файле `/etc/pacman.conf`, Вы можете изменять непосредственно конфигурационный файл `wget`(общесистемный файл `/etc/wgetrc`, или пользовательские файлы `$HOME/.wgetrc`.

### Использование aria2

aria2 - легковесная утилита загрузки с возможностью докачки и сегментированной HTTP/HTTPS и FTP загрузки. aria2 - одновременно поддерживает несколько HTTP/HTTPS и FTP подключений к зеркалам Arch, это означает, что может увеличиться скорости загрузки файлов и поиска пакетов.

Примечание: Включение aria2c в настройке XferCommand Pacman'а не приводит к параллельной закачке нескольких пакетов. Pacman вызывает XferCommand для одного пакета и ожидает завершения закачки перед вызовом для следующего. Для параллельной загрузки нескольких пакетов смотрите далее в разделе powerpill-light section below.

#### Установка

Для загрузки и установки aria2 и зависимостей выполните:

    # pacman -Syu aria2

#### Настройка

Найдите в файле `/etc/pacman.conf` секцию `[options]` и измените следующий параметр:

    XferCommand = /usr/bin/aria2c --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=60 -t5 -d / -o %o %u

#### Подробнее об опциях

`/usr/bin/aria2c`
  Полный путь к исполняемому файлу aria2.
`--allow-overwrite=true`
  Перезапуск закачки если соответствующий файл не существует. (По умолчанию: false)
`-c, --continue`
  Продолжить закачку частично загруженного файла если контрольный файл существует.
`--file-allocation=none`
  Перед загрузкой заранее не выделять место под скачиваемый файл. (По умолчанию: prealloc) 1
`--log-level=error`
  Установить уровень ведения журнал - только ошибки. (По умолчанию: debug)
`-m2, --max-tries=2`
  Предпринимать не более 2-х попыток для загрузки из зеркала выбранного файла. (По умолчанию: 5)
`--max-connection-per-server=2`
  Устанавливать с зеркалом не более 2-х соединений на каждый файл. (По умолчанию: 1)
`--max-file-not-found=5`
  Если в течении 5-ти попыток не будет получен ни один байт - отключать принудительную загрузку. (По умолчанию: 0)
`--min-split-size=5M`
  Разбивать файл, только если его размер превышает 2;5MB = 10MB. (По умолчанию: 20M)
`--no-conf`
  Запрет использования файла `aria2.conf` если он существует. (По умолчанию: `~/.aria2/aria2.conf`)
`--remote-time=true`
  Использовать временные метки удаленного(-ых) файла(-ов) к локальному(-ым) файлу(-ам). (По умолчанию: false)
`--summary-interval=60`
  Output download progress summary every 60 seconds. (По умолчанию: 60) 2
`-t5, --timeout=5`
  Установка 5-ти секундного тайм-аута для зеркала после установления соединения. (По умолчанию: 60)
`-d, --dir`
  Директорию для загруженных файлов брать из настроек pacman.
`-o, --output`
  Имя полученного файла из загруженного.
`%o`
  Переменная предоставляющая локальные файлы согласно настройкам pacman.
`%u`
  Переменная предоставляюща загруженные URL согласно настройкам pacman.

#### Дополнительные примечания

1 `--file-allocation=falloc`
  Рекомендуется к использованию с такими файловыми системами как ext4 (с поддержкой экстентов), btrfs или xfs, в связи с почти мгновенным выделением мета под большие (GB) файлы. Не стоит использовать с традиционными файловыим системами аналогичными ext3, в связи с тем, что времени на выделение затрачивается практически столько же, сколько на блокировку процессом aria2 и на переход к закачке.

2 `--summary-interval=0`
  Подавляет процесс загрузки основной выходной информации и может улучшить общую производительность. Журналирование будет вестись согласно значению установленному в опции `log-level`.

3 `XferCommand = /usr/bin/printf 'Downloading ' && echo %u | awk -F/ '{printf $NF}' && printf '...' && /usr/bin/aria2c -q --allow-overwrite=true -c --file-allocation=none --log-level=error -m2 --max-connection-per-server=2 --max-file-not-found=5 --min-split-size=5M --no-conf --remote-time=true --summary-interval=0 -t5 -d / -o %o %u && echo ' Complete!'`
  Использование команды XferCommand в таком виде не так полезно, но зато дает больше подробной и удобночитаемой информации.

### Использование powerpill-light

pacman2aria2 предоставляет скрипт, называющийся powerpill-lightAUR[ссылка недействительна: package not found], который можно использовать в качестве частичной замены powerpill. И хотя это не полноценная обертка, как powerpill, но он поддерживает следующие возможности powerpill:

- параллельную загрузку
- сегментированную загрузку
- поиск быстрых зеркал с помощью Reflector, для увеличения скорости загрузки

Поэтому загрузка пакетов такая же быстрая, как и при использовании пакета powerpillAUR.

Пакет pacman2aria2 можно установить из AUR и из репозитория Xyne's.

#### Использование

Запускайте powerpill-light, аналогично синхронизации с помощью pacman, но не используя "-S". К примеру, для обновления системы вместо "pacman -Su", выполните

     # powerpill-light -u

Для установки gnome, вместо "pacman -S gnome", выполните

     # powerpill-light gnome

### Использование airpac

Вкратце, airpac[ссылка недействительна: сохранено в aur-mirror] является оболочкой aria2c[ссылка недействительна: package not found] для pacman. И если powerpillAUR - это интерфейс над pacman, то airpac - это только загрузчик для него. Хотя, с другой стороны, поскольку aria2c только скачивает файлы, все, что касается непосредственно загрузки файлов, выполняется аналогично powerpill. Но через бэкенд нельзя загружать несколько файлов одновременно, так, как это делает powerpill.

По сути, airpac - это написанный на Python скрипт pacgetAUR[ссылка недействительна: сохранено в aur-mirror]. Основное же отличие aria2c заключается в обработке вывода. airpac отображает только самую минимальную информацию, т.е. прогресс загрузки, хотя прогрессбар в настоящее время и не используется (возможен в ближайшем будущем). Помимо этого, airpac кэширует базу данных файлов таким образом, чтобы не загружать ее при каждом обновлении базы пакетов. С другой стороны, поскольку airpac не понимает параметров pacman, будет нарушено `pacman -Syy`. В качестве обходного пути, для удаления кэшированных файлов `/var/lib/pacman/.airpac` можно выполнить `pacman -Sc`.

Конфигурационный файл - `/etc/airpac.conf`. На самом деле этот файл является конфигурационным для aria2c. Поэтому у пользователя есть возможность настроить airpac аналогично aria2c-у, без вмешательства в код airpac'а. Для получения дополнительной информации по настройкам - обратитесь к справочной документации aria2c.

По умолчанию airpac использует настройку Server Performance Profile из aria2c. Файл статистики расположен в `/var/lib/airpac.stats`. URI, по умолчанию, включено в adaptive.

Для использования измените в `/etc/pacman.conf`:

    XferCommand = /usr/bin/airpac %u %o

### Скрипт зеркалирования - pacget (aria2)

Благодаря этому скрипту пользователи с широкополосным доступом могут значительно повысить скорость загрузки. В качестве зеркал для aria2, используются зеркала из `/etc/pacman.d/mirrorlist`. При этом aria2 загружает пакеты одновременно с нескольких зеркал, что дает хороший прирост в скорости загрузки пакетов.

Примечание: Вам понадобится добавить 'exec' перед /usr/bin/pacget в XferCommand. Это необходимо для того, чтоб при завершении pacget или aria2 (с id процесса pacget), также прекращал работу и pacman.
Важно: Использование зеркал которые не синхронизировались или не обновились может вызвать проблемы. Поэтому, для создания списка быстрых и свежих зеркал воспользуйтесь скриптом (Русский). Так же, ftp.archlinux.org допускает до двух IP. Вам нужно будет выбрать только один и указать IP адресс в `/etc/hosts`.

    /usr/bin/pacget

    #!/bin/bash

    msg() {
      echo ""
      echo -e "   \033[1;34m->\033[1;0m \033[1;1m${1}\033[1;0m" >&2
    }

    error() {
      echo -e "\033[1;31m==> ERROR:\033[1;0m \033[1;1m$1\033[1;0m" >&2
    }

    CONF=/etc/pacget.conf
    STATS=/etc/pacget.stats
    ARIA2=$(which aria2c 2> /dev/null)

    # ----- do some checks first -----
    if [ ! -x "$ARIA2" ]; then
      error "aria2c was not found or isn't executable."
      exit 1
    fi

    if [ $# -ne 2 ]; then
      error "Incorrect number of arguments"
      exit 1
    fi

    filename=$(basename $1)
    server=${1%/$filename}
    arch=$(grep ^Architecture /etc/pacman.conf | cut -d '=' -f2 | sed 's/ //g')
    if [[ $arch = "auto" ]]; then
      arch=$(uname -m)
    fi
    # Determine which repo is being used
    repo=$(awk -F'/' '$(NF-2)~/^(community|core|extra|testing|comunity-testing|multilib)$/{print $(NF-2)}' <<< $server)
    [ -z $repo ] && repo="custom"

    # For db files, or when using a custom repo (which most likely doesn't have any mirror),
    # use only the URL passed by pacman; Otherwise, extract the list of servers (from the include file of the repo) to download from
    url=$1
    if ! [[ $filename = *.db || $repo = "custom" ]]; then
      mirrorlist=$(awk -F' *= *' '$0~"^\\["r"\\]",/Include *= */{l=$2} END{print l}' r=$repo /etc/pacman.conf)
      if [ -n mirrorlist ]; then
        num_conn=$(grep ^split $CONF | cut -d'=' -f2)
        url=$(sed -r '/^Server *= */!d; s/Server *= *//; s/\$repo'"/$repo/"'; s/\$arch'"/$arch/; s/$/\/$filename/" $mirrorlist | head -n $(($num_conn *2)) )
      fi
    fi

    msg "Downloading $filename"
    cd /var/cache/pacman/pkg/

    touch $STATS

    $ARIA2 --conf-path=$CONF --max-tries=1 --max-file-not-found=5 \
      --uri-selector=adaptive --server-stat-if=$STATS --server-stat-of=$STATS \
      --allow-overwrite=true --remote-time=true --log-level=error --summary-interval=0 \
      $url --out=${filename}.pacget && [ ! -f ${filename}.pacget.aria2 ] && mv ${filename}.pacget $2 && chmod 644 $2

    exit $?

    /etc/pacget.conf

    # Файл логов
    log=/var/log/pacget.log
    # Количество серверов для загрузки
    split=5
    # Минимальный размер файла, который допускается дробить, т.е. загружать в несколько потоков (по умолчанию 20M)
    min-split-size=1M
    # Максимальная скорость загрузки (0 = без ограничений)
    max-download-limit=0
    # Минимальная скорость загрузки (0 = не важна)
    lowest-speed-limit=0
    # Время ожидания сервера
    timeout=5
    # 'none' или 'falloc'
    file-allocation=none

Сохраните этот скрипт как /usr/bin/pacget.

    # chmod 755 /usr/bin/pacget

И сделайте его исполняемым

В файле `/etc/pacman.conf`, секция [options], приведите параметр к следующему виду:

    XferCommand = exec /usr/bin/pacget %u %o

Примечание: Если в вашем списке зеркал (/etc/pacman.d/*) сервер ftp.archlinux.org указан первым - то могут возникнуть проблемы связанные с тем, что зеркала не успевают синхронизироваться. Поэтому выберите зеркала которые уже синхронизировались, или которые вам больше подходят и переместите их в начало списка зеркал. Таким образом, даже если зеркала еще не успели синхронизироваться, закачка не будет вестись только с ftp.archlinux.org. Для облегчения поиска нужных серверов воспользуйтесь скриптом rankmirrors.

### Использование других приложений

C Pacman можно использовать и другие приложения для загрузки файлов. Вот некоторые приложения и связанные с ними настройки XferCommand:

- `snarf`: `XferCommand = /usr/bin/snarf -N %u`
- `lftp`: `XferCommand = /usr/bin/lftp -c pget %u`
- `axel`: `XferCommand = /usr/bin/axel -n 2 -v -a -o %o %u`

## Выбор самого быстрого зеркала

При загрузке пакетов pacman использует зеркала в том порядке, в котором они записаны в `/etc/pacman.d/mirrorlist`. Однако может оказаться, что в начале списка расположены не самые быстрые зеркала.

Примечание: Написанное выше не касается powerpill-light, поскольку пакеты скачиваются с нескольких зеркал одновременно, соответственно - повышается общая скорость закачки. Таким образом, скорость для каждого отдельного соединения уже не имеет такого значения, а для powerpill-light можно задать минимальную скорость подключения.

## Выбор локального зеркала

Проще всего отредактировать файл mirrorlist, поместив локальное зеркало в начало списка. pacman далее будет использовать это зеркало в качестве предпочитаемого.

Иначе, можно отредактировать pacman.conf, добавив локальное зеркало перед строкой, которая указывает на файл mirrorlist, т.е. там, где написано "add your preferred servers here". Это более безопасно, если все репозитории находятся на одном сервере.

## Использование rankmirrors

Для оценки качества связи и скорости доступа к зеркалам, которые использует pacman, можно воспользоваться rankmirrors.

## Использование Reflector

Для получения пользовательского списка зеркал, отсортированного по скорости загрузки, - воспользуйтесь Reflector.

## После смены зеркал

После смены зеркала необходимо обновить базу данных pacman. Для принудительной синхронизации зеркал, даже если было сообщение об актуальности базы данных, используйте спаренный параметр `y`.

    # pacman -Syy

## Совместный доступ к пакетам по локальной сети

Если вам повезло и в вашей локальной сети имеется несколько компьютеров с Arch, то можно огранизовать совместный доступ с скачанным пакетам и, таким образом, значительно уменьшить время загрузки пакетов. Но имейте в виду, что нужно использовать пакеты соответствующей архитектуры (например только i686 или x86_64) иначе может возникнуть множество проблем.

Для получения дополнительной информации прочтите Pacman tips#Network shared pacman cache.

Categories:

- Package management (Русский)
- Русский

Hidden category:

- Pages with broken package links