LINUX.ORG.RU

Сообщения iron

 

Обработка сигналов в программе на C

Всем доброго времени суток.

Имеется программа на Си которая обрабатывает входящие подключения при помощи kqueue и каждое подключение отправляет на обработку в отдельный тред:

int main(int argc, char **argv) {
...

#ifdef __FreeBSD__
    // Create kqueue
    int kq;
    kq = kqueue();
    if (kq < 0) {
        perror("kqueue");
        exit(EXIT_FAILURE);
    }

    // Register server socket with kqueue for read events
    struct kevent ev;
    EV_SET(&ev, listen_sock, EVFILT_READ, EV_ADD, 0, 0, NULL);
    if (kevent(kq, &ev, 1, NULL, 0, NULL) < 0) {
        perror(«kevent»);
        exit(EXIT_FAILURE);
    }

    // Loop for handling events
    while (1) {
        struct kevent event;
        int n = kevent(kq, NULL, 0, &event, 1, NULL);

        if (n < 0) {
            perror(«kevent»);
            exit(EXIT_SUCCESS);
        }
        //int *arg;
        if ((int)event.ident == listen_sock) {
            int client_socket = accept(listen_sock, NULL, NULL);
            if (client_socket < 0) {
                perror(«accept»);
                exit(EXIT_FAILURE);
            }
            int *arg = malloc(sizeof(*arg));
            *arg = client_socket;
            pthread_t tid;
            if (pthread_create(&tid, NULL, handle_client, arg) != 0) {
                perror(«pthread_create»);
                free(arg);
                continue;
            }
            pthread_detach(tid);
        }
    }
#endif                                                                                                                         
}

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

signal(SIGUSR1, sigusr1_handler);
... и он вызывается:

void sigusr1_handler(int signal_num) {
    printf("Got SIGUSR1!\n");
}

В итоге получаю ошибку: kevent: Interrupted system call
Вот трейс:

