xtaci / kcptun

A Quantum-Safe Secure Tunnel based on QPP, KCP, FEC, and N:M multiplexing.
MIT License
13.93k stars 2.54k forks source link

希望增加SNMP信息实时写入指定文件的功能,以方便调试参数。 #342

Closed bettermanbao closed 7 years ago

bettermanbao commented 7 years ago

或者增加控制台关闭log,然后实时显示的SNMP参数功能。

谢谢!

xtaci commented 7 years ago

--collect-snmp file.log ?

bettermanbao commented 7 years ago

yes,不知是否麻烦?

xtaci commented 7 years ago

不麻烦,我等下试试

xtaci commented 7 years ago

主要是接口要足够精确,另外,是否要支持 file-20161220.log这种logrotate

xtaci commented 7 years ago

另外,采集周期,一分钟?

bettermanbao commented 7 years ago

采样周期能否自定义?以秒为单位,如果设定60秒,就是每隔60秒记录最近60秒的数据。

xtaci commented 7 years ago

可以 ,是当前的快照

bettermanbao commented 7 years ago

logrotate这种功能交给logrotate去做就好了,不用自己去实现。格式最好是.csv这种以逗号分割的格式,便于用excel做后期分析。谢谢!!!

xtaci commented 7 years ago

.csv 可能比较麻烦,搞复杂了,json吧

bettermanbao commented 7 years ago

csv很简单啊,第一行是逗号分割的字段名,第二行开始是逗号分割的数值。

就是这样 a, b, c, d 1, 2, 3, 4 5, 6, 7, 8

xtaci commented 7 years ago

因为有表头,说明文件是有状态的了,重启后,需要检测表头是否存在的这个状态。

xtaci commented 7 years ago

csv文件是一个db,而不是append only 的log文件。

bettermanbao commented 7 years ago

其实只要启动的时候,检测一下log文件是否存在,存在即默许有表头,直接append。不存在则新建文件,写入表头,然后开始append。

xtaci commented 7 years ago

嗯,考虑一下。

bettermanbao commented 7 years ago

感谢,感谢。 相信有了这些数据,一定会发现很多有趣的关系。比如时间,瞬时流量,丢包率,FEC效果之间的微妙关系。

xtaci commented 7 years ago

@bettermanbao 我提交了,你先自己编译测试下效果 ,支持 logrotate

--snmplog ./snmp-20060102.log --snmpperiod 5

20060102是golang日期格式,会替换为当前时间

xtaci commented 7 years ago
91e1c483-e914-41bc-a562-b69dddc9e21c
bettermanbao commented 7 years ago

能否再麻烦下每行第一列再加个时间戳? logrotate会每天新建一个文件?还是只是记录文件创建时间?其实只要每行有个时间戳,log文件就不需要加上日期了,你觉得呢?

xtaci commented 7 years ago

是的,每天新建, 你可以做到每个小时新建,通过 ./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。

bettermanbao commented 7 years ago

还有,看log应该是直接写入了snmp的累计值吧?个人感觉写入每个period的统计值,对分析更有帮助。比如period设为60秒,每行记录就是最近60秒的统计数据。这样到时作图,x轴是时间,y轴是需要显示的值,很是方便呢。

xtaci commented 7 years ago

这样需要这次和上次相减。但是,MaxConn这种做减法没有意义。

bettermanbao commented 7 years ago

我个人觉得自动新建log文件,反而对分析带来不便。到时可能要手动合并几天的文件,再进行分析。不如盯死一个文件写,担心文件过大的用户,自己用logrotate定期rotate就好了。

表示状态的值不求差,表示累计的值求个差。好像要求有些高啊,不好意思,不好意思,你别砍我。

xtaci commented 7 years ago

你不指定日期就不新建了 -snmplog /xxxx.csv 即可

xtaci commented 7 years ago

对,所以,我觉得还是需要后期处理。kcptun只管输出。

bettermanbao commented 7 years ago

后期处理到不麻烦,但是每行麻烦添加一个时间戳吧。感谢!

