rsyslog性能表现

来源:互联网 发布:养老金的算法 编辑:程序博客网 时间:2024/05/21 09:34

syskolgd的缺点

虽说 Sysklogd 已经发展进30余年,但其性能在高负载下会有诸多问题,如:

Ø  记录丢失

Syslog 默认使用 UDP 514 端口来接收远程主机发送过来的日志,当有大量的日志需要syslogd进程来处理时就会有所残缺。这是由于 UDP 并没有丢包检测、重传、速率控制等机制,因此当很高速率的去发送 UDP 包时,对端检测到丢包是必然的。

Ø  记录缓慢,磁盘IO利用率较高进而导致CPU阻塞影响系统性能

当有大量的日志需要syslogd 进程来处理时,syslogd 进程会频繁请求磁盘IO,使磁盘利用率升高,进而导致CPU由于等待进程完成IO请求而发生阻塞,最终影响系统性能。

关于Rsyslog

Rsyslog 可以理解为一个 sysklogd 的多线程增强版,其在 sysklogd 的基础上扩展了很多其他功能,如:数据库支持(Mysql、Oracle、PostgreSQL等)、日志内容筛选、定义日志格式模板等。除了默认的 UDP 协议外,Rsyslog 还支持 TCP 协议来接受日志。可以对输出的文件进行自动压缩并支持多个TCP侦听以及性能方面的提升。使用 Rsyslog 可以有效减轻系统磁盘IO,并且其支持TCP传输非常可靠,可以对日志进行过滤,提取有效日志。况且 Red Hat 从6.0开始已经选择了 Rsyslog,自然是有它的道理的。如果我们自己没有研发能力,那么“跟随上游”,无疑是最明智的选择。

看图说话(磁盘TPS为200-300):

 替换前(sysklogd):

%wait sysklog

替换后(rsyslog):

%wait rsyslog

我的配置:

因为rsyslog是支持多进程启动的,我这里配置了两个配置文件分别启动 rsyslog,用来分开本地日志和远程日志方便以后分析,提取不同地方的日志。

1. 配置 rsyslog.conf 用于监听本地 syslog 日志:

...

加载本地 syslog 模块 

$ModLoad imuxsock

加载 kernel 模块 

$ModLoad imklog

 

定义日志格式默认模板 

$ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat

 

# Log anything (except mail) of level info or higher.

# Don't log private authentication messages!

*.info;mail.none;authpriv.none;cron.none         -/var/log/messages

 

# The authpriv file has restricted access.

authpriv.*                                              /var/log/secure

 

# Log all the mail messages in one place.

mail.*                                                  -/var/log/maillog

 

# Log cron stuff

cron.*                                                  -/var/log/cron

 

# Everybody gets emergency messages

# *.emerg                                               *

*.emerg                                                 :omusrmsg:*

 

# Save news errors of level crit and higher in a special file.

uucp,news.crit                                          -/var/log/spooler

 

# Save boot messages also to boot.log

local7.*                                                /var/log/boot.log

...

注:action'*' 以后将会被rsyslog遗弃(rsyslog语法有歧义)rsyslog将采用“ :omusrmsg:*”的写法

2. 配置 rsyslog.udp.conf 用于监听UDP远程 syslog 日志:

...

加载 udp 侦听模块

$ModLoad imudp.so

指定 udp 侦听端口

$UDPServerRun 514

 

定义日志格式

$template NETCOOL,"%TIMESTAMP% %fromhost-ip% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"

$ActionFileDefaultTemplate NETCOOL

 

# Log all the messages in one place.

*.*                                                  /var/log/ncolog

...

注:模板 RSYSLOG_TraditionalFileFormat rsyslog默认保留模板,官网对其的解释是:the "old style" default log file format with low-precision timestamps,它的具体格式为:

$template TraditionalFileFormat,"%TIMESTAMP% %HOSTNAME%%syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"


其中:TraditionalFileFormat为模板名;“   ”之间的为模板内容,由一些变量构成,常用的有:msg消息主体、fromhost-ip来源IP等。这个模板貌似对H3C设备token4的解析存在一些问题,建议将%HOSTNAME%替换为%fromhost-ip%另行自定义模板

 

3. 为了方便日后的维护,我们按照 RedHat 的风格编写 Rsyslog 的启动脚本:

01#!/bin/bash
02# chkconfig: 2345 12 88
03# description: Modded by ms2008 on 2013/02/16
04 
05# Source function library.
06. /etc/init.d/functions
07 
08RETVAL=0
09PIDFILE1=/var/run/rsyslogd.pid
10PIDFILE2=/var/run/rsyslogd.udp.pid
11CONFILE1=/etc/rsyslog.conf
12CONFILE2=/etc/rsyslog.udp.conf
13 
14prog=rsyslog
15exec=/usr/local/sbin/rsyslogd
16lockfile=/var/lock/subsys/$prog
17 
18# Source config
19if[ -f /etc/sysconfig/$prog ] ; then
20    . /etc/sysconfig/$prog
21fi
22 
23start() {
24    [ -x $exec] || exit5
25 
26    umask077
27 
28        echo-n mce_markerquot;Starting locallogger: "
29        # this one listens on the "usual" socket /dev/log
30        daemon --pidfile="$PIDFILE1"$exec-x -f $CONFILE1 -i "$PIDFILE1"
31        RETVAL=$?
32        echo
33        [ $RETVAL -eq0 ] && touch$lockfile
34        # this one listens only to the UDP port
35        sleep1
36        [ $RETVAL -eq0 ] && { echo-n mce_markerquot;Starting remote logger:"; daemon --pidfile="$PIDFILE2" $exec -x -f $CONFILE2 -i "$PIDFILE2"; }
37        RETVAL=$?
38        echo
39 
40        return$RETVAL
41}
42stop() {
43        echo-n mce_markerquot;Shutting down locallogger: "
44        killproc -p "$PIDFILE1"$exec
45        RETVAL=$?
46        echo
47        [ $RETVAL -eq0 ] && { echo-n mce_markerquot;Shutting down remote logger:"; killproc -p "$PIDFILE2" $exec; }
48        RETVAL=$?
49        echo
50        [ $RETVAL -eq0 ] && rm-f $lockfile
51        return$RETVAL
52}
53rhstatus() {
54        status -p "$PIDFILE1"-l $prog $exec
55        status -p"$PIDFILE2"-l $prog $exec
56}
57restart() {
58        stop
59        start
60}
61 
62case"$1" in
63  start)
64        start
65        ;;
66  stop)
67        stop
68        ;;
69  restart)
70        restart
71        ;;
72  reload)
73        exit3
74        ;;
75  force-reload)
76        restart
77        ;;
78  status)
79        rhstatus
80        ;;
81  condrestart|try-restart)
82        rhstatus >/dev/null 2>&1 || exit0
83        restart
84        ;;
85  *)
86        echomce_markerquot;Usage: $0 {start|stop|restart|condrestart|try-restart|reload|force-reload|status}"
87        exit3
88esac
89 
90exit$?
0 0
原创粉丝点击