Closed bettermanbao closed 7 years ago
--collect-snmp file.log ?
yes,不知是否麻烦?
不麻烦,我等下试试
主要是接口要足够精确,另外,是否要支持 file-20161220.log这种logrotate
另外,采集周期,一分钟?
采样周期能否自定义?以秒为单位,如果设定60秒,就是每隔60秒记录最近60秒的数据。
可以 ,是当前的快照
logrotate这种功能交给logrotate去做就好了,不用自己去实现。格式最好是.csv这种以逗号分割的格式,便于用excel做后期分析。谢谢!!!
.csv 可能比较麻烦,搞复杂了,json吧
csv很简单啊,第一行是逗号分割的字段名,第二行开始是逗号分割的数值。
就是这样 a, b, c, d 1, 2, 3, 4 5, 6, 7, 8
因为有表头,说明文件是有状态的了,重启后,需要检测表头是否存在的这个状态。
csv文件是一个db,而不是append only 的log文件。
其实只要启动的时候,检测一下log文件是否存在,存在即默许有表头,直接append。不存在则新建文件,写入表头,然后开始append。
嗯,考虑一下。
感谢,感谢。 相信有了这些数据,一定会发现很多有趣的关系。比如时间,瞬时流量,丢包率,FEC效果之间的微妙关系。
@bettermanbao 我提交了,你先自己编译测试下效果 ,支持 logrotate
--snmplog ./snmp-20060102.log --snmpperiod 5
20060102是golang日期格式,会替换为当前时间
能否再麻烦下每行第一列再加个时间戳? logrotate会每天新建一个文件?还是只是记录文件创建时间?其实只要每行有个时间戳,log文件就不需要加上日期了,你觉得呢?
是的,每天新建, 你可以做到每个小时新建,通过 ./snmp-20060102-15.log
const (
ANSIC = "Mon Jan _2 15:04:05 2006"
UnixDate = "Mon Jan _2 15:04:05 MST 2006"
RubyDate = "Mon Jan 02 15:04:05 -0700 2006"
RFC822 = "02 Jan 06 15:04 MST"
RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone
RFC850 = "Monday, 02-Jan-06 15:04:05 MST"
RFC1123 = "Mon, 02 Jan 2006 15:04:05 MST"
RFC1123Z = "Mon, 02 Jan 2006 15:04:05 -0700" // RFC1123 with numeric zone
RFC3339 = "2006-01-02T15:04:05Z07:00"
RFC3339Nano = "2006-01-02T15:04:05.999999999Z07:00"
Kitchen = "3:04PM"
// Handy time stamps.
Stamp = "Jan _2 15:04:05"
StampMilli = "Jan _2 15:04:05.000"
StampMicro = "Jan _2 15:04:05.000000"
StampNano = "Jan _2 15:04:05.000000000"
)
每行也需要增加timestamp。
还有,看log应该是直接写入了snmp的累计值吧?个人感觉写入每个period的统计值,对分析更有帮助。比如period设为60秒,每行记录就是最近60秒的统计数据。这样到时作图,x轴是时间,y轴是需要显示的值,很是方便呢。
这样需要这次和上次相减。但是,MaxConn这种做减法没有意义。
我个人觉得自动新建log文件,反而对分析带来不便。到时可能要手动合并几天的文件,再进行分析。不如盯死一个文件写,担心文件过大的用户,自己用logrotate定期rotate就好了。
表示状态的值不求差,表示累计的值求个差。好像要求有些高啊,不好意思,不好意思,你别砍我。
你不指定日期就不新建了 -snmplog /xxxx.csv 即可
对,所以,我觉得还是需要后期处理。kcptun只管输出。
后期处理到不麻烦,但是每行麻烦添加一个时间戳吧。感谢!
时间戳这个问题,我想了下可能不需要加,因为是固定间隔的时序数据。文件时间+间隔就可以推到出来所有时间。
如果要加,可能写个unix时间比较合适,你觉得如何?
间隔是固定的,但是起始时间怎么知道呢? 而且还有一种可能,2次开启kcptun使用的是不同的snmpperoid参数。
只要有个精确到秒的时间,格式无所谓。
已经提交
看到了,十分感谢! 另外,说句题外话,你别砍我。时间戳直接定义在DefaultSnmp.Header和ToSlice里面,代log输出的码会更美观一些吧。哈哈哈哈。。。。。。
一码是一码,各管各的事。
我明天白天开一天log看看效果,另外能顺变再科普下snmp里面几个retrans参数的意义吗?一直有点一知半解的。感谢感谢!
一两句话说不清楚: fastretrans : 快速重传,数据包乱序,中间丢包, fastack ,fastresend, earlyretrans: 没有后续包要发送了,无法触发快速重传阈值,采用的重传,参考Tail loss probe lostseg: 以上条件都不满足,数据包等待超时后也没到。产生的重传。
repeatsegs是不是fasrretrans判断错误造成的重复发包?
以上所有判断都可能导致repeat, 另外还包括fec的recover导致的
刚才测试了一下,以60秒间隔为例,对于累计的数据还是希望能够记录最近60秒的值。原先以为只要在excel简单的求一下差就可以了,实际分析时发现如果遇到kcptun重启,新的第一条记录减去上次的最后一条记录就会出现负数,统计时需要手动移除,比较麻烦。如果改为输出最近60秒的记录就不会出现这样的问题,并且这样数据看上去更直观。
希望作者能够再考虑一下这个更改,感谢!
嗯,我想想
@bettermanbao 提交了,试试
试过了,和期望效果一样。
另外,发现一个有趣的现象,RetransSegs很小的情况下,RepeatSegs会很大,请问是什么原因造成的?我试了开和关FEC,都是这种情况。不是很理解。数据见截图,谢谢!
repeat大,说明误判丢包,说明网络抖动厉害。
误判的丢包造成的retrans,不会被前面几个retrans的参数计数? 从fast2改成fast后,RepeatSegs有所下降。等我再手动调整下参数看看。
retranssegs : = fast + early + lost
那 RepeatSegs等于? 观察下来FEC对降低RepeatSegs也没有任何帮助,调大Interval,可以降低RepeatSegs,但速度也随之降低。
repeatsegs就是kcp收到的重复包计数啊
那接收端的RepeatSegs是否可以理解为发送端因为错误判断所发出的FastRetransSegs、EarlyRetransSegs相加?
错误判断主要是因为接收端返回的ack晚到了?
不可能准确判断的。 包括TCP。都是猜。
是否可以理解fast mode,因为nodelay=0,所以会多等等,等多久取决于resend后面的数字。fast2 mode因为nodelay=1,所以ack一旦跳过一个,就直接重传?
不是, nodelay只有0,1选项,就是表示多等一下
重传跳过个数是由 -resend 控制的。
或者增加控制台关闭log,然后实时显示的SNMP参数功能。
谢谢!