近期在使用rsyslog-fwd和rsyslog-kafka做日志中轉(zhuǎn)集群答毫,3臺4核8G虛擬機支撐峰值約70Krps褥民,流量大概400M左右;
但好景不長洗搂,有個業(yè)務(wù)發(fā)現(xiàn)日志有丟失的情況消返,而且丟失很嚴(yán)重;暫將排查過程記錄如下:
通過kafka的topic監(jiān)控看數(shù)據(jù)根本就沒寫進來耘拇,可見問題出現(xiàn)rsyslog這一層撵颊;排查服務(wù)器監(jiān)控后就更奇怪了,日志丟失的時間段內(nèi)惫叛,rsyslog服務(wù)器的網(wǎng)卡流量也有降低倡勇,也就是日志沒到rsyslog,再向前就說應(yīng)用服務(wù)器了嘉涌,但應(yīng)用服務(wù)器rsyslog運行正常译隘,而且也不可能同一時間點所有服務(wù)器都出現(xiàn)rsyslog故障吧?
排查中轉(zhuǎn)集群上的rsyslog狀態(tài)洛心,也沒有任何異常日志固耘,中轉(zhuǎn)集群上配置了很多imput和相應(yīng)的rule,每次出問題的都是同一個imput词身,給rsyslog增加了pstats監(jiān)控觀察后也沒有任何發(fā)現(xiàn)厅目,在機器上排查時,無意發(fā)現(xiàn)以下信息:
lsof -i:11513
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 31618 root 26u IPv4 217406269 0t0 UDP *:11513
rsyslogd 31618 root 27u IPv6 217406270 0t0 UDP *:11513
rsyslogd 31618 root 71u IPv4 217843183 0t0 UDP *:11513
通一個ipv4的11513端口法严,有兩個socket在監(jiān)聽损敷,其他正常的服務(wù)器都是1個,rsyslog為什么會拉起兩個socket監(jiān)聽同一個端口呢深啤?
netstat -natup |grep 11513
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 525312 0 0.0.0.0:11513 0.0.0.0:* 31618/rsyslogd
udp 0 0 0.0.0.0:11513 0.0.0.0:* 31618/rsyslogd
udp6 0 0 :::11513 :::* 31618/rsyslogd
在通過netstat查看發(fā)現(xiàn)第一個socket的Recv-Q長期為非0拗馒,且一直是這個值,也就是存在接收隊列溯街,難道是rsyslog性能問題诱桂? 回想故障的時間點也不像洋丐,發(fā)生故障的時間隨機、不存在高峰期故障的特征
cat /proc/net/udp
sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode ref pointer drops
338: 00000000:2CF9 00000000:0000 07 00000000:00080400 00:00000000 00000000 0 0 217843183 2 ffff968bffbd5d80 2919950
338: 00000000:2CF9 00000000:0000 07 00000000:00000000 00:00000000 00000000 0 0 217406269 2 ffff968bf22fe1c0 65990
再通過/proc/net/udp可以看到第一行記錄存在大量丟包的情況(最后一列)挥等。
初步估計整個故障的流程如下:
- 1友绝、rsyslog重新拉起一個socket監(jiān)聽11513端口,具體原因未知
- 2肝劲、但rsyslog的主進程只處理了老的socket接收的數(shù)據(jù)迁客,并沒有處理新起的socket連接,但外面進來的udp數(shù)據(jù)包都發(fā)送到新socket上面
- 3辞槐、新的socket沒有程序處理數(shù)據(jù)包導(dǎo)致接收堆積到隊列掷漱,Rec-Q的值 == net.core.rmem_default
- 4、隊列滿了之后就出現(xiàn)丟包榄檬,也就是proc/net/udp中的drops
根本原因還是在為什么新起了一個socket卜范,還要繼續(xù)排查