Назад | Перейти на главную страницу

rsyslog пишет в postgres. rsyslog обрабатывает очень высокий процессор, postgres очень низкий процессор

Я использую rsyslog для записи данных DNS в postgres. Сообщения всегда довольно короткие и похожи друг на друга: <ip of host making dns request> <dns request> Я использую регулярное выражение для получения ip от запрашивающего и FQDN от запроса.

rsyslog постоянно использует 40% -55% ЦП, в то время как postgres составляет всего 0,5% -2,5% ЦП. (rsyslog и postgres находятся на одном хосте)

Есть ли способ снизить использование процессора rsyslog, перенеся большую часть рабочей нагрузки на postgres? Я пробовал изменить queue.size с 50000 на 1000, но, похоже, это не имеет значения.

template(name="sql-syslog" type="list" option.sql="on") {
  constant(value="INSERT INTO tablename (request_time, server, ip, request) values ('")
  property(name="timereported" dateformat="pgsql")
  constant(value="','")
  property(name="fromhost")
  constant(value="','")
  property(name="msg"
    regex.type="ERE"
    regex.submatch="1"
    regex.expression="([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}) (.*\\.) (.*)$"
    regex.nomatchmode="DFLT"
  )
  constant(value="','")
    property(name="msg"
    regex.type="ERE"
    regex.submatch="2"
    regex.expression="([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}) (.*\\.) (.*)$"
    regex.nomatchmode="DFLT"
    )
  )
  constant(value="')")
}

# load module
module(load="ompgsql")

action(type="ompgsql" server="dbhost"
       user="dbuser" pass="dbpass"
       db="dbname"
       template="sql-syslog"
       queue.size="1000"
       queue.type="LinkedList"
       queue.filename="dbq"
       queue.workerthreads="5"
       queue.workerthreadMinimumMessages="500"
       queue.timeoutWorkerthreadShutdown="1000"
       queue.timeoutEnqueue="10000")

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

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

Ваше регулярное выражение там выглядит довольно сложным - попробуйте упростить - возможно, вы можете перенаправить DNS-журналы на собственное syslog-устройство (local2?) И вместо этого записать это полное устройство в PostGreSQL.

ИЛИ позвольте DNS регистрироваться напрямую в PostGreSQL - если возможно.