Thread 1 received signal SIGUSR1, User defined signal 1.
Sent by kill() from pid 39787 and user 1001.
0x000000080105341a in _kevent () from /lib/libc.so.7
(gdb) bt
#0  0x000000080105341a in _kevent () from /lib/libc.so.7
#1  0x0000000800f1cb81 in ?? () from /lib/libthr.so.3
#2  0x00000000002088e9 in main (argc=3, argv=0x7fffffffe460) at main.c:387
(gdb) list main.c:387
382	   }
383	
384	   // Loop for handling events
385	   while (1) {
386	       struct kevent event;
387	       int n = kevent(kq, NULL, 0, &event, 1, NULL);
388	
389	       if (n < 0) {
390	           perror("kevent");
391	           exit(EXIT_FAILURE);
Без kqueue & kevent (если убрать все внутри цикла while(1)) все работает отлично: сигнал перехватывается, обрабатывается и программа продолжает работу.

Собственно вопрос: как корректно обработать сигнал в случае использования kqueue, выполнить нужные действия и продолжить работу программы?

 , , kevent, kqueue

iron
()

Получение переменной из колбек-функции

Всем привет,

Имеется прототип асинхронного, на уровне сокетов и файловых операций, http сервера. Функция GetData является колбеком на событие получение данных выхлопа внешней программы которая генерирует картинку. Нужно получить количество записанных в сокет данных и передать их в хедер Content-Length который определяется уровнем выше. Как можно такое реализовать? Не хотелось бы перемещать формирование хедера в GetData.

socket -server handle_client 8080
proc handle_client {chan addr port} {
    puts $chan "HTTP/1.1 200 OK\nContent-type: image/jpeg\nConnection: close\n"
    set fd [open "|cat test.jpg" r]
    fconfigure $fd -translation binary -encoding binary -blocking 0 -buffering none
    fconfigure $chan -translation binary -blocking 0
    fileevent $fd readable [list GetData $fd $chan]
}
proc GetData {fd chan} {                                                                                                       
    if {[eof $fd] && ![fblocked $fd]} {
        fileevent $fd readable {}
        close $fd
        close $chan
    } else {
        set data [read $fd]
        puts -nonewline $chan $data
        # puts [string length $data]
        if {[string length $data]} {
            incr bytes_sent [string length $data]
        }
    }
}
vwait forever

 , , ,

iron
()

Форматирование в vim

Всем привет.

В vim-е замечательная функция автоформатирования текста. К примеру, есть такой кусок конфига nginx:

server {
listen 127.0.0.1;
server_name localhost;
root /var/www/localhost;
# Lets encrypt
location ^~ /.well-known/acme-challenge/ {
alias /usr/local/www/acme/.well-known/acme-challenge/;
}
location / { 
return 301 https://localhost;
}
}
Нажимаем gg=G в командном режиме текст превращается в:
server {
        listen 127.0.0.1;
        server_name localhost;
        root /var/www/localhost;
# Lets encrypt
        location ^~ /.well-known/acme-challenge/ {
                alias /usr/local/www/acme/.well-known/acme-challenge/;
        }
        location / {
                return 301 https://localhost;
        }
}

Все отлично... Но только к строкам с комментариями не применяются отступы. Можно ли как-нить сделать чтоб после форматирования текст выглядел так?:

server {
        listen 127.0.0.1;
        server_name localhost;
        root /var/www/localhost;
        # Lets encrypt
        location ^~ /.well-known/acme-challenge/ {
                alias /usr/local/www/acme/.well-known/acme-challenge/;
        }
        location / {
                return 301 https://localhost;
        }
}
Заранее благодарен.

P.S: sudo cast LINUX-ORG-RU

 

iron
()

Ошибки связи между репликами

Всем привет,

Имеется 4 сервака, между ними настроена каскадная потоковая репликация посредством слотов репликации используя repmgr. 1-й сервак - мастер, остальные - стендбаи в которые данные льются по цепочке 1->2->3->4. Первая пара серваков наодится в одной стране, вторая в другой. Между 2 и 3 серваками настроен VPN (wireguard). Раз в пару дней отваливаются 3-я и 4-я реплики. В логах:

2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26838] FATAL:  terminating walreceiver process due to administrator command
2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
2021-07-31 14:32:58.287 EEST [26816] LOG:  incorrect resource manager data checksum in record at 2F/AD7E97B8
...

repmgr cluster show говорит:

WARNING: node "drpg1" not found in "pg_stat_replication"
WARNING: node "drpg2" not found in "pg_stat_replication"
 ID | Name  | Role    | Status    | Upstream | Location | Priority | Timeline | Connection string                                     
----+-------+---------+-----------+----------+----------+----------+----------+--------------------------------------------------------
 1  | pg1   | primary | * running |          | default  | 100      | 1        | host=pg1 user=repmgr dbname=repmgr connect_timeout=2  
 2  | pg2   | standby |   running | pg1      | default  | 100      | 1        | host=pg2 user=repmgr dbname=repmgr connect_timeout=2  
 3  | drpg1 | standby |   running | ! pg2    | default  | 100      | 1        | host=drpg1 user=repmgr dbname=repmgr connect_timeout=2
 4  | drpg2 | standby |   running | ! drpg1  | default  | 100      | 1        | host=drpg2 user=repmgr dbname=repmgr connect_timeout=2

WARNING: following issues were detected
  - node "drpg1" (ID: 3) is not attached to its upstream node "pg2" (ID: 2)
  - node "drpg2" (ID: 4) is not attached to its upstream node "drpg1" (ID: 3)

Если перезапустить 3-ю и 4-ю реплики, то 3-я переходит в состояние catchup:

WARNING: node "drpg1" attached in state "catchup"
...
WARNING: following issues were detected
  - node "drpg1" (ID: 3) attached to its upstream node "pg2" (ID: 2) in state "catchup"

...и после подтягивания WAL, реплики 3 и 4 переходит в нормальное состояние.

Увеличивать connect_timeout нет смысла, так как соединение между серваками которые находятся в разных странах может может пропадать надолго.

ВОПРОС: есть ли какой-то способ заставить постгре на 3-й реплике перезапускать walreceiver в случае обнаружения проблем с контрольными суммами либо пропаданием коннекта?

З.Ы: можно наколхозить скрипт который будет перезапускать посгре на 3-м и 4-м серваках при возникновении выше описанных ошибок. Но хочется более элегантное решение.

 ,

iron
()

Squid: referer access

Всем привет.

Есть задача: офисному планктону разрешить доступ только к определенному списку сайтов. Остальное запретить.

Пытаюсь решить задачу через squid:

acl mynet src 192.168.0.0/16
acl allowed_sites dstdomain .bloomberg.com
acl allowed_referers referer_regex -i ^https://www.bloomberg.com/.*
http_access allow mynet allowed_sites
http_access allow mynet allowed_referers
http_access deny mynet !allowed_sites
http_access deny mynet !allowed_referers

Каждый сайт за собой тащит кучу статики с других сайтов. Да бы не отслеживать всю статику вручную, решил разрешить обращение к урлам у которых referer разрешенного сайта. Но такая конструкция почему-то не работает. Разрешенный сайт открывается, но статика из других сайтов не грузится, выдает ошибку 403 Forbidden.

ЧЯДНТ?

 

iron
()

FreeBSD iscsi timeout

Всем привет!

Имеется ISCSI таргет поднятый на Windows 2012 R2, имеется FreeBSD 10.1-STABLE r277756 к котороая выступает в качестве инициатора. Подключил таргет без проблем, создал там ZFS пул, скорость отличная. Решил сделать имитацию пропадания связи между таргетом и инициатором (под виндой задисейблил сетевое подключение через которое подключается инициатор). После этого, на фре, любая команда которая обращается к /dev/da0 зависает. Даже выполнения reboot не срабатывает и продолжает висеть. Но при этом сервер живой, можно подключиться по ssh. Ничего кроме хард ресета не помогает.

Следующие команды не срабатывают, продолжаюи висеть в консоли в неубивабельном состоянии:

umount -f /iscsi/fl1
zpool iostat 1
zfs umount /iscsi/fl1/
zpool offline fl1 da0p1
reboot

Настройки: cat /etc/iscsi.conf:

fl1 {
	TargetAddress   = 172.16.27.109:3260
	TargetName      = iqn.1991-05.com.microsoft:qnss008-fl1-target
	InitiatorName	= fl1
	AuthMethod      = CHAP
	chapIName       = fl
	chapSecret      = ***********
}

dmesg:

da0 at iscsi0 bus 0 scbus8 target 0 lun 0
da0: <MSFT Virtual HD 6.3> Fixed Direct Access SCSI-5 device 
da0: Serial Number EFA47AB1-0935-4067-88E8-8CCD9D1585B0
da0: 8912648MB (18253103104 512 byte sectors: 255H 63S/T 1136203C)

Через пол часа или час имитации пропадания связи, в dmesg появилось:

(da0:iscsi0:0:0:0): WRITE(10). CDB: 2a 00 00 2e dc 48 00 00 08 00 
(da0:iscsi0:0:0:0): CAM status: CCB request completed with an error
(da0:iscsi0:0:0:0): Retrying command
da0 at iscsi0 bus 0 scbus8 target 0 lun 0
da0: <MSFT Virtual HD 6.3> s/n EFA47AB1-0935-4067-88E8-8CCD9D1585B0 detached
/dev/da0 пропал и я смог перезагрузить сервер. Но сервак так и не перезагрузился. Скорее всего завис на этапе размонтирования.

Собственно 2 вопроса:

1. как размонтировать/перемонтировать/оживить сервер без хард ресета и ситуациях когда пропадает связь с таргетом?

2. как вообще разруливать ситуации когда виндовый сервер нужно перезагрузить? Отключать таргеты на всех серверах не вариант. Пускай даже подключенный таргет будет висеть пока сервак перезагружается. Но как сделать чтоб инициатор восстанавливал соединие когда таргет стал доступен и продолжал I/O операции?

Заранее благодарен за ответы!

 ,

iron
()

FreeBSD pf+altq динамический шейпинг

Всем привет.

К офисному серверу подключен инет канал на 10мбит/с. Есть локальная сеть /24 откуда в инет ломится неизвестное количество юзеров (гости с ноутами, мобильники и т.д. через wifi). Нужно равномерно делить всю доступную полосу пропускания канала исходя из количества айпишников которые ломятся в инет. Причем независимо от того, сколько сессий открывает юзер. Так же выставлять приоритеты для трафика. Грубо говоря, если Вася качает торренты, то чтоб у директора Пети войс-колл скайпа не тормозил. С приоритетами все предельно просто. А вот как динамически запихивать все коннекты с айпишника в определенную очередь и ограничивать ее с заимствованием у других очередей(если канал простаивает)? На Линуксе подобная задача уже решена при помощи htb+sfq+tc nfct-dst. А как это реализовать на FreeBSD+pf+altq(или hfsc)? Не создавать же больше двухсот очередей на все возможные айпишники. А если подсеть будет не /24 а /16, тогда вообще повеситься. Во всех нагугленных примерах явно указываются айпишник/группа айпишников при создании очередей, но это не то что мне нужно. Да и в доках/манах по pf ничего подобного не могу найти.

Заранее благодарен за любые идеи!

 , , ,

iron
()

BIND, ответ на все запросы

Все привет,

Есть некий сервис, который позволяет подключать к своей системе доменные имена клиентов. При подключении своего домена клиент прописывает A запись своего домена на IP этого сервиса. Но возникла необходимость переезда серверов в другой ДЦ, следовательно IP поменяется и неизвестно сколько еще раз будет меняться. Регистрировать свою AS нет времени. Да и в RIPE IPv4 айпишники вродь закончились(?). Подключенных доменов несколько сотен и дописывать функционал движка для добавления домена в DNS нет времени. Нужно какое-то быстрое и временной решение. Пока что придумал вот что. Настраиваю bind таким образом, чтоб он отвечал на все запросы выдавая нужный IP. А клиенты прописывают NS-ы свой зоны мой DNS-а (ns{1,2}.domain.com).

named.conf:

zone "." in {
        type master;
        file "/var/bind/db.all";
        allow-update { none; };
};

db.all:

$TTL 1W
@       IN      SOA     ns1.domain.com. root.localhost.  (
                                      2008122601 ; Serial
                                      60      ; Refresh
                                      60      ; Retry
                                      60     ; Expire - 1 week
                                      60 )    ; Minimum
                IN      NS      ns1.domain.com.
                IN      NS      ns2.domain.com.
                IN      A       1.1.1.1
*               IN      A       1.1.1.1

 # dig @2.2.2.2 example.com

; <<>> DiG 9.9.3-P2 <<>> @2.2.2.2 example.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1080
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;example.com.			IN	A

;; ANSWER SECTION:
example.com.		604800	IN	A	1.1.1.1

;; AUTHORITY SECTION:
.			604800	IN	NS	ns1.domain.com.
.			604800	IN	NS	ns2.domain.com.

;; ADDITIONAL SECTION:
ns1.domain.com.	604800	IN	A	1.1.1.1
ns2.domain.com.	604800	IN	A	1.1.1.1

;; Query time: 1 msec
;; SERVER: 2.2.2.2#53(2.2.2.2)
;; WHEN: Tue Dec 24 16:54:11 EET 2013
;; MSG SIZE  rcvd: 130

Как видим выше, при выполнении запроса A запись выдается. А вот на запрос NS записей ответа нет:

# host -t ns example.com 2.2.2.2
Using domain server:
Name: 2.2.2.2
Address: 2.2.2.2#53
Aliases: 

example.com has no NS record

Поскольку на запрос NS записей ответа нет, многие клиенты не могут поменять у себя NS записи домена. К примеру на godaddy при попытке поменять NS-ы домена говорит: You must enter a registered nameserver.

Можно как-то решить проблему? Да и вообще, возможно выше описанную задачу можно решить каким-то другим способом? Цель - управлять A записями подключенных доменов. А позже можно будет привязать DNS к движку сервиса.

Заранее благодарен за ответы!

iron
()

Сравнение производительности php: FreeBSD vs Gentoo Linux

Доброго времени суток,

Имеется два идентичных сервера: Xeon E3-1270v2, 32Gb RAM, RAID10. На одном из них стоит Gentoo Linux запиленная под железо, на другом FreeBSD 10-STABLE. Стало интересно сравнить производительность фри c Linux-ом на типичных серверных задачах: nginx+uwsgi_php55, mariadb-galera, redis. Все кроме php работает замечательно. По результатам теста, php под FreeBSD жрет на 30% больше проца и при этом существенно проигрывает в скорости по сравнению с Linux-ом. Сразу скажу, что на обеих ОСях php собран одной версией компилятора, одинаковыми модулями и с теми же CFLAGS. Прослойка uwsgi никакого влияния не оказывает, пробовал php-fpm - результат тот же. В сетевом стеке или nginx затыка тоже нет (настройки nginx одинаковые). Для уверенности в этом, результат выполнения скрипта клал в htm файл и тащил по сети в 16 потоков, трафик забил гигобитный линк до отказа. Скорость отдачи статики через nginx практически одинаковые на обеих серверах. В итоге получилось, что на Linux php скрипт (банальный phpinfo()) выполнился за 1 msec, а на фре примерно за 8 msec. Ниже трейсы с временными метками.

Gentoo Linux:

12:46:32.578393 accept4(6, {sa_family=AF_INET, sin_port=htons(59528), sin_addr=inet_addr("192.168.3.7")}, [16], SOCK_NONBLOCK) = 10
12:46:32.578527 read(10, "\0167\2\0\17\0SCRIPT_FILENAME+\0/home/htt"..., 4100) = 574
12:46:32.578678 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.578779 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.578917 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.578966 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579035 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579078 stat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579124 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579161 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579177 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579225 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579261 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579296 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579321 stat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579373 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={60, 0}}, NULL) = 0
12:46:32.579417 rt_sigaction(SIGPROF, {0x7f67b9b1a0b0, [PROF], SA_RESTORER|SA_RESTART, 0x3654634d10}, {0x7f67b9b1a0b0, [PROF], SA_RESTORER|SA_RESTART, 0x3654634d10}, 8) = 0
12:46:32.579464 rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0
12:46:32.579517 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579535 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579565 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579588 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579608 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579627 stat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579647 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={30, 0}}, NULL) = 0
12:46:32.579662 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579679 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579698 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579715 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579731 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579772 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579800 stat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579816 lstat("/home/httpd/www/system/web/info.php", {st_mode=S_IFREG|0644, st_size=20, ...}) = 0
12:46:32.579831 lstat("/home/httpd/www/system/web", {st_mode=S_IFDIR|0755, st_size=440, ...}) = 0
12:46:32.579864 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.579882 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.579899 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.579917 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.579944 uname({sys="Linux", node="node1", ...}) = 0
12:46:32.581114 write(10, "HTTP/1.1 200 OK\r\nContent-type: t"..., 44) = 44
12:46:32.581141 write(10, "<!DOCTYPE html PUBLIC \"-//W3C//D"..., 95544) = 95544
12:46:32.581178 lstat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.581195 lstat("/home/httpd/www", {st_mode=S_IFDIR|0755, st_size=120, ...}) = 0
12:46:32.581213 lstat("/home/httpd", {st_mode=S_IFDIR|0755, st_size=80, ...}) = 0
12:46:32.581232 lstat("/home", {st_mode=S_IFDIR|0755, st_size=256, ...}) = 0
12:46:32.581249 stat("/home/httpd/www/system", {st_mode=S_IFDIR|0755, st_size=208, ...}) = 0
12:46:32.581268 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
12:46:32.581298 setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={0, 0}}, NULL) = 0
12:46:32.581313 open("/proc/self/stat", O_RDONLY) = 13
12:46:32.581333 fstat(13, {st_mode=S_IFREG|0444, st_size=0, ...}) = 0
12:46:32.581369 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f67b87bf000
12:46:32.581390 read(13, "5295 (uwsgi) R 5292 5291 5291 0 "..., 1024) = 309
12:46:32.581415 close(13)               = 0
12:46:32.581435 munmap(0x7f67b87bf000, 4096) = 0
12:46:32.581452 close(10)               = 0
12:46:32.581475 writev(2, [{"{address space usage: 313401344 "..., 78}, {"[pid: 5295|app: -1|req: -1/20] 1"..., 207}], 2) = 285
12:46:32.581516 epoll_wait(8, ^CProcess 5295 detached
 <detached ...>

FreeBSD:

13518: 4.569934535 4.569699769 kevent(7,0x0,0,{0x6,EVFILT_READ,0x0,0,0x1,0x0},1,0x0) = 1 (0x1)
13518: 4.570825352 0.000052122 accept(6,{ AF_INET 192.168.3.8:27225 },0x800751104) = 9 (0x9)
13518: 4.571227700 0.000080451 read(9,"\^N7\^B\0\^O\0SCRIPT_FILENAME+\0"...,4100) = 574 (0x23e)
13518: 4.572505836 0.000127551 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.572865713 0.000085512 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.573190386 0.000084730 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.573510820 0.000085387 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.573830457 0.000086490 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.574463050 0.000112191 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.574776573 0.000074341 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.575283320 0.000147897 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.575610283 0.000083883 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.575931248 0.000084239 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.576285572 0.000108849 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.576609324 0.000111585 lstat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.576934252 0.000087095 stat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.578137551 0.000044300 setitimer(2,{0.000000, 60.000000 },0x0) = 0 (0x0)
13518: 4.578890119 0.000065843 sigprocmask(SIG_SETMASK,SIGHUP|SIGINT|SIGQUIT|SIGILL|SIGTRAP|SIGABRT|SIGEMT|SIGFPE|SIGKILL|SIGBUS|SIGSEGV|SIGSYS|SIGPIPE|SIGALRM|SIGTERM|SIGURG|SIGSTOP|SIGTSTP|SIGCONT|SIGCHLD|SIGTTIN|SIGTTOU|SIGIO|SIGXCPU|SIGXFSZ|SIGVTALRM|SIGPROF|SIGWINCH|SIGINFO|SIGUSR1|SIGUSR2,0x0) = 0 (0x0)
13518: 4.579187695 0.000043938 sigaction(SIGPROF,{ 0x8008c4f10 SA_RESTART|SA_SIGINFO ss_t },{ SIG_DFL SA_RESTART ss_t }) = 0 (0x0)
13518: 4.579462247 0.000041825 sigprocmask(SIG_SETMASK,0x0,0x0) = 0 (0x0)
13518: 4.579911068 0.000042550 sigprocmask(SIG_UNBLOCK,SIGPROF,0x0) = 0 (0x0)
13518: 4.590744228 0.000042902 getpid()		 = 13518 (0x34ce)
13518: 4.591336110 0.000120646 lstat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.591654258 0.000083637 lstat("/home/httpd/www/system",{ mode=drwxr-xr-x ,inode=14,size=8,blksize=4096 }) = 0 (0x0)
13518: 4.591972362 0.000081378 lstat("/home/httpd/www",{ mode=drwxr-xr-x ,inode=11,size=7,blksize=4096 }) = 0 (0x0)
13518: 4.592261019 0.000077203 lstat("/home/httpd",{ mode=drwxr-xr-x ,inode=8,size=3,blksize=4096 }) = 0 (0x0)
13518: 4.592546414 0.000053455 lstat("/home",{ mode=drwxr-xr-x ,inode=4,size=6,blksize=4096 }) = 0 (0x0)
13518: 4.593027172 0.000087156 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.593343938 0.000042315 setitimer(2,{0.000000, 30.000000 },0x0) = 0 (0x0)
13518: 4.593741569 0.000111314 lstat("/home/httpd/www/system/web/info.php",{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.594713138 0.000122570 open("/home/httpd/www/system/web/info.php",O_RDONLY,00) = 11 (0xb)
13518: 4.595143348 0.000071575 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.595421016 0.000066014 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.595870293 0.000074647 read(11,"<?php\nphpinfo();\n?>\n",8192) = 20 (0x14)
13518: 4.596238890 0.000046159 read(11,0x7dc8e8,8192) = 0 (0x0)
13518: 4.596512268 0.000044300 read(11,0x7dc8e8,8192) = 0 (0x0)
13518: 4.596948686 0.000071119 close(11)	 = 0 (0x0)
13518: 4.600002706 0.000046740 break(0xd44000)	 = 0 (0x0)
13518: 4.604407899 0.000144809 open("/home/httpd/www/system/web/info.php",O_RDONLY,00) = 11 (0xb)
13518: 4.604657610 0.000047382 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.604905881 0.000046504 __sysctl(0x7fffffffb380,0x2,0x7fffffffb37c,0x7fffffffb388,0x0,0x0) = 0 (0x0)
13518: 4.605218127 0.000046154 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.605494952 0.000044314 fstat(11,{ mode=-rw-r--r-- ,inode=102419,size=20,blksize=4096 }) = 0 (0x0)
13518: 4.605771958 0.000076125 mmap(0x0,20,PROT_READ,MAP_SHARED,11,0x0) = 34367475712 (0x800761000)
13518: 4.607110165 0.000039308 getpid()		 = 13518 (0x34ce)
13518: 4.609585731 0.000076692 munmap(0x800761000,20) = 0 (0x0)
13518: 4.609831733 0.000072562 close(11)	 = 0 (0x0)
13518: 4.610278029 0.000047472 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc130,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.610554860 0.000044264 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc230,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.610830052 0.000066649 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc330,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.611107379 0.000067807 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc430,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.611396603 0.000042516 __sysctl(0x7fffffffbfe0,0x2,0x7fffffffc530,0x7fffffffbfd8,0x0,0x0) = 0 (0x0)
13518: 4.616492616 0.000155860 open("/usr/share/locale/en_US.UTF-8/LC_CTYPE",O_CLOEXEC,0666) = 11 (0xb)
13518: 4.616764816 0.000070753 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.617088612 0.000069731 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.617405293 0.000064435 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.617650067 0.000043323 lseek(11,0x0,SEEK_SET) = 0 (0x0)
13518: 4.618217554 0.000365490 read(11,"RuneMag1UTF-8\0\0\0\0\0\0\0\0\0"...,65536) = 65536 (0x10000)
13518: 4.619179546 0.000082154 read(11,"@\^D\b\0@\^D\b\0@\^D\b\0@\^D\b\0"...,65536) = 10596 (0x2964)
13518: 4.620830499 0.000050112 close(11)	 = 0 (0x0)
13518: 4.624148825 0.000068403 break(0xe44000)	 = 0 (0x0)
13518: 4.630655933 0.000126919 open("/usr/share/locale/en_US.UTF-8/LC_CTYPE",O_CLOEXEC,0666) = 11 (0xb)
13518: 4.630926550 0.000070057 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.631176742 0.000045122 fstat(11,{ mode=-r--r--r-- ,inode=132288,size=76132,blksize=65536 }) = 0 (0x0)
13518: 4.631422162 0.000043784 lseek(11,0x0,SEEK_CUR) = 0 (0x0)
13518: 4.631664936 0.000042445 lseek(11,0x0,SEEK_SET) = 0 (0x0)
13518: 4.632011403 0.000119448 read(11,"RuneMag1UTF-8\0\0\0\0\0\0\0\0\0"...,65536) = 65536 (0x10000)
13518: 4.632747574 0.000079103 read(11,"@\^D\b\0@\^D\b\0@\^D\b\0@\^D\b\0"...,65536) = 10596 (0x2964)
13518: 4.633894601 0.000069425 close(11)	 = 0 (0x0)
13518: 4.638873827 0.000109916 write(9,"HTTP/1.1 200 OK\r\nContent-type:"...,44) = 44 (0x2c)
13518: 4.639321908 0.000170057 write(9,"<!DOCTYPE html PUBLIC "-//W3C//D"...,85600) = 81616 (0x13ed0)
13518: 4.640090226 0.000052438 poll({9/POLLOUT},1,4000) = 1 (0x1)
13518: 4.640748743 0.000099664 write(9,"ance, Johann Hanne, Boris Lytoch"...,3984) = 3984 (0xf90)
13518: 4.641393844 0.000129956 stat("/home/httpd/www/system/web",{ mode=drwxr-xr-x ,inode=110568,size=15,blksize=4096 }) = 0 (0x0)
13518: 4.641877614 0.000042891 setitimer(2,{0.000000, 0.000000 },0x0) = 0 (0x0)
13518: 4.642830145 0.000041974 getpid()		 = 13518 (0x34ce)
13518: 4.643472691 0.000042961 setitimer(2,{0.000000, 0.000000 },0x0) = 0 (0x0)
13518: 4.644000590 0.000077829 __sysctl(0x7fffffffd3d8,0x2,0x8027e0db0,0x7fffffffd3e0,0x0,0x0) = 0 (0x0)
13518: 4.644593565 0.000113284 open("/dev/null",O_CLOEXEC,00) = 11 (0xb)
13518: 4.645078362 0.000070653 fstat(11,{ mode=crw-rw-rw- ,inode=25,size=0,blksize=4096 }) = 0 (0x0)
13518: 4.645558775 0.000077133 open("/dev/null",O_CLOEXEC,00) = 12 (0xc)
13518: 4.645971445 0.000092082 __sysctl(0x7fffffffd470,0x4,0x0,0x7fffffffd460,0x0,0x0) = 0 (0x0)
13518: 4.646439044 0.000119022 __sysctl(0x7fffffffd470,0x4,0x7e9900,0x7fffffffd460,0x0,0x0) = 0 (0x0)
13518: 4.646921601 0.000071426 close(11)	 = 0 (0x0)
13518: 4.647215820 0.000041939 close(12)	 = 0 (0x0)
13518: 4.647561215 0.000079659 close(9)		 = 0 (0x0)
13518: 4.648209339 0.000112332 writev(0x2,0x7fffffffb470,0x2,0x8ad8d7b1a524b1c9,0x7fffffb93526,0x8025b0de0) = 286 (0x11e)
Не совсем понятно зачем php под фрей запрашивает кучу sysctl да еще и зачем-то в /dev/null лезет. Можно ли это как-то выпилить?

Подскажите пожалуйста куда копать. Если нужна доп. инфа о настройках FreeBSD - пишите.

Заранее благодарен!

 

iron
()

Организация своего мини CDN

Доброго времени суток, ув. ЛОРовчане.

Есть веб-сервис, который в перспективе будет иметь свыше миллиона уникальных посетителей в день(по крайней мере так ставится задача). Если взглянуть на него админским взглядом, то это несколько тысяч виртуальных хостов и насколько миллионов файлов мелкой статики (jpg, png, css. js). Возникла необходимость организовать что-то типа своего мини CDN куда и вынести всю статику из веб-приложения, генерить ссылки на статику типа static.domain.com и резолвить айпишник этого сабдомена в зависимости от гео-позиционирования клиента. С этим, в принципе, все просто и ясно. Возникает вопрос лишь в том, как хранить сами файлы. Единственное что приходит на ум - хранить сами файлы в MongoDB (GridFS) и дергать их враппером отдавая nginx-ом. Даже есть идея написать простенький модуль для nginx, который бы это реализовывал. Сами базы реплецировать между серверами в мульти-мастер режиме. Для оказания высокой доступности серверов со статикой со стороны приложений планируется применять haproxy в режиме TCP балансирования. Добавлений файла будет не так много, так что латентность подключения веб-приложения к БД со статикой не сильно важна.
Есть еще вариант построить кластер на базе Ceph. Но я не думаю, что для такой узко-специализированной задачи это является оптимальным решением.
Цель всего этого:
- организовать максимальную скорость доступа к статическим файлам
- высокую доступность
- высокую надежность хранения
- оптимальное использование серверных ресурсов

Если кто-то сталкивался с подобного рода задачами либо просто имеет идеи относительно данного ТЗ, просьба поделиться своим мнением.

P.S: услуги существующих CDN не предлагать. Трафика будет много, так что это решение заведомо не выгодно нашей компании. К тому же нужно будет иметь возможность обрабатывать файлы прямо на сервере.

Заранее очень благодарен.

iron
()

qemu-1.4.0 и -cpu опция

Всем привет!

Кто-нить подскажет куда подевался "-cpu host" из 1.4.0 версии qemu? Если выполнить «qemu-kvm -cpu ?», можно получить список доступных процессоров для эмуляции. Но там нету моего i7-3770 на ядре Ivy Bridge. Тем более, нафига мне эмулировать, если я хочу весь проц во всей его красе отдать виртуалке. В итоге с какими бы я опциями -cpu не запустил, все равно возникают жуткие тормоза. Виртуалка работает раза в 3 медленее чем при qemu-1.2.2. Можно каким-то образом это побороть?

Заранее благодарен за ответы!

 

iron
()

Хак Joomla 1.0.x

Доброго времени суток всем!

Так уж получилось, что приходится админить сайт который крутится на глючтой и дырявой Joomla 1.0.X. Сегодня сайт упал. Когда выполняются запросы мускула, почему-то запросы остаются со статусом Sleep и при этом загрузка страницы висит.

+-----+----------+-----------------+----------+---------+------+-------+------------------+----------+
| Id  | User     | Host            | db       | Command | Time | State | Info             | Progress |
+-----+----------+-----------------+----------+---------+------+-------+------------------+----------+
| 136 | sound_sm | localhost:52183 | xxxxxxxx | Sleep   | 8    |       |                  | 0.000    |
| 137 | sound_sm | localhost:52185 | xxxxxxxx | Sleep   | 6    |       |                  | 0.000    |
| 138 | sound_sm | localhost:52187 | xxxxxxxx | Sleep   | 6    |       |                  | 0.000    |
| 140 | sound_sm | localhost:52191 | xxxxxxxx | Sleep   | 5    |       |                  | 0.000    |
| 141 | sound_sm | localhost:52193 | xxxxxxxx | Sleep   | 3    |       |                  | 0.000    |
Запрет в php.ini «mysql.allow_persistent = Off» ни к чему не привел, как и «wait_timeout = 10» в my.cnf. Запросы так и продолжают висеть пока таймаут не прибьет. Поначалу думал что проблема в системе. Пробовал пересобирать MySQL и php, менять версии, но безрезультатно. Пробовал курить доку, но тоже безрезультатно. Так же обнаружил у себя очень интересный файл в папке с картинками. Просьба php знатоков взглянуть на него и поведать что он делает.

Каковы могут быть причины подобного завиcания запросов?

Заранеее очень благодарен за ответы!

iron
()

Переключение раскладки

Всем привет!

Имеется Gentoo Linux. Поставил E17 из оверлея enlightenment.
Настроил переключение раскладки клавиатуры в два клика. Но в упор не могу найти где настроить, чтоб раскладка переключалась «для окна» или «для приложения». Очень неудобно работать в консоли в английской раскладке и каждый раз переключаться на русский когда нужно написать мессагу в месенджере. Кроме этого, на радость все работает идеально. Если удастся победить эту багу, наконец-то слезу с LXDE.

Заранее благодарен за ответы!

 ,

iron
()

Создание кластера (теория)

Доброго времени суток, уважаемые

Дано:
Есть сайт с постоянно растущей нагрузкой. Время от времени трафикообменные ресурсы не равномерно отдают трафик. К примеру бывает такое, что суточную норму переходов они отдают за пол часа. В итоге на сайт наваливаются посетители, которых иногда в 20 раз больше обычного количества.
Имеется выделенный сервер в Украине (Xeon X3430/8G RAM) и сервер в Голландии (Xeon X3440/4G RAM).
Задача: сделать чтоб сайт был доступен всегда. Для этого один и тот же сайт должен быть на двух серверах одновременно.
Мои размышления по этому поводу:
Наверно придется держать на каждом сервере по копии сайта. Для этого нам придется в реальном времени реплицировать базу данных и статические файлы (изображение, видео).
С базой данных, наверно, все просто. Думаю применить MYSQL репликацию master<>master (по другому наверно же никак?). А вот с файлами возникла дилемма... Файлы добавляются редко. Совместного доступа на запись к файлам нет. Изначально думал использовать DRBD + OCFS2... но на практике стало ясно, что DRBD работает прекрасно в режиме master<>master только тогда, когда сервера соединены кросовым кабелем. В моем же случае, при довольно частых пропаданиях связи между серверами, одна из нод DRBD иногда падает слейв, отваливается демон OCFS2 из за чего отмонтируется файловая система, и файлы бьются. Но самое главное то, что приходится ручками все это дело поднимать.DRBD можно допилить чтоб он автоматом синкался и поднимался в Prymary<>Prymary автоматом. Но вот как быть с OCFS2? Писать велосипед который будет проверять состояние DRBD и принимать решения что и как запускать - не хочется. Жаль что heartbeat не умеет работать с DRBD master<>master.
Сейчас настраиваю glusterfs. Как у нее обстоят дела с прерыванием связи между нодами? Подтягивает ли те файлы, которые были записаны в момент прерывания связи между нодами?
Балансировка нагрузки:
1) Проверять через GeoIP откуда пришел пользователь. Если не из Украины - отправляем на голландский сервер.
2) Если количество посетителей превышает некий лимит, то с украинского сервера перебрасываем на ww2.domain.com который на голландском сервере. Для поисковых систем прописать ww2 как зеркало.

Как, по Вашему мнению, лучше всего организовать файловую репликацию?

Заранее благодарен за ответ!

iron
()

SFQ hash nfct-dst - вешает интерфейс

В продолжение этой темы.

Проблема заключается в том, что при попытке сделать равномерное распределение трафика не по потокам а по айпишникам через SFQ, интерфейс на котором это делается «зависает» (т.е. перестает проходить какой либо трафик). раньше я использовал ESFQ, но он уже не поддерживается, и его функционал был перенесен в SFQ который есть в ванильном ядре. Вот текст скрипта:

TC="/sbin/tc"
$TC qdisc del dev eth0 root &> /dev/null
$TC filter del dev eth0 &> /dev/null
$TC class del dev eth0 &> /dev/null

$TC qdisc add dev eth0 root handle 1: htb default 20 r2q 10
$TC class add dev eth0 parent 1: classid 1:1 htb rate 1024mbit

$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 100mbit burst 6k prio 0

$TC class add dev eth0 parent 1:10 classid 1:110 htb rate 256kbit ceil 100mbit prio 0 burst 6k
$TC class add dev eth0 parent 1:10 classid 1:120 htb rate 128kbit ceil 900kbit prio 7 burst 6k

$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 1000mbit prio 2

$TC qdisc add dev eth0 parent 1:110 handle 110 sfq perturb 5
$TC qdisc add dev eth0 parent 1:120 handle 120: sfq perturb 5
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 5

# после добавления ниже перечисленных строк, полностью прекращается прохождения трафика через eth0
$TC filter add dev eth0 parent 110: protocol ip handle 1 flow hash keys nfct-dst divisor 256 baseclass 1:110
$TC filter add dev eth0 parent 120: protocol ip handle 1 flow hash keys nfct-dst divisor 256 baseclass 1:120
$TC filter add dev eth0 parent 20: protocol ip handle 1 flow hash keys nfct-dst divisor 256 baseclass 1:20

Подскажите пожалуйста где проблема.

Заранее благодарен!

iron
()

PHP4 extensions to PHP5

Доброго времени суток!

Так случилось, что нужно было перейти с php4 на php5. Но проблема заключается в том, что на сервере крутится компилиная софтина, и к ней веб-морда с php-шным модулем. А он не хочет работать с php5. В логах:

[Mon Feb 23 12:43:44 2009] [error] [client xxx.xxx.xxx.xxx] PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php5/lib/php/extensions/xxxxx.so' - /usr/lib/php5/lib/php/extensions/xxxxx.so: undefined symbol: compiler_globals in Unknown on line 0, referer: http://xxxxxx.com/info.php

Связаться с девелоперами очень сложно. Можно ли каким-то образом заставить его работать в php5?

iron
()

quotacheck & quotaon

Доброго времени суток, уважаемые.

Продолжая тему http://www.linux.org.ru/view-message.jsp?msgid=3122701#3126639 автором которой являюсь я.

На обеих серверах Gentoo.

У меня почему-то с квотами творится какая-то мистика... На одном сервере при загрузке автоматически включаются квоты. Даже не выполняя команду quotaon. Причем на DRBD разделе. А вот на другом сервере, квоты почему-то слетают при каждой перезагрузке. Причем /etc/init.d/quota запускается автоматически(с которого также вызывается quotacheck).

# rc-update -s | grep quota
quota | boot

По поводу quotacheck. Насколько я понимаю, он нужен для проверки целостности квот. А о какой целостности говорится - не понятно. Елинственное что приходит на ум - это отправка юзерам warnquota мессаг. Но зачем рекомендуют его выполнять в crontab - тоже не понятно. Тем более, если его запускать при смонтированном разделе, то возможно повреждение данных. Тогда, получается, нужно по крону отмантировать раздел, и запускать его? Но зачем он вообще нужен, если мне не нужно отсылать юзерам уведомление.

Вопросы:
1) Каким образом могут автоматически включатся квоты без quotaon? Может это особенность 2-й версии quota?
2) Все таки для чего нужен quotacheck? Зачем его запускать при загрузке системы и по крону?

