LINUX.ORG.RU
ФорумAdmin

rsyslog пропускает сообщения


0

1

Здравствуйте.

Пожаловались мне, что на одной машине (Debian Lenny) rsyslog пропускает некоторые сообщения, генерируемые файрволом. Точнее, rsyslog через плагин не выгружает некоторые сообщения в mysql базу.

Быстро написал генератор сообщений syslog:

#include <syslog.h>

int main(int argc, char *argv[])
{
    char s[] = "TESTLOG0000000000";
    int i;
    unsigned int len = sizeof(s) / sizeof(s[0]);
    char *strend = s + len - 2;

    openlog("TMG", LOG_NDELAY | LOG_NOWAIT, LOG_USER);
    for (i = 0; i < 500000; ++i)
    {
        char *p = strend;
        syslog(LOG_NOTICE, s);
        while (*p == '9') {
            *p = '0';
            --p;
        }
        (*p) ++;
    }
    closelog();

    return 0;
}

Запускал на виртуалке. Сообщения генерируются, средняя скорость варьируется в зависимости от их количества (100к - 600 сообщений в секунду, 500к - 400). На 500к сообщений видны пропадания - в базу не попадает порядка 150 сообщений. Проверял содержимое /var/log/syslog - там этих сообщений тоже нет. Значит, каким-то образом сообщения не дошли до самого syslog.

Погуглил, нашел, что пропадание может быть вызвано маленьким размером буфера стека UDP. Повысил, перезапустил rsyslog:

# sudo sysctl -w net.core.wmem_max=1116160
# sysctl -w net.core.rmem_max=1116160
# sysctl -w net.ipv4.udp_rmem_min=1116160
# sysctl -w net.ipv4.udp_wmem_min=1116160
# sysctl -w net.ipv4.udp_mem='1116160 1116160 1116160'
# sysctl -w net.ipv4.route.flush=1
# /etc/init.d/rsyslog stop && sudo /etc/init.d/rsyslog start

Все равно сообщения пропадают, причем потери примерно такие же - 150 сообщений при 500к сгенерированных. Значит, ни при чем тут стек UDP.

Вопрос - почему могут пропадать сообщения? Где посмотреть и что можно подкрутить?


Конфиг rsyslog:

$ cat /etc/rsyslog.conf | grep -e "^[^#]"
$ModLoad ommysql
$template cacti_syslog,"INSERT INTO syslog_incoming(facility, priority, date, time, host, message) values ('%syslogfacility-text%', '%syslogpriority-text%', '%timereported:::date-mysql%', '%timereported:::date-mysql%', '%HOSTNAME%', '%msg%')",SQL
*.* >localhost,cacti,cacti,cacti;cacti_syslog
$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog   # provides kernel logging support (previously done by rklogd)
$ModLoad imudp
$UDPServerRun 514
$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
$FileOwner root
$FileGroup adm
$FileCreateMode 0640
$DirCreateMode 0755
$IncludeConfig /etc/rsyslog.d/*.conf
auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none          -/var/log/syslog
daemon.*                        -/var/log/daemon.log
kern.*                          -/var/log/kern.log
lpr.*                           -/var/log/lpr.log
mail.*                          -/var/log/mail.log
user.*                          -/var/log/user.log
mail.info                       -/var/log/mail.info
mail.warn                       -/var/log/mail.warn
mail.err                        /var/log/mail.err
news.crit                       /var/log/news/news.crit
news.err                        /var/log/news/news.err
news.notice                     -/var/log/news/news.notice
*.=debug;\
        auth,authpriv.none;\
        news.none;mail.none     -/var/log/debug
*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none          -/var/log/messages
*.emerg                         *
daemon.*;mail.*;\
        news.err;\
        *.=debug;*.=info;\
        *.=notice;*.=warn       |/dev/xconsole
ksv
() автор топика
Ответ на: комментарий от ksv

Буфер где-то переполняется, рискну предположить в момент передачи пакета из ядра в юзерспейс, вот и пропадают пакеты. Что 0.03% такая критичная величина?

Yur4eg ★★
()

> Проверял содержимое /var/log/syslog - там этих сообщений тоже нет. Значит, каким-то образом сообщения не дошли до самого syslog.

Может и дошли, но rsyslog их потерял. Предлагаю проверить, поставить, например, syslog-ng и посмотреть не будут ли пропадать сообщения.

anonymous
()
Ответ на: комментарий от Yur4eg

Информация о потере сообщений пришла из проекта, в котором файрвол отправляет сообщения об определенных типах пакетов. Народ очень удивился, не найдя в логе некоторых сообщений, которые там должны быть. Подозреваю, или они очень невезучие что попали в эти 0.03%, или процент потерь там значительно выше (хотя, с их слов, частота генерации сообщений должна быть ниже тех же 600 сообщений в секунду).

Мне же хотелось узнать, реально ли что-нибудь исправить, дабы уменьшить пропадания пакетов. Если потери происходят на таком низком уровне (при переходе между режимами), то, скорее всего, придется смириться с ними.

2anonymous: за syslog-ng спасибо, обязательно проверю.

ksv
() автор топика
Ответ на: комментарий от ksv

Если собираете трафик через libpcap или iptables-ulog, то 100% потери будут, можно попробовать поставить процессор по мощнее на сервер. еще посмотрите на проект ntop.org

Yur4eg ★★
()
Ответ на: комментарий от Yur4eg

Скорее всего, логи отправляются с помощью iptables-ulog. А почему такая уверенность что потери обязательно будут?

Комп и так мощный, что-то из серии HP ProLiant.

ntop на той машинке установлен. Как используется - без понятия.

ksv
() автор топика
Ответ на: комментарий от ksv

>Скорее всего, логи отправляются с помощью iptables-ulog. А почему такая уверенность что потери обязательно будут?

Это мой собственный опыт.

Комп и так мощный, что-то из серии HP ProLiant.

ntop на той машинке установлен. Как используется - без понятия.

Имел ввиду http://www.ntop.org/products/pf_ring/

Yur4eg ★★
()

Выкроил время и протестировал работу различных логгеров. Проверял sysklogd (умолчательный в Debian Lenny), rsyslog и syslog-ng. Последние два - с включенным экспортом в MySQL и без. Результаты.

Без экспорта в MySQL все три обрабатывают все 500 000 сообщений. Ни одно не пропадает (смотрел по содержимому /var/log/syslog).

rsyslog + MySQL: потерял 275 сообщений (нет ни в MySQL, ни в /var/log/syslog).

syslog-ng + MySQL (общение - через named pipes и bash скрипт, по инструкции отсюда): обработал все сообщения (нашлись в /var/log/syslog), но в MySQL попала только половина. Полагаю, происходило переполнение буферов пайпов.

ksv
() автор топика
Ответ на: комментарий от ksv

> syslog-ng + MySQL

Странно, переписал запись из named pipe в базу на C, но все равно - в MySQL попала только половина записей. Похоже, буфер у named pipe тут тоже ни при чем.

ksv
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.