Описание настройки Squid delay pools

В лучшем proxy-сервере Squid (также работающем под Windows) есть хороший механизм ограничения скорости загрузки. Единственная беда — про написано много, но по-английски, а об устройстве — вообще только 2 сообщения от разработчиков в списке рассылки. Поэтому постараюсь рассказать про него, что понял сам.

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

  1. Ограничена общая скорость загрузки.
  2. Ограничена общая скорость загрузки и скорость загрузки индивидуального хоста (биты 25 -32 IP-адреса).
  3. Ограничена общая скорость загрузки, скорость загузки подсети (биты 17-24 IP-адреса) и скорость загрузки индивидуального хоста (биты 25 -32 IP-адреса).

Важно пояснить, что для пулов второго и третьего класса каждое соединение проходит через все ограничения: общее -> подсеть (только для третьего класса) -> хост. Для более наглядного представления IP-адресов в двоичной форме скачайте себе LanCalculator.

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

  • Если объем запрашиваемых данных меньше или равен размеру буфера, то клиент получает их с максимальной скоростью (максимальная скорость равна размеру буфера).
  • Если объем запрашиваемых данных больше размера буфера, то первую часть (размер буфера) клиент получит с максимальной скоростью, а остаток — с минимальной (скоростью заполнения буфера).

Что мы имеем в результате.

  • Если размер буфера и его скорость заполнения равны, то клиент всегда качает с максимальной скоростью.
  • Если размер буфера больше скорости заполнения, то файлы объемом меньше размера буфера клиент получает на максимальной скорости, а больше — на минимальной.
  • Если скорость заполнения буфера больше размера буфера, то клиент всегда получает данные на максимальной скорости (объем буфера), но Squid не подкачивает данные, пока клиент полностью не опустошит буфер.

Перейдем к конфигурированию. Поиск необходимого пула будет происходить только до первого совпадения, поэтому при объявлении пулов необходимо соблюдать нужный порядок.

Сначала объявляем ACL (списки доступа), по которым мы будем определять принадлежность клиентов к определенному пулу.

acl vasya src 192.168.1.10/32
acl kolya src 192.168.1.11/32
acl petya src 192.168.1.12/32
acl masha src 192.168.1.13/32
acl director src 192.168.1.14/32
acl office1 src 192.168.2.0/24
acl office2 src 192.168.3.0/24
acl office3 src 192.168.4.0/24

Объявляем сами пулы.

delay_pools 3 # Всего будет 3 пула
delay_class 1 1 # 1й пул первого класса
delay_class 2 1 # 2й пул первого класса
delay_class 3 3 # 3й пул третьего класса

Определяем принадлежность юзеров к пулу. Принадлежность нужно определять по одному ACL на строку. Если написать в одну строку несколько ACL, то в пул попадет только первый, а остальные — нет. По крайней мере на Squid 2.5.STABLE10 работает именно так.

delay_access 1 allow vasya
delay_access 1 allow kolya
delay_access 1 allow petya
delay_access 1 allow masha
delay_access 1 deny all
delay_access 2 allow director
delay_access 2 deny all
delay_access 3 allow office1
delay_access 3 allow office2
delay_access 3 allow office3
delay_access 3 deny all

Задаем ограничения по скорости.

delay_parameters 1 16000/16000 # 128K на всех
delay_parameters 2 32000/32000 # 256K на всех
delay_parameters 3 32000/32000 16000/16000 -1/-1 #256K на всех, каждой подсети 128K

Вот вроде и все. Будут вопросы — задавайте.