Заранее благодарен за ответы!

iron
()

Инет-радио

Всем привет.

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

Написал скрипт, который при обрыве соединения, переподключается к следующему серверу в соответствии с плей-листом.

#!/bin/bash

while [ 1 ]; do
for i in http://scfire-dll0l-1.stream.aol.com:80/stream/1048 http://scfire-chi0l-1.stream.aol.com:80/stream/1048 http://scfire-nyk0l-1.stream.aol.com:80/stream/1048 http://scfire-dll0l-2.stream.aol.com:80/stream/1048 http://scfire-nyk0l-2.stream.aol.com:80/stream/1048 http://scfire-chi0l-2.stream.aol.com:80/stream/1048 http://scfire-ntc0l-1.stream.aol.com:80/stream/1048 http://scfire-ntc0l-2.stream.aol.com:80/stream/1048 http://207.200.96.226:8048 http://radioparadise.steadyhost.com:8060 http://radioparadise.steadyhost.com:8050 http://64.236.34.97:80/stream/1048;do
mplayer -cache 2000 $i
done
done

Но к сожалению параметр -cache никаким образом не спасает от глюков при проигрывании. Даже когда я ставлю большой размер кеша, то при глюке соединения, всеравно радио прерывается.

Внимание вопрос: Каким образом можно слушать радио без прерываний. Не обязательно mplayer-ом. Можно и другой прогой, только лишь бы работало нормально.

