rsyslog性能表现

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):

替换后(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  
08 RETVAL=0
09 PIDFILE1=/var/run/rsyslogd.pid
10 PIDFILE2=/var/run/rsyslogd.udp.pid
11 CONFILE1=/etc/rsyslog.conf
12 CONFILE2=/etc/rsyslog.udp.conf
13  
14 prog=rsyslog
15 exec=/usr/local/sbin/rsyslogd
16 lockfile=/var/lock/subsys/$prog
17  
18 # Source config
19 if [ -f /etc/sysconfig/$prog ] ; then
20     . /etc/sysconfig/$prog
21 fi
22  
23 start() {
24     [ -x $exec ] || exit 5
25  
26     umask 077
27  
28         echo -n mce_markerquot;Starting local logger: "
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 -eq 0 ] && touch $lockfile
34         # this one listens only to the UDP port
35         sleep 1
36         [ $RETVAL -eq 0 ] && { 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 }
42 stop() {
43         echo -n mce_markerquot;Shutting down local logger: "
44         killproc -p "$PIDFILE1" $exec
45         RETVAL=$?
46         echo
47         [ $RETVAL -eq 0 ] && { echo -n mce_markerquot;Shutting down remote logger: "; killproc -p "$PIDFILE2" $exec; }
48         RETVAL=$?
49         echo
50         [ $RETVAL -eq 0 ] && rm -f $lockfile
51         return $RETVAL
52 }
53 rhstatus() {
54         status -p "$PIDFILE1" -l $prog $exec
55         status -p "$PIDFILE2" -l $prog $exec
56 }
57 restart() {
58         stop
59         start
60 }
61  
62 case "$1" in
63   start)
64         start
65         ;;
66   stop)
67         stop
68         ;;
69   restart)
70         restart
71         ;;
72   reload)
73         exit 3
74         ;;
75   force-reload)
76         restart
77         ;;
78   status)
79         rhstatus
80         ;;
81   condrestart|try-restart)
82         rhstatus >/dev/null 2>&1 || exit 0
83         restart
84         ;;
85   *)
86         echo mce_markerquot;Usage: $0 {start|stop|restart|condrestart|try-restart|reload|force-reload|status}"
87         exit 3
88 esac
89  
90 exit $?

你可能感兴趣的:(rsyslog性能表现)