![rsyslog 写入 postgres。rsyslog 进程 CPU 使用率非常高,postgres CPU 使用率非常低](https://linux22.com/image/730171/rsyslog%20%E5%86%99%E5%85%A5%20postgres%E3%80%82rsyslog%20%E8%BF%9B%E7%A8%8B%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E9%9D%9E%E5%B8%B8%E9%AB%98%EF%BC%8Cpostgres%20CPU%20%E4%BD%BF%E7%94%A8%E7%8E%87%E9%9D%9E%E5%B8%B8%E4%BD%8E.png)
我使用 rsyslog 将 dns 数据写入 postgres。这些消息总是很短且彼此相似:<ip of host making dns request> <dns request>
我使用正则表达式从请求者那里提取 ip,从请求那里提取 FQDN。
rsyslog 的 CPU 使用率始终为 40%-55%,而 postgres 的 CPU 使用率仅为 0.5%-2.5%。(rsyslog 和 postgres 在同一台主机上)
有没有办法通过将更多的工作负载转移到 postgres 来降低 rsyslog cpu 的使用率?我尝试将queue.size从 50,000 更改为 1,000,但似乎没有什么区别。
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")
答案1
由于消息通过 syslog 传输到 PostGreSQL,因此您必须调整 rsyslog。
复杂的正则表达式需要处理 - 它们按顺序逐行处理 - 直到完成最后一次匹配。
那里的正则表达式看起来相当复杂 - 尝试使其更简单 - 也许您可以将 DNS 日志重定向到自己的系统日志设备(local2?)并将该完整的设备记录到 PostGreSQL。
或者让 DNS 直接记录到 PostGreSQL - 如果可能的话。