Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> программы —> SQUID-MultiCpuSystem

SQUID - с поддержкой мультироцессорности


После внезапного решения обновить сквида с версии 2.5. на версию 3.1, что-то всё упало, пришлось вернуться на 2.7. кеш был 60Гб - подцепленный через nfs. Соответственно индексация кеша, после смены версии, ничего интересного не предвещала. И как обычно бывает, что клиентские ПК обновляются чаще, чем оборудование которое использует сисадмин, в не зависимости от количества написанных служебных записок, требований, сроков которое оборудование отработало. После изъятия у секретаря q8300 решил попробовать использовать многопроцессорность у сквида, т.к. он висит 1-3 процессами в топе, полноценную нагрузку не окажет на данный проц. Найдя в инете записки на сайте squid-cache.org о реализации, просто взял и поставил.

1. ставим сквид из портов.
cd /usr/ports/www/squid31 && make install clean

Выставляем галки на необходимых опциях + в squid 2.7,3.0

[X] SQUID_CARP           Enable CARP support

что- данного в 3.1. не заметил )

2. Разделение стартовых скриптов.

cd /usr/local/etc/rc.d/ && cp squid squid_backend1 &&  cp squid squid_backend2

Далее даем им свои PID и конфиги используемые по умолчанию, в принципе можно было через flag настроить но что-то не захотелось.
/usr/local/etc/rc.d/squid:

cat /usr/local/etc/rc.d/squid | grep -v #
squid_checkrunning() {
        ${command} ${squid_flags} -k check 2>/dev/null
}

squid_setfib() {
        sysctl net.fibs >/dev/null 2>&1 || return 0
        if [ "x${squid_fib}" != "xNONE" ]; then
                command="setfib -F ${squid_fib} ${command}"
        else
                return 0
        fi
}

squid_stop() {
        echo "Stopping ${name}."
        ${command} ${squid_flags} -k shutdown
        run_rc_command poll
}

. /etc/rc.subr

name=squid
rcvar=${name}_enable

command=/usr/local/sbin/squid
extra_commands=reload
reload_cmd="${command} ${squid_flags} -k reconfigure"
start_precmd="squid_setfib"
stop_precmd="squid_checkrunning"
stop_cmd="squid_stop"

load_rc_config ${name}

squid_chdir=${squid_chdir:-"/var/squid"}
squid_conf=${squid_conf:-"/usr/local/etc/squid/frontend.conf"}
squid_enable=${squid_enable:-"NO"}
squid_fib=${squid_fib:-"NONE"}
squid_flags="-f ${squid_conf} ${squid_flags}"
squid_pidfile=${squid_pidfile:-"/var/run/squid/squid.pid"}
squid_user=${squid_user:-squid}

pidfile=${squid_pidfile}
required_dirs=${squid_chdir}


required_files=${squid_conf}

run_rc_command "$1"

/usr/local/etc/rc.d/squid_backend1:

cat /usr/local/etc/rc.d/squid_backend1 | grep -v #

squidb1_checkrunning() {
        ${command} ${squidb1_flags} -k check 2>/dev/null
}

squidb1_setfib() {
        sysctl net.fibs >/dev/null 2>&1 || return 0
        if [ "x${squidb1_fib}" != "xNONE" ]; then
                command="setfib -F ${squidb1_fib} ${command}"
        else
                return 0
        fi
}

squidb1_stop() {
        echo "Stopping ${name}."
        ${command} ${squidb1_flags} -k shutdown
        run_rc_command poll
}

. /etc/rc.subr

name=squidb1
rcvar=${name}_enable

command=/usr/local/sbin/squid
extra_commands=reload
reload_cmd="${command} ${squidb1_flags} -k reconfigure"
start_precmd="squidb1_setfib"
stop_precmd="squidb1_checkrunning"
stop_cmd="squidb1_stop"

load_rc_config ${name}

