В лучшем proxy-сервере Squid (также работающем под Windows) есть хороший механизм ограничения скорости загрузки. Единственная беда — про написано много, но по-английски, а об устройстве — вообще только 2 сообщения от разработчиков в списке рассылки. Поэтому постараюсь рассказать про него, что понял сам.
Итак, основные моменты. Каждый пул определяется двумя параметрами: размером буфера и скоростью его заполнения. Всего существует 3 класса пулов:
- Ограничена общая скорость загрузки.
- Ограничена общая скорость загрузки и скорость загрузки индивидуального хоста (биты 25 -32 IP-адреса).
- Ограничена общая скорость загрузки, скорость загузки подсети (биты 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
Вот вроде и все. Будут вопросы — задавайте.
привет как мне следить за ip 10.0.0.60 в моем домене с помощбю squid и можно ли через sarg распечатать все адреса куда он лазил?
Установить анализатор логов. Можно.
У Вас здесь точно ошибки нет?!
Цитата:
«Если размер буфера больше скорости заполнения, то файлы объемом меньше размера буфера клиент получает на максимальной скорости, а больше — на максимальной.»
«на максимальной» указано два раза подряд!
Конечно, опечатка! Спасибо за наблюдательность, исправлено! 🙂
Спасибо, очень ясно и доходчиво описано.
спасибо,все четко описано. настроил, спасибо
Здравствуйте. Помогите пожалуйста разобраться с ситуацией. Хочу добиться того чтобы правило разделения скорости работало на всех клиентов сети 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 пула скорость падает у всех пользователей, входящих в эту группу.
Заранее благодарен.
Покажите содержимое /usr/local/etc/squid/group_vip и /usr/local/etc/squid/group_elrem. Скорее всего проблема в том, что в обоих файлах прописаны IP из одной подсети, поэтому они попадают под действие обоих пулов.
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. Использовать пул первого класса, если необходимо ограничить поток на всех, например:
#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
delay_class 3 3 тоже пробовал
по превышению скачивания 1 Мб чтобы скорость падала до 10 кбайт/с
delay_parameters 3 100000/100000 -1/-1 10000/1000000
Правило срабатывает, скорость скачивания начинает падать, но абсолютно у всех. Т.е. когда происходит урезание скорости, члены другой группы также ничего не могут делать быстрее 10 кбайт/сек, которые уже заняты качающим….
Очень странно… Попробуйте указать acl явно по IP адресам.
а что делать если сквид был без пулов установлен?
Переустановить с пулами, иначе никак!
пересобрать как то можно ? без переустановки
Как раз и нужно пересобрать с необходимыми ключами. На всякий случай предварительно забэкапить.
а не подскажите как его пересобрать можно и как забекапить? ( или как посмотреть может всетаки есть поддержка пулов?)
Первая ссылка в Гугле по запросу «Пересборка squid»: http://www.opennet.ru/openforum/vsluhforumID12/3600.html
И так Есть сквид, собранный с delay pools и ncsa_auth. Пользователи авторизуются ( их очень много) и ходят по инету. Теперь вопрос как каждому юзеру задать определенную скорость, а как мне известно delay pools работают именно с IP ( выдавать IP отдельным группам нет возможности)
Создайте пул третьего класса, укажите необходимые параметры, и все пользователи будут иметь одинаковый по скорости доступ в Интернет.
Если же каждому пользователю нужно задать уникальные параметры, то придется создавать правило для каждого из них.
P.S. Почитайте описание acl (в конфиге), их параметры не ограничиваются IP источника.
Александр!
во-первых, спасибо за статью.
не могли бы вы просветить, можно ли при помощи delay pools расставить приоритеты для пользователей?
в частности, директор изредка общается по скайпу, и нужно сделать так, чтоб заиканий не было.
екак я понял, разнести всё по классам можно и дать лимиты скорости, но тогда в то время, пока директор не разговаривает по скайпу, скорость у остальных юзеров будет необоснованно урезана.
заранее спасибо за ответ.
К сожалению, динамический шейпинг средствами Squid невозможен.
Здравствуйте Александр! Так как я только начинающий пользователь Squid, прошу прощения за может быть глупый вопрос: всe настройки которые вы написали в статье нужно указывать в одном теге (TAG:delay_pool_uses_indirect_client on) ?
P.S. squid 2.6 stable5
Видимо речь идет о порядке самих правил и параметров. Располагайте в любой секции конфигурационного файла соблюдая указанный порядок. В противном случае могут возникать ошибки, т.к. конфигурационный файл читается сверху вниз и, к примеру, если пулы еще не определены, а уже указаны их скоростные параметры.
Мне нужно на сеть 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
Правильно. Совершенно неважно в каком месте конфигурационного файла вы определите пулы, на работе это никак не скажется. Более того, TAG: — это всего лишь закомментированное описание параметра и не более того.
Проверьте, собран ли ваш squid с поддержкой delay pools.
Если вам не сложно подскажите пожалуйста как это сделать ?
Первые три ссылки по запросу в Гугле:
http://it.toolbox.com/wiki/index.php/Install_Squid_with_delay_pools
http://www.visolve.com/squid/Squid_tutorial.php
http://wiki.squid-cache.org/Features/DelayPools
Большое спасибо Александр , за помощь, беседу и за статью!
Всё достаточно чётко и понятливо написано! Спасибо !
Пожалуйста 🙂
добрый день Александр! такой вопрос: во вех ли squidах скорость(т.е. объём буфера и скорость его заполнения) выставляется в Мегабайтах?
Скорость указывается в
битах (не байтах)байтах в секунду.Скорость в delay_parameters указывается в байтах в секунду. И Александр немного опечатался, когда ответил, что в битах 🙂
Совершенно верно, спасибо!
Добрый день! Столкнулся с такой проблемой. Есть сквид который нормально шейпит веб-траффик. Но при скачке какого-то большого файла, клиент выходит на скорость всей ширины канала. Я так понимаю, что сквид сначала закачивает файл в буфер, а потом отдает клиенту. Так ли это ? Можно ли как-то это отрегулировать?
Здравствуйте!
Размер буфера и скорость его заполнения определяются в параметрах пулов. При этом размер скачиваемого файла значения не имеет. Проверьте свою конфигурацию.
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
da zabyl napisat’, delo vtom chto u nas stoit DHCP server, chto zatrudnyaet sozdat’ acl po IP adresam
Если установлен 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.
#
Добрый день. Отличная статья…Все достаточно хорошо описано.
Но меня интересует следующее, подскажите, пожалуйста, можно ли нарезать трафик средствами delay-pools так чтобы, например человек мог занимать весь канал пока сидит в Интернете один, если двое сидят, то канал режется на двоих и т.д. Одним словом чтобы канал мог резаться для всех равномерно????
А то есть умные товарищи, которые начинают качать фильмы и забивают весь канал. Конечно же, такое можно сделать средствами IPFW, но мне бы хотелось, чтобы все работало через squid
Нет, средствами squid такую задачу реализовать не получится.
Здравствуйте,Александр!
вот мои настройки 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 тут не причем?
За ранее спасибо!
Почти наверняка Squid здесь совершенно не причем, т.к. пинги через него не идут. Проблема скорее всего где-то по пути, в свитчах.
статья полезная, спасибо…
вопрос таков, есть сипсок с внешними сетями… провайдер предоставляет интернет, который безограничения по городу и ограничен во внешке… интернет у меня раздаёт squid
как сделать так, чтобы внешний интернет был ограничен пулом 1 класса, 512Кб/сек, в городской — без ограничений…
Например, так:
acl my_lan src 192.168.0.0/24
acl konturextern dstdomain .kontur-extern.ru
delay_pools 1
delay_class 1 1
delay_access 1 deny konturextern
delay_access 1 allow my_lan
delay_access 1 deny all
delay_parameters 1 256000/256000 # 2048k
Спасибо, я сделал примерно также, но указав файл с сетями
acl tomsknets dst «/etc/squid/tomsk»
и ещё замечание… если файл со списком сетей не очень малый, то чтобы все данные попадали в acl нужно увеличить параметр ipcache_size
Коллега, приветствую!
Есть некоторое количество вопросов. Буду благодарен за комментарии:
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К), то пользователь будет ограничен в скорости?
Заранее спасибо!
Чуть выше написано:
Сквид оперирует объектами, т.е. ограничения действуют на каждую страницу, картинку и т.д. Более того, общий поток клиента, как и сайт размером 300к — понятия довольно-таки условные. Посмотрите в access.log и все станет ясно.
Ога, ясно. Спасибо за ответ.
Эпопея понимания delay_pools продолжается 🙂
Данную форазу
я бы назвал несколько некорректной, т.к. объем буфера измеряется в байтах, а скорость в байтах/сек. Эти два понятия не могут быть равны 🙂
Мне кажется, что на самом деле, скорость опустошения буфера клиентом равна скорости сетевого обмена клиента и сервера…
как-то так…
К вышесказанному:
вот так корректней:
Равна [размер буфера] в секунду, так понятней?
Недавно установил SQUID 3.1.19 на новый сервер. Заметил проблему с delay_pools.
Задаю скорость 1 Мбит (128 кбайт/сек.) получаю приблизительно 0,5 Мбит, Задаю 1,5 Мбит получаю 0,75 Мбит.
Настройки перенес со старого сервера (там SQUID 2) один к одному. Проверяю на старом, там всё ок. (т.е. задаю 1 Мбит получаю почти 1 Мбит.) Странно как-то, формат правил, вроде, не изминился …
Вот такой вопрос, нужно резать скорость по определенным 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
…..
Если всем хостам нужна одинаковая скорость — применяйте пул второго второго класса: ограничивайте общую скорость (сумма скоростей всех хостов) и скорость каждого хоста в отдельности. В противном случае — несколько первых, по одному на каждый хост.
Понял, спасибо, а конструкция вида
delay_parameters 1 -1/-1 96000/96000
Имеет право на жизнь? Они все равно весь канал не забьют.
Я не проверял, попробуйте
Добрый день! Такой вопрос, а нужно ли указать этих пользователей (Вася, Маша…) в пункте http_access allow?
Конечно нужно! Потому что параметр delay_access определяет только ограничения по скорости к разрешенному трафику.
Здравствуйте админ! Спасибо заранее за ответ, такой вопрос, можно ли в сквиде в пункте acl users (к примеру) src сразу добавить несколько ip-адресов, не указывая краткую форму?
В смысле в один acl прописать несколько ip? Можно.
Я тут задаю delay-pools и у меня вылетает инет на совсем может у меня не активен delay-pools? (сквид 3.1.19) в убунту?
сквид может быть собран без поддержки delay-pool
Я тут при помощи delay-pools хотел ограничить скорость некоторым «дискокачальщикам». В инете погуглил, везде указывают на делай-пулс, если есть возможность без делай-пулса скажите тогда. Спасибо огромное
Без них — никак
Я просто сделал apt-get install squid и все. Он сам установился, а то что он установился без поддержки делай-пула, беспонятий!!! А как можно посмотреть установился ли делай?
Телепаты в отпуске, обращайтесь к ближайшему гуру.
Aleksandr dobriy den! Spasibo za sowety ya nastroil squid. Tolko po4emu-to inet razdayotsya cherez chur medlenno. Mojet li eto byt ot iptables?
Сложно сказать однозначно — возможно неправильно настроили пулы.
Ya pooly otmenil, wse ravno tormozit konkretno. T.e. ya zanovo ustanovil ubuntu, zadal v squid`e:
acl Vasya src 10.9.1.1/32,
http_access allow Vasya
http_access deny all
http_port 10.9.1.2:1234
V chem zagwozka tut podskajite Aleksandr
Надо смотреть загрузку процессора и детально разбираться, удаленно по предположениям гадать бесполезно
Добрый день. Подскажыте если есть время. Стоит задача : установить скорость скачивания для файлов больше 5 мБ. в 30 кбт , для тех что меньше в 250 кбт. Какие параметры пула для етого использувать?
Идеология delay pools не предусматривает какой-либо градации по размерам файлов. Более того, определить размер файла можно только после его получения (в content-length можно отдавать все, что угодно), т.е. уже теряется всякий смысл зажимания скорости: файл скачался на полной скорости, а клиенту отдается медленнее.
Каков тогда вариант ришения моей проблемы. Резать скорость для всех файлов? Я пробывал так
delay_parameters 2 200100/200100 15100/5300100
, не помогло . Нужно отбить желание качать фильмы в архивах, но савсем запретить скачку архивов нельзя.Вариант решения проблемы — ставить большой размер буфера и маленькую скорость его заполнения. Объекты, чей размер меньше размера буфера, будут закачиваться с максимальной скоростью ([размер буфера] в секунду), а объекты большего размера будут получать первую часть (равную размеру буфера) с максимальной скоростью, а остальное — со скоростью заполнения буфера.
Внимательно посмотрите на свою конфигурацию. Если что-то непонятно, включите cachemgr.cgi и смотрите в нем заполнение пулов в различных ситуациях. Рекомендую сначала отладить на себе, чтобы не мешал лишний трафик.
Спасибо. Буду пробовать
У меня в сквиде нет опции delay_parameters, не указан размер буфера, т.е. насколько я понимаю буфер ограничен свободным объёмом диска, но к сожалению файлы которые небольшие скажем до 1 мгб скачиваются нормально, а при загрузке файлов больше 10 мегов скорость падает до 2-3 кб/сек, что может быть?
Что значит нет? Собран без поддержки или просто в конфиге не указано?
в конфиге не вижу . т.е по умолчанию насколько я понимаю лимита нет
Так а в чем проблема настроить?
Я не понимаю что происходит, почему падает скорость закачки файлов. В этом и есть проблема так как я не знаю с какой стороны подойти 🙂
т.е в конфиге ограничений нет, а скорости тоже нет
К обсуждаемому функционалу это точно не имеет отношения. Гадать о причине бесполезно, надо разбираться. Может с диском, где кеш лежит, беда.
Доброго времени суток. Пытаюсь распилить канал на 2 (маленький и большой). Проблема собственно в следующем: не один из новых acl не срабатывает (не режется скорость), но если указать delay_access x allow all то скорость режется (естественно у всех). В линухе новичок. Есть подозрение что где то чего то не дописал в конфиге. Если нужно предоставлю содержимое squid.conf
Новичок в линухе или нет — не важно. Подробнейшая инструкция есть, осталось принцип настройки и всё сделать. Дерзайте.