Заранее благодарен!

iron
()

Сложный вопрос про htb и Squid

Всем привет.

Заранее хочу извинится за длинный текст.

Прошу помочь разобраться с маркировкой пакетов перед отправкой в определённый класс шейпинга.
Дано: сервер под управлением Gentoo со Squid-ом на борту. Два канала инета по 4М мира и 100М украины, по которым сервер равномерно распределяет нагрузку. До сих пор все шейпились в одном классе с максимальной скоростью 6000kbit (собственно исходя из толщины мирового канала) и при помощи esfq и hash dst равномерно распределялось по всем айпишникам (а не по потокам как в sfq). Но как показала практика, это не совсем оптимальное использование каналов. Посему возникла необходимость по Украине пускать с полной скоростью 100M, а мир как и раньше загонять с 6000kbit-ный класс как и раньше.

Вот как я все это реализовал:
Есть корневой класс 1: который я поделил на 1:10 со скоростью 6000kbit и приоритетом 0 (чтоб качающие по украине были в приоритете ниже чем по миру), и 1:20 со скоростью 200М (учитывая что два канала по 100М).

Вот как заворачиваю трафик в 1:10:
IPT -t mangle -A POSTROUTING -d 192.168.0.0/16 -o eth0 -j CLASSIFY --set-class 1:10

