Здравствуйте.
Пожаловались мне, что на одной машине (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.
Вопрос - почему могут пропадать сообщения? Где посмотреть и что можно подкрутить?