昨天跟同事讨论一个流量异常监控问题,想起了前年一个未完成的方案。大致需求是:捕捉到 TCP 连接失败数量突增时,下一个深度 hook,获取更详细信息。
好处是在没有异常时也没有 hook,不影响正常流量。
问题在于如何捕捉异常,大致可有轮询和中断两种方式,方法也不一而足,之所以记录这篇文章是因为我当时的方法利用了 segvfault:
- 发生连接失败,内核则往一个 user-space 的定长 buffer stack 里塞入元组信息。
- 启动一个进程挂载 segfault 信号 handler,以一定速率从 buffer stack 读出数据,读了就扔掉。
- 一旦有突发连接失败,buffer 必溢出,触发非法内存访问,segfault 处理 handler 里读出元组,就知道是谁了。
segfault 由工作在最底层的内存访问逻辑触发,效率最高,且谁也绕不过,简单粗暴。但正如同事所说,这种方法无法正式上线。我觉得也未尝不可,可能只是大家对 segfault 的偏见,总觉得它是一种程序本身出了事才会触发的信号,正如雨天打不上车就装疯报警让警车送一样。但 segfault 可能只是名字取的不好,叫 segevent 可能会好些。
浙江温州皮鞋湿,下雨进水不会胖。