Сжатие потока данных linux

Сжатие TCP/IP-соединений при помощи ssh

Sebastian Schreiber

Перевод: Павел Гашев, SWSoft Pte Ltd.

1. Введение

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

1) Уменьшаем размер передаваемых данных (это важно, если мы платим за трафик, или если сеть перегружена).

2) Ускоряем передачу по медленным каналам (Модем, GSM, ISDN).

Это HOWTO рассказывает, как достигнуть этих целей, используя такие утилиты, как SSH1, SSH2, OpenSSH или LSH.

2. Сжатие HTTP/FTP.

Мой офис подключен к Интернет через ISDN на скорости 64Кбит, так что максимальная скорость передачи является около 7Кб/сек. Можно повысить скорость соединения, путем сжатия передаваемой информации: теперь, когда я скачиваю файлы, Netscape показывает скорость до 40Кб/сек (файлы журналов сжимаются в 15 раз). SSH — это утилита, предназначенная для обеспечения безопасного соединения через небезопасные сети, при помощи шифрования данных. Но, кроме того, SSH способна сжимать информацию и осуществлять переадресацию портов (аналогично rinetd или redir). Так что она вполне подходит для сжатия простых TCP/IP соединений. «Простых» \- значит, что открывается только одно TCP-соединение. FTP-соединения или соединения между M$-Outlook и MS-Exchange не являются «простыми», т.к. открывается несколько соединений одновременно. SSH использует алгоритм сжатия LempleZiv (LZ77), обеспечивая такую же компрессию, как и в winzip/pkzip. Для того, чтобы сжимать все HTTP-соединения с Интернет, мне необходимо запустить одну команду на своей машине:

:80 -f sleep 10000

hostname > = машина моего провайдера, обеспечивающая доступ через SSH.

login ID > = мое имя входа на hostname >

= веб-прокси-сервер моего провайдера

Обозреватель настроен на работу через прокси-сервер localhost:8080 . Портативный компьютер настроен на этот же порт моей машины. Соединения сжимаются и переназначаются реальному прокси-серверу сервером SSH. Инфраструктура выглядит примерно так:

3. Сжатие электронной почты

3.1. Входящая почта (POP3, IMAP4)

Большинство людей принимают электронную почту с почтового сервера при помощи POP3. POP3 — это протокол со многими недостатками.

POP3 передает пароль, как обычный текст. (Хотя есть различные реализации SSL для POP/IMAP и аутентификация типа запрос/ответ, описанные в RFC-2095/2195).

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

POP3 передает почту без сжатия, хотя она очень хорошо компрессируется (в 3.5 раза).

Возможно осуществить сжатие POP3, перенаправляя соединения с адреса localhost:110 через сжатое соединение к вашему провайдеру на порт POP3. Для этого необходимо в почтовой программе установить сервер входящей почты в localhost:110. Это безопасное и быстрое соединение, но оно все еще зависит от недостатков протокола POP3.

Читайте также:  Дистрибутивы операционных систем linux

Имеет смысл заменить POP3 на более эффективный протокол. Идея заключается в том, чтобы перекачивать все содержимое почтового ящика, хранящегося на почтовом сервере, без какого-то ни было почтового протокола. SCP — хорошая утилита для выполнения этого. Вы можете скачать ваш почтовый ящик примерно так:

scp -C -l имя:/var/spool/mail/loginid /tmp/newmail

Но есть проблема: что произойдет, если во время передачи на сервер придет новая почта? Новая почта будет потеряна. Таким образом, лучше всего использовать следующие команды:

ssh -l имя почтовый_сервер -f mv /var/spool/mail/имя /tmp/имя_fetchme

scp -C -l имя:/tmp/my_;new_;mail /tmp/имя_fetchme

mv — это простая операция, мгновенно переносящая файл в другое место, так что у вас не будет проблем, если придет новая почта. Но если каталоги /tmp/ и /var/spool/mail находятся на разных дисках/разделах, у вас все-таки могут возникнуть некоторые трудности. Решение — это создать файл блокировки на сервере перед тем, как перекачивать почту: touch /var/spool/mail/имя.lock . Вы должны убрать его после того, как закончите перекачку. А еще лучше, переименовать почтовый ящик внутри этого же каталога:

ssh -l имя почтовый_сервер -f mv /var/spool/mail/имя /var/spool/mail/имя_fetchme