xtaci commented 7 years ago

时间戳这个问题,我想了下可能不需要加,因为是固定间隔的时序数据。文件时间+间隔就可以推到出来所有时间。

xtaci commented 7 years ago

如果要加,可能写个unix时间比较合适,你觉得如何?

bettermanbao commented 7 years ago

间隔是固定的,但是起始时间怎么知道呢? 而且还有一种可能,2次开启kcptun使用的是不同的snmpperoid参数。

bettermanbao commented 7 years ago

只要有个精确到秒的时间,格式无所谓。

xtaci commented 7 years ago

已经提交

bettermanbao commented 7 years ago

看到了,十分感谢! 另外,说句题外话,你别砍我。时间戳直接定义在DefaultSnmp.Header和ToSlice里面,代log输出的码会更美观一些吧。哈哈哈哈。。。。。。

xtaci commented 7 years ago

一码是一码,各管各的事。

bettermanbao commented 7 years ago

我明天白天开一天log看看效果,另外能顺变再科普下snmp里面几个retrans参数的意义吗?一直有点一知半解的。感谢感谢!

xtaci commented 7 years ago

一两句话说不清楚: fastretrans : 快速重传,数据包乱序,中间丢包, fastack ,fastresend, earlyretrans: 没有后续包要发送了,无法触发快速重传阈值,采用的重传,参考Tail loss probe lostseg: 以上条件都不满足,数据包等待超时后也没到。产生的重传。

bettermanbao commented 7 years ago

repeatsegs是不是fasrretrans判断错误造成的重复发包?

xtaci commented 7 years ago

以上所有判断都可能导致repeat, 另外还包括fec的recover导致的

bettermanbao commented 7 years ago

刚才测试了一下,以60秒间隔为例,对于累计的数据还是希望能够记录最近60秒的值。原先以为只要在excel简单的求一下差就可以了,实际分析时发现如果遇到kcptun重启,新的第一条记录减去上次的最后一条记录就会出现负数,统计时需要手动移除,比较麻烦。如果改为输出最近60秒的记录就不会出现这样的问题,并且这样数据看上去更直观。

希望作者能够再考虑一下这个更改,感谢!

xtaci commented 7 years ago

嗯,我想想

xtaci commented 7 years ago

@bettermanbao 提交了,试试

bettermanbao commented 7 years ago

试过了,和期望效果一样。

另外,发现一个有趣的现象,RetransSegs很小的情况下,RepeatSegs会很大,请问是什么原因造成的?我试了开和关FEC,都是这种情况。不是很理解。数据见截图,谢谢!

snmp

xtaci commented 7 years ago

repeat大,说明误判丢包,说明网络抖动厉害。

bettermanbao commented 7 years ago

误判的丢包造成的retrans,不会被前面几个retrans的参数计数? 从fast2改成fast后,RepeatSegs有所下降。等我再手动调整下参数看看。

xtaci commented 7 years ago

retranssegs : = fast + early + lost

bettermanbao commented 7 years ago

那 RepeatSegs等于? 观察下来FEC对降低RepeatSegs也没有任何帮助,调大Interval,可以降低RepeatSegs,但速度也随之降低。

xtaci commented 7 years ago

repeatsegs就是kcp收到的重复包计数啊

bettermanbao commented 7 years ago

那接收端的RepeatSegs是否可以理解为发送端因为错误判断所发出的FastRetransSegs、EarlyRetransSegs相加?

bettermanbao commented 7 years ago

错误判断主要是因为接收端返回的ack晚到了?

xtaci commented 7 years ago

不可能准确判断的。 包括TCP。都是猜。

bettermanbao commented 7 years ago

是否可以理解fast mode,因为nodelay=0,所以会多等等,等多久取决于resend后面的数字。fast2 mode因为nodelay=1,所以ack一旦跳过一个,就直接重传?

xtaci commented 7 years ago

不是, nodelay只有0,1选项,就是表示多等一下

重传跳过个数是由 -resend 控制的。