Вот как проверяю и заворачиваю в 1:20 (UA-IX):
$IPT -t mangle -N UA-IX
for i in `cat /etc/conf.d/ua-list.txt`; do \
$IPT -A UA-IX -t mangle -s $i -j CLASSIFY --set-class 1:20
done
$IPT -A POSTROUTING -t mangle -d 192.168.0.0/16 -o eth0 -j UA-IX

В чем собственно проблема:
Поскольку у меня еще и Squid работающий в прозрачном режиме, то пакеты выползающие с eth0 и идущие в локалку прекрасно захватываются правилом -t mangle -A POSTROUTING -d 192.168.0.0/16, поскольку мы проверяем адрес получателя а не источника. А вот правило, которым нужно проверять по источнику -A UA-IX -t mangle -s <UA-IX net> не срабатывают, так как пакеты не проходят через цеполчку POSTROUTING, потому, что они выходят с Squid-а а не роутятся с инета. Я пробовал -n mangle -A OUTPUT, но результат тот же. Без Сквида, понятное дело, что все работает.

Внимание вопросы:
1) Можно ли каким-то образом маркировать пакеты выходящие из Сквида в локалку по адресу источника?
2) Можно ли маркировать только пакеты с установленным SYN флагом, чтоб не прогонять весь трафик через всю цепочку UA-IX? Знаю, что можно юзая CONNMARK, но проблема в том, что у меня уже маркируются таким образом соединения при балансировке нагрузки каналов:
$IPT -A POSTROUTING -t mangle -j MARK --set-mark 0x200 -m state --state NEW -o $IF1
$IPT -A POSTROUTING -t mangle -j MARK --set-mark 0x100 -m state --state NEW -o $IF2
$IPT -A POSTROUTING -t mangle -j CONNMARK --save-mark -m state --state NEW
Тогда каким образом делать CONNMARK, чтоб одно не мешало другому?

Заранее благодарен за ответы!

>>>

iron
()

User Quota

Всем привет.

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

setquota -u test.test 256000 286720 0 0 /dev/md3

...молча выполняется, но при этом квота не выставляется :(.

# quota test.test Disk quotas for user test.test (uid 1568): none

При выполнении repquota -a, вообще не показывает юзера, в логине которого есть точка. Хотя пользователь существует:

# id test.test uid=1568(test.test) gid=1568(test.test) groups=1568(test.test)

Ребята, можно ли как-то решить эту проблему? Заранее благодарен за любые мысли по этому поводу.

>>>

iron
()

RSS подписка на новые темы