Затем обработайте полученный почтовый ящик /tmp/newmail, при помощи команд formail и procmail: formail -s procmail

3.2. Исходящая почта (SMTP)

Передача электронной почты через сжатое и шифрованное SSH-соединение обеспечивает:

Уменьшение трафика сети

Безопасность (впрочем, это не имеет смысла, если далее почта идет по незащищенным сетям)

Аутентификация посылающего. Большинство почтовых серверов не принимают почту с других машин, предназначенную для внешней доставки (relay). Если вы посылаете почту через SSH-соединение, почтовый сервер (sendmail или MS-exchange) думает, что она посылается с локальной программы.

Если на почтовом сервере установлен доступ SSH, используйте следующую команду:

ssh -C -l имя почтовый_сервер -L2525:почтовый_сервер:25

Если у вас нет SSH-доступа к почтовому серверу, но есть сервер с SSH, которому разрешена связь с другими машинами, вы можете использовать его:

ssh -C -l имя другой_сервер -L2525:почтовый_сервер:25

После этого вы можете настроить свою почтовую программу (или почтовый сервер: см. «smarthost») так, чтобы она посылала исходящую почту через localhost:2525.

4. Быстродействие.

Конечно же, сжатие/шифрование занимает процессорное время. Например старый Пентиум-133 может сжимать и шифровать около 1Гб в час, а это достаточно много. Чтобы увеличить скорость, вы можете скомпилировать SSH с опцией «-with-none», и он не будет шифровать информацию. Следующая таблица дает сравнение между различными методами загрузки (файл 6МБ передавался с Pentium-133 на Pentium-233 через сеть 10Мбит).

5. Благодарности

Выражаю благодарность Harald Koenig , который дал идею использования rcp при перекачке почтового ящика. Последняя версия этого документа находится на http://www.syss.de/howto.

6. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

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

Читайте также:  Системная флешка usb windows

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу

Источник

Сжатие потока данных linux

Команда compress предназначена для сжатия данных без потерь с помощью соответствующей утилиты, использующей алгоритм Лемпела-Зива. Целью использования данной утилиты является экономия дискового пространства. Используемый утилитой алгоритм долгое время подпадал под действие патента, поэтому она не снискала особой популярности. Тем не менее, в данный момент она может беспрепятственно использоваться, ведь срок действия патента истек. В то же время, она не позволяет достичь такой степени сжатия данных, как утилиты bzip2 и xz, посему может использоваться лишь как аналог популярных утилит gzip и zip.

Базовый синтаксис команды выглядит следующим образом:

Чаще всего compress используется вообще без каких-либо параметров, причем в качестве аргументов может передаваться неограниченное количество имен файлов, которые следует сжать. По умолчанию оригинальные версии файлов заменяются на их сжатые версии (с расширением .Z) с соответствующими метаданными (то есть, меткой времени модификации, правами доступа, именами владельца и группы владельцев и так далее). Если вас не устраивает такое положение дел, вы можете воспользоваться параметром для сохранения оригинальных версий файлов (в этом случае утилита будет выводить сжатые данные посредством стандартного потока вывода, поэтому вам придется воспользоваться перенаправлением потока данных таким образом, как показано ниже). Параметр -f позволяет принудительно перезаписать существующий файл архива. Параметр -v позволяет выводить информацию о степени сжатия файла. Наконец, параметр -r позволяет осуществить рекурсивное сжатие файлов.

Если же вам нужно создать архив с несколькими файлами внутри, одной утилиты compress будет явно мало. Для этой цели также понадобится утилита tar, с помощью которой можно создать архив с файлами, после чего сжать этот архив с помощью утилиты compress. Например, вы можете использовать следующую последовательность команд для создания архива с именем archive.tar.Z:

$ tar -cf archive.tar
$ compress archive.tar

Параметры -c и -f утилиты tar предназначены для указания на необходимость добавления всех файлов в один архив (-c) и чтения имени файла архива из следующего аргумента (-f).

Альтернативным вариантом является замена последней команды на параметр -Z утилиты tar, позволяющий автоматически сжать полученный архив с помощью compress:

$ tar -cfZ archive.tar.Z

Установка утилиты

В первую очередь вам придется установить рассматриваемую утилиту; проще всего это сделать с помощью терминала путем исполнения соответствующей вашему дистрибутиву команды. Подробнее об установке программного обеспечения рассказано в данном разделе.