Описание настройки Squid delay pools: 84 комментария

  1. админ

    У Вас здесь точно ошибки нет?!

    Цитата:
    «Если размер буфера больше скорости заполнения, то файлы объемом меньше размера буфера клиент получает на максимальной скорости, а больше — на максимальной.»

    «на максимальной» указано два раза подряд!

  2. Taurus

    Здравствуйте. Помогите пожалуйста разобраться с ситуацией. Хочу добиться того чтобы правило разделения скорости работало на всех клиентов сети 192.168.0.0/24.

    acl vip src «/usr/local/etc/squid/group_vip» (в файлах прописаны конкретные IP)
    acl elrem src «/usr/local/etc/squid/group_elrem»
    acl media urlpath_regex -i \.mp3$ \.asf$ \.wma$ \.avi$ \.mpg$

    #1 media
    # set skorost’ 5000 po dostgeniyu objoma 30000
    delay_class 1 1
    delay_parameters 1 5000/30000
    delay_access 1 allow media
    delay_access 1 deny all

    #2 VIP
    # otdaem ves’ kanal na maksimal’noi skorosti
    delay_class 2 2
    delay_parameters 2 120000/120000 -1/-1
    delay_access 2 allow vip
    delay_access 2 deny all

    #3 users_elrem
    #otdaem kanal na skorosti 100 kilobait/sek
    #i ogranichivaem po ob’emu 1 Mbait,po prevysheniyu ogranichivaem do 10 kilobait/sek
    delay_class 3 2
    delay_parameters 3 100000/100000 10000/1000000
    delay_access 3 allow elrem
    delay_access 3 deny all

    Проблема заключается в том, что при заполнении 3 пула скорость падает у всех пользователей, входящих в эту группу.
    Заранее благодарен.

      1. Taurus

        group_elrem
        192.168.0.64/255.255.255.255
        192.168.0.101/255.255.255.255
        192.168.0.102/255.255.255.255
        192.168.0.103/255.255.255.255
        192.168.0.115/255.255.255.255 и т.д.
        group_VIP
        192.168.0.120/255.255.255.255
        192.168.0.130/255.255.255.255
        192.168.0.141/255.255.255.255
        Так и есть IP в одной подсети. Задача разделить скорость внутри одной подсети.
        Также пробовал на одном IP, отделив его в другой ACL. Та же ситуация.

        1. Александр Кузьмин Автор записи

          Вариантов два:
          1. Использовать пул первого класса, если необходимо ограничить поток на всех, например:
          #2 VIP
          delay_class 1 1
          delay_parameters 2 128000/128000
          delay_access 2 allow vip
          delay_access 2 deny all
          2. Использовать пул третьего класса, если необходимо помимо ограничения потока на всех, дополнительно ограничить поток на каждого пользователя, например:
          #3 users
          delay_class 2 3
          delay_parameters 3 128000/128000 -1/-1 64000/64000
          delay_access 3 allow elrem
          delay_access 3 deny all

          1. Taurus

            delay_class 3 3 тоже пробовал
            по превышению скачивания 1 Мб чтобы скорость падала до 10 кбайт/с
            delay_parameters 3 100000/100000 -1/-1 10000/1000000
            Правило срабатывает, скорость скачивания начинает падать, но абсолютно у всех. Т.е. когда происходит урезание скорости, члены другой группы также ничего не могут делать быстрее 10 кбайт/сек, которые уже заняты качающим….

          1. Edik

            а не подскажите как его пересобрать можно и как забекапить? ( или как посмотреть может всетаки есть поддержка пулов?)

              1. Edik

                И так Есть сквид, собранный с delay pools и ncsa_auth. Пользователи авторизуются ( их очень много) и ходят по инету. Теперь вопрос как каждому юзеру задать определенную скорость, а как мне известно delay pools работают именно с IP ( выдавать IP отдельным группам нет возможности)

                1. Александр Кузьмин Автор записи

                  Создайте пул третьего класса, укажите необходимые параметры, и все пользователи будут иметь одинаковый по скорости доступ в Интернет.
                  Если же каждому пользователю нужно задать уникальные параметры, то придется создавать правило для каждого из них.

                  P.S. Почитайте описание acl (в конфиге), их параметры не ограничиваются IP источника.

  3. олег

    Александр!
    во-первых, спасибо за статью.
    не могли бы вы просветить, можно ли при помощи delay pools расставить приоритеты для пользователей?
    в частности, директор изредка общается по скайпу, и нужно сделать так, чтоб заиканий не было.
    екак я понял, разнести всё по классам можно и дать лимиты скорости, но тогда в то время, пока директор не разговаривает по скайпу, скорость у остальных юзеров будет необоснованно урезана.
    заранее спасибо за ответ.

  4. Сергей

    Здравствуйте Александр! Так как я только начинающий пользователь Squid, прошу прощения за может быть глупый вопрос: всe настройки которые вы написали в статье нужно указывать в одном теге (TAG:delay_pool_uses_indirect_client on) ?

    P.S. squid 2.6 stable5

    1. Александр Кузьмин Автор записи

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

  5. Сергей

    Мне нужно на сеть 10.12.12.0/24 задать скорость 768Кбит/с а на 10.12.13.0/24 512Кбит/с правильно ли я сконфигурировал ?
    И ещё: у меня в squis.conf нет таких директив как:TAG: delay_access, TAG: delay_parameters по этому я всё указал в TAG: delay_pool_uses_indirect_client . on|off
    Это как не будь скажется на работе squidа ?

    TAG: delay_pool_uses_indirect_client on|off
    # Note: This option is only available if Squid is rebuilt with the
    # -DFOLLOW_X_FORWARDED_FOR option
    #
    # Controls whether the indirect client address
    # (see follow_x_forwarded_for) is used instead of the
    # direct client address in delay pools.
    #
    #Default:
    delay_pool_uses_indirect_client on

    acl office_1 src 10.12.12.0/24
    acl office_2 src 10.12.13.0/24

    delay_pools 2
    delay_class 1 1
    delay_class 2 1

    delay_access 1 allow office_1
    delay_access 1 deny all
    delay_access 2 allow office_2
    delay_access 2 deny all

    delay_parameters 1 96000/96000
    delay_parameters 2 64000/64000

    # TAG: log_uses_inuirect_client on|off

    1. Александр Кузьмин Автор записи

      Правильно. Совершенно неважно в каком месте конфигурационного файла вы определите пулы, на работе это никак не скажется. Более того, TAG: — это всего лишь закомментированное описание параметра и не более того.
      Проверьте, собран ли ваш squid с поддержкой delay pools.

  6. Dmitry

    Добрый день! Столкнулся с такой проблемой. Есть сквид который нормально шейпит веб-траффик. Но при скачке какого-то большого файла, клиент выходит на скорость всей ширины канала. Я так понимаю, что сквид сначала закачивает файл в буфер, а потом отдает клиенту. Так ли это ? Можно ли как-то это отрегулировать?

  7. Zhassulan

    Zdravstvuite Alexandr, izvinite za latinicu, kirilicu eshe ne ustanovil 🙂

    u meya vopros takoi:
    u menya squid nastroen tak chtoby dostup poluchali toka te kto v AD, i v opredelennyh gruppah, est’ li vozmozhnost’ nastroit’ delay pools ne cherez IP adresa a cherez gruppy Active Deirectory?

    zaranee blagodaren
    Zhassulan

    1. Александр Кузьмин Автор записи

      Если установлен DHCP, то можно создать резервирование для определенных MAC-адресов.
      Сделать acl по группам не получится, можно только по пользователям:
      # acl aclname proxy_auth username …
      # acl aclname proxy_auth_regex [-i] pattern …
      # # list of valid usernames
      # # use REQUIRED to accept any valid username.
      # #
      # # NOTE: when a Proxy-Authentication header is sent but it is not
      # # needed during ACL checking the username is NOT logged
      # # in access.log.
      # #
      # # NOTE: proxy_auth requires a EXTERNAL authentication program
      # # to check username/password combinations (see
      # # auth_param directive).
      # #
      # # WARNING: proxy_auth can’t be used in a transparent proxy. It
      # # collides with any authentication done by origin servers. It may
      # # seem like it works at first, but it doesn’t.
      #

  8. Антон

    Добрый день. Отличная статья…Все достаточно хорошо описано.
    Но меня интересует следующее, подскажите, пожалуйста, можно ли нарезать трафик средствами delay-pools так чтобы, например человек мог занимать весь канал пока сидит в Интернете один, если двое сидят, то канал режется на двоих и т.д. Одним словом чтобы канал мог резаться для всех равномерно????
    А то есть умные товарищи, которые начинают качать фильмы и забивают весь канал. Конечно же, такое можно сделать средствами IPFW, но мне бы хотелось, чтобы все работало через squid

  9. Graf

    Здравствуйте,Александр!
    вот мои настройки delay_pools:

    acl i_ivanov src 192.168.10.96
    acl s_sidorov src 192.168.10.99
    acl p_petrov src 192.168.2.158
    acl server_av src 192.168.10.243
    acl inet_users src "/usr/local/squid/etc/inet_users"

    delay_pools 1
    delay_class 1 2
    delay_access 1 allow i_ivanov
    delay_access 1 allow s_sidorov
    delay_access 1 allow p_petrov
    delay_access 1 allow server_av
    delay_access 1 allow inet_users
    delay_access 1 deny all
    delay_parameters 1 -1/-1 204800/204800

    Интернет канал:
    Входящая скорость 8 Mбит/сек
    Исходящая скорость 5 Mбит/сек

    Периодически (без какой-либо систематики) пропадает Интернет, в основном у юзверей в списке inet_users, но после пинга (с машины с пропавшим Инетом )до шлюза, Интернет восстанавливается иногда на весь день, а иногда на минут 30-40.
    Основная задача ограничить всем кто указан в acl для delay_pools скорость до 200 К/с, всем остальным без ограничений.
    Или delay_pools тут не причем?
    За ранее спасибо!

  10. Дмитрий

    статья полезная, спасибо…
    вопрос таков, есть сипсок с внешними сетями… провайдер предоставляет интернет, который безограничения по городу и ограничен во внешке… интернет у меня раздаёт squid

    как сделать так, чтобы внешний интернет был ограничен пулом 1 класса, 512Кб/сек, в городской — без ограничений…

      1. Дмитрий

        Спасибо, я сделал примерно также, но указав файл с сетями
        acl tomsknets dst «/etc/squid/tomsk»
        и ещё замечание… если файл со списком сетей не очень малый, то чтобы все данные попадали в acl нужно увеличить параметр ipcache_size

  11. Mc.Sim

    Коллега, приветствую!
    Есть некоторое количество вопросов. Буду благодарен за комментарии:
    1. Немного непонятна фраза:
    > Если размер буфера и его скорость заполнения равны, то клиент всегда качает с максимальной скоростью.
    Что тут понимается под «максимальной скоростью»?
    Максимальная скорость заполнения буфера?
    Максимальная скорость канала?
    или что-то другое?
    2. Чем оперирует сквид при ограничении скорости? Загружаемыми объектами или же общим потоком от клиента? Например, имеются правила:
    delay_pools 1 # Всего будет 1 пул
    delay_class 1 1 # 1й пул первого класса
    delay_access 1 allow vasya
    delay_access 1 deny all
    delay_parameters 1 16000/32000 # 128K на всех после 256К заполнения

    В данном примере, если пользователь из acl vasya будет загружать сайт размером 300K (то есть более заданного максимального размера 256К), который состоит из множества мелких объектов (html, js, jpg…) (объекты гораздо менее максимального 256К), то пользователь будет ограничен в скорости?
    Заранее спасибо!

    1. Александр Кузьмин Автор записи

      Чуть выше написано:

      (максимальная скорость равна размеру буфера)

      Сквид оперирует объектами, т.е. ограничения действуют на каждую страницу, картинку и т.д. Более того, общий поток клиента, как и сайт размером 300к — понятия довольно-таки условные. Посмотрите в access.log и все станет ясно.

      1. Mc.Sim

        Эпопея понимания delay_pools продолжается 🙂
        Данную форазу

        Если объем запрашиваемых данных меньше или равен размеру буфера, то клиент получает их с максимальной скоростью (максимальная скорость равна размеру буфера).

        я бы назвал несколько некорректной, т.к. объем буфера измеряется в байтах, а скорость в байтах/сек. Эти два понятия не могут быть равны 🙂
        Мне кажется, что на самом деле, скорость опустошения буфера клиентом равна скорости сетевого обмена клиента и сервера…
        как-то так…

        1. Mc.Sim

          К вышесказанному:

          равна скорости сетевого обмена клиента и сервера…

          вот так корректней:

          равна скорости сетевого обмена клиента и прокси-сервера squid

  12. Oleg

    Недавно установил SQUID 3.1.19 на новый сервер. Заметил проблему с delay_pools.
    Задаю скорость 1 Мбит (128 кбайт/сек.) получаю приблизительно 0,5 Мбит, Задаю 1,5 Мбит получаю 0,75 Мбит.
    Настройки перенес со старого сервера (там SQUID 2) один к одному. Проверяю на старом, там всё ок. (т.е. задаю 1 Мбит получаю почти 1 Мбит.) Странно как-то, формат правил, вроде, не изминился …

  13. Shadow

    Вот такой вопрос, нужно резать скорость по определенным ip адресам описанных в acl, т.е. каждома ip скорость например 768к Правуильно ли я это дело описал выбрав пул первого класса, или промахнулся с классом пула

    delay_class 1 1
    delay_access 1 allow tp_768
    delay_access 1 deny all
    delay_parameters 1 96000/96000

    сам acl имеет вид
    192.168.0.10
    192.168.0.15
    192.168.0.30
    …..

    1. Александр Кузьмин Автор записи

      Если всем хостам нужна одинаковая скорость — применяйте пул второго второго класса: ограничивайте общую скорость (сумма скоростей всех хостов) и скорость каждого хоста в отдельности. В противном случае — несколько первых, по одному на каждый хост.

      1. Руслан

        Здравствуйте админ! Спасибо заранее за ответ, такой вопрос, можно ли в сквиде в пункте acl users (к примеру) src сразу добавить несколько ip-адресов, не указывая краткую форму?

  14. Руслан

    Я тут при помощи delay-pools хотел ограничить скорость некоторым «дискокачальщикам». В инете погуглил, везде указывают на делай-пулс, если есть возможность без делай-пулса скажите тогда. Спасибо огромное

  15. Руслан

    Я просто сделал apt-get install squid и все. Он сам установился, а то что он установился без поддержки делай-пула, беспонятий!!! А как можно посмотреть установился ли делай?

  16. Sasha

    Добрый день. Подскажыте если есть время. Стоит задача : установить скорость скачивания для файлов больше 5 мБ. в 30 кбт , для тех что меньше в 250 кбт. Какие параметры пула для етого использувать?

    1. Александр Кузьмин Автор записи

      Идеология delay pools не предусматривает какой-либо градации по размерам файлов. Более того, определить размер файла можно только после его получения (в content-length можно отдавать все, что угодно), т.е. уже теряется всякий смысл зажимания скорости: файл скачался на полной скорости, а клиенту отдается медленнее.

      1. Sasha

        Каков тогда вариант ришения моей проблемы. Резать скорость для всех файлов? Я пробывал так delay_parameters 2 200100/200100 15100/5300100, не помогло . Нужно отбить желание качать фильмы в архивах, но савсем запретить скачку архивов нельзя.

        1. Александр Кузьмин Автор записи

          Вариант решения проблемы — ставить большой размер буфера и маленькую скорость его заполнения. Объекты, чей размер меньше размера буфера, будут закачиваться с максимальной скоростью ([размер буфера] в секунду), а объекты большего размера будут получать первую часть (равную размеру буфера) с максимальной скоростью, а остальное — со скоростью заполнения буфера.
          Внимательно посмотрите на свою конфигурацию. Если что-то непонятно, включите cachemgr.cgi и смотрите в нем заполнение пулов в различных ситуациях. Рекомендую сначала отладить на себе, чтобы не мешал лишний трафик.

          1. Alex_Wolf

            У меня в сквиде нет опции delay_parameters, не указан размер буфера, т.е. насколько я понимаю буфер ограничен свободным объёмом диска, но к сожалению файлы которые небольшие скажем до 1 мгб скачиваются нормально, а при загрузке файлов больше 10 мегов скорость падает до 2-3 кб/сек, что может быть?

                  1. Alex_Wolf

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

  17. Roman

    Доброго времени суток. Пытаюсь распилить канал на 2 (маленький и большой). Проблема собственно в следующем: не один из новых acl не срабатывает (не режется скорость), но если указать delay_access x allow all то скорость режется (естественно у всех). В линухе новичок. Есть подозрение что где то чего то не дописал в конфиге. Если нужно предоставлю содержимое squid.conf

Добавить комментарий