squidb1_chdir=${squidb1_chdir:-"/var/squid"}
squidb1_conf=${squidb1_conf:-"/usr/local/etc/squid/squidb1.conf"}
squidb1_enable=${squidb1_enable:-"NO"}
squidb1_fib=${squidb1_fib:-"NONE"}
squidb1_flags="-f ${squidb1_conf} ${squidb1_flags}"
squidb1_pidfile=${squidb1_pidfile:-"/var/run/squid/squidb1.pid"}
squidb1_user=${squid_user:-squid}

pidfile=${squidb1_pidfile}
required_dirs=${squidb1_chdir}


required_files=${squidb1_conf}

run_rc_command "$1"

/usr/local/etc/rc.d/squid_backend2

cat /usr/local/etc/rc.d/squid_backend2 | grep -v #

squidb2_checkrunning() {
        ${command} ${squidb2_flags} -k check 2>/dev/null
}

squidb2_setfib() {
        sysctl net.fibs >/dev/null 2>&1 || return 0
        if [ "x${squidb2_fib}" != "xNONE" ]; then
                command="setfib -F ${squidb2_fib} ${command}"
        else
                return 0
        fi
}

squidb2_stop() {
        echo "Stopping ${name}."
        ${command} ${squidb2_flags} -k shutdown
        run_rc_command poll
}

. /etc/rc.subr

name=squidb2
rcvar=${name}_enable

command=/usr/local/sbin/squid
extra_commands=reload
reload_cmd="${command} ${squidb2_flags} -k reconfigure"
start_precmd="squidb2_setfib"
stop_precmd="squidb2_checkrunning"
stop_cmd="squidb2_stop"

load_rc_config ${name}

squidb2_chdir=${squidb2_chdir:-"/var/squid"}
squidb2_conf=${squidb2_conf:-"/usr/local/etc/squid/squidb2.conf"}
squidb2_enable=${squidb2_enable:-"NO"}
squidb2_fib=${squidb2_fib:-"NONE"}
squidb2_flags="-f ${squidb2_conf} ${squidb2_flags}"
squidb2_pidfile=${squidb2_pidfile:-"/var/run/squid/squidb2.pid"}
squidb2_user=${squid_user:-squid}

pidfile=${squidb2_pidfile}
required_dirs=${squidb2_chdir}


required_files=${squidb2_conf}

run_rc_command "$1"

3. создание конфигурационных файлов.
Инклюд в конфигах поддерживается как понял с squid 2.6.
/usr/local/etc/squid/common.acl.conf:
cat /usr/local/etc/squid/common.acl.conf | grep -v #
acl manager proto cache_object
acl localhost src 127.0.0.1/32 
acl to_localhost dst 127.0.0.0/8
acl localnet src 192.168.0.0/24
cachemgr_passwd parolparolpoherkoy all

/usr/local/etc/squid/common.backend.conf:

cat /usr/local/etc/squid/common.backend.conf | grep -v #

cache_mem 4 MB
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320
Shutdown_lifetime 3 second
http_access allow localhost
http_access deny all

/usr/local/etc/squid/frontend.conf:

cat /usr/local/etc/squid/frontend.conf | grep -v #

include /usr/local/etc/lab/common.acl.conf

http_port 192.168.0.169:3128 transparent

cache_peer localhost parent 4001 0 carp login=PASS name=backend-1
cache_peer localhost parent 4002 0 carp login=PASS name=backend-2
cache_mem 512 MB
refresh_pattern ^ftp:		1440	20%	10080
refresh_pattern ^gopher:	1440	0%	1440
refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
refresh_pattern .		0	20%	4320

shutdown_lifetime 3 second
access_log /var/log/squid/frontend.access.log
cache_log /var/log/squid/frontend.cache.log
pid_filename /var/log/squid/frontend.pid

http_access allow manager localhost
http_access deny manager
http_access allow localnet
http_access allow localhost
http_access deny all

/usr/local/etc/squid/squidb1.conf:

cat /usr/local/etc/squid/squidb1.conf | grep -v #

include /usr/local/etc/lab/common.acl.conf

http_port 127.0.0.1:4001
visible_hostname backend-1
unique_hostname backend-1
cache_dir aufs /squidcache/cache-1 20240 64 256
change /var/log/squid to your own log directory
access_log /var/log/squid/backend-1.access.log
cache_log /var/log/squid/backend-1.cache.log
pid_filename /var/log/squid/backend-1.pid
include /usr/local/etc/lab/common.backend.conf