Команда для Linux Mint и Ubuntu:

$ sudo apt-get install ncompress

Команда для Fedora Workstation:

$ sudo dnf install ncompress

Примеры использования

1. Сжатие одного файла

В результате оригинальный файл text.txt будет заменен на свою сжатую версию text.txt.Z.

2. Одновременное сжатие нескольких файлов

$ compress text1.txt text2.txt text3.txt

В этом случае также все оригинальные версии файлов (text1.txt, text2.txt, text3.txt) будут заменены на сжатые версии (text1.txt.Z, text2.txt.Z, text3.txt.Z). Добавление нескольких файлов в единый файл архива будет рассмотрено ниже.

Читайте также:  Language pack windows 10 64 bit

3. Сжатие одного файла с сохранением оригинала

$ compress -c text.txt > text.txt.Z

Теперь оригинальный файл text.txt будет оставлен в директории вместе со сжатой версией text.txt.Z.

4. Восстановление оригинальной версии файла из сжатой версии

$ compress -d text.txt.Z

В результате сжатая версия файла text.txt.Z будет заменена на его оригинальную версию text.txt.

5. Создание сжатого архива со всеми файлами из директории

$ tar -cfZ etc.tar.Z /etc/

В результате будет создан архив etc.tar.Z с файлами из директории /etc/.

6. Рекурсивное сжатие файлов из директории

$ compress -rv nolf228

В результате в заданной директории все подвергающиеся сжатию файлы будут заменены на их сжатые версии.

Источник

Почти линейное увеличение производительности bzip2 на многопроцессорных системах

В Linux часто используется сжатие с помощью gzip и bzip2. Они оба обеспечивают хорошую плотность сжатия, и удобны в использовании. При этом bzip2 сжимает большинство файлов эффективнее — но, с другой стороны, работает медленнее, чем более традиционные gzip или zip.

Но можно получить эффективность bzip2, при этом существенно увеличив скорость. Речь идёт об утилите pbzip2 — Parallel BZIP2. В обычном случае при использовании bzip2 задействуется только одно процессорное ядро, в то время как на современных системах их может быть 2, 4, или, например, 8.

Pbzip2 может использовать сразу несколько процессорных ядер, что приводит, по заявлению авторов, к почти линейному увеличению производительности. Сжатые файлы, которые создаёт pbzip2, полностью совместимы с bzip2 1.0.2 и более новыми версиями bzip2 (также есть утилита pigz, которая, в свою очередь, является многопоточной реализацией gzip — спасибо altexxx).

Ниже результат тестирования скорости сжатия участка SQL-файла размером 1000M (dd if=dump.sql of=testfile bs=1M count=1000) на компьютере с двумя процессорами Intel Xeon E5520 (4 ядра, 8 потоков, тактовая частота 2,26 ГГц):

Как видно из результатов тестирования, pbzip2, работающий в 4 потока, приблизительно в 3,6 раз быстрее, чем bzip2, работающий в один поток — что действительно является почти линейным увеличением производительности.

При этом pbzip2, работающий в 16 потоков, оказался медленнее, чем pbzip2, использующий 4 потока — вероятно, из-за скорости выполнения операций ввода/вывода. Также смотрите дополнительные тесты в комментариях (спасибо tristan и bliznezz) — в том числе, с использованием tmpfs-раздела в оперативной памяти.

Используется pbzip2 примерно так же, как и просто bzip2, но есть некоторые дополнительные функции, например вывод прогресса выполнения операции в процентах.

Чтобы сжать файл:
pbzip2 -k -p4 filename

Где filename — имя файла. По умолчанию сжатый файл называется так же, как исходник, но в конце добавляется .bz2 (то есть в данном случае filename.bz2).

Опция -k нужна для того, чтобы pbzip2 не удалял исходник после того, как закончит сжатие. Можно также добавить опцию -v, для того, чтобы выводилась подробная информация, в том числе прогресс выполнения операции в процентах.

Опция -p устанавливает количество потоков (в данном случае 4).

Чтобы распаковать файл:
pbzip2 -dk -p4 filename.bz2

Где filename.bz2 — имя файла. По умолчанию распакованный файл называется так же, как сжатый, но в конце убирается .bz2 (то есть в данном случае filename).

Опция -d нужна для того, чтобы произвести декомпрессию (decompress).

Источник

Оцените статью