/usr/local/etc/squid/squidb2.conf:

cat /usr/local/etc/squid/squidb2.conf | grep -v #

include /usr/local/etc/lab/common.acl.conf

http_port 127.0.0.1:4002
visible_hostname backend-2
unique_hostname backend-2
cache_dir aufs /squidcache/cache-2 20240 64 256
change /var/log/squid to your own log directory
access_log /var/log/squid/backend-2.access.log
cache_log /var/log/squid/backend-2.cache.log
pid_filename /var/log/squid/backend-2.pid
include /usr/local/etc/lab/common.backend.conf

4. Запуск.
Добавляем в /etc/rc.conf

echo 'squid_enable="YES"' >> /etc/rc.conf
echo 'squidb1_enable="YES" ' >> /etc/rc.conf
echo 'squidb2_enable="YES" ' >> /etc/rc.conf

создаём кеши:

squid -z -f /usr/local/etc/squid/squidb1.conf
squid -z -f /usr/local/etc/squid/squidb2.conf

запускаем:

/usr/local/etc/rc.d/squid/squid start \
&& /usr/local/etc/rc.d/squid/_backend1 start \
&& /usr/local/etc/rc.d/squid/_backend2 start

Смотрим:

top -U squid
  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
18452 squid       1  44    0 30112K  9368K kqread  1   0:21  0.00% squid
18432 squid       1  44    0 30112K  9368K kqread  0   0:21  0.00% squid
18499 squid       1  44    0 30112K  8912K kqread  3   0:14  0.00% squid
18433 squid       1  76    0  7224K  1420K piperd  0   0:00  0.00% unlinkd
18453 squid       1  76    0  7224K  1420K piperd  0   0:00  0.00% unlinkd
18500 squid       1  76    0  7224K  1420K piperd  0   0:00  0.00% unlinkd
18430 squid       1  76    0 21792K  4436K wait    0   0:00  0.00% squid
18450 squid       1  76    0 21792K  4440K wait    1   0:00  0.00% squid
18497 squid       1  76    0 21792K  4460K wait    0   0:00  0.00% squid


sockstat -4 | grep squid
squid    squid      18499 7  udp4 6 *:16265               *:*
squid    squid      18499 8  udp4   *:42361               *:*
squid    squid      18499 15 tcp4   192.168.0.169:3128    *:*
squid    squid      18452 7  udp4 6 *:61609               *:*
squid    squid      18452 8  udp4   *:53562               *:*
squid    squid      18452 15 tcp4   127.0.0.1:4002        *:*
squid    squid      18432 7  udp4 6 *:48090               *:*
squid    squid      18432 8  udp4   *:12180               *:*
squid    squid      18432 15 tcp4   127.0.0.1:4001        *:*

5. Заключение

Сквид у меня прозрачный какбе особо ограничивать не требуется. Можно также для бекэнда использовать havp+clamAV, но вот только думаю если использовать их на 1 ПК то потребуется ClamAV и HAVP тоже раздвоить...

Аналогичным образом можно организовать сбалансированнаую нагрузку на сервер с squid, используя машины с squid в различных сегментах сети или при наличии нескольких соединений с интернет, можно комбинировать в различных вариациях.Отлично работает со всеми извращеннеями:SAMS, Rejik, редиректы и прочие приблуды. Только пихать их надо во фроненд и снимать соответственно с фронтэнда. squid+sams+rejik-ntlm или с squid+sams+rejik
Есть смысл поиграться с coss.




ttys, 2011-11-23 в 8:49:39

наконец это сделали в версии Squid 3.2
wiki.squid-cache.org/Features/SmpScale

adre, 2011-12-03 в 19:31:44

ура ура... =)
2011 год один хер у меня в городе провайдер один - ростелеком со спутником =(



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.059 секунд
Из них PHP: 42%; SQL: 58%; Число SQL-запросов: 76 шт.
Исходный размер: 39320; Сжатая: 7375