最近工作中的一个问题,耗时一个月之久终于调查完毕且顺利解决,顿时感慨万千。耗时之久和预期解决时间和环境搭建以及日志不合理等等有关,当然这个并非此文的重点。
之所以在很久以后的今天又开始写文,主要是这个问题调查的过程值得铭记。具体情况如下文述。

一、问题发现过程
数据告警服务提示相关分析结果缺失,经初步调查,发现分析服务在调用对应的NLP算法服务时出现大量Failed,遂查看算法日志,确实存在错误信息。

二、问题调查和解决
1.定位问题
1) 反馈给算法相关开发同学:他们认为可能是该算法遇到了长文本数据(超过3000字),由于分析时间超长,导致后续算法请求时出现阻塞而导致failed。
2) 根据开发的反馈,开始定位是否存在这样的长文本数据:通过分析日志和数据库查询确认后,并没有分析长文本数据,且出现异常时的文本数据均为短文本(小于200)。
3) 深入调查:该算法部署了多个节点,出现异常时,多个节点均出现了异常,因此可能是算法本身遇到了某个瓶颈问题。经确认,该算法使用了同一台GPU服务器上的tf-serveing服务。
4) 确认GPU服务器是否发生了异常情况:经确认,该服务器进行过VIP漂移操作。
5) 问题是否可以复现:测试环境中,对GPU服务器进行vip漂移操作,发现错误现象出现,问题可复现。
因此,问题的起因是GPU服务器进行了VIP漂移操作,导致算法出现异常。

2.调查问题
1) 了解vip原理,初步了解后,觉得可能是我们的算法缺少超时设置,因此算法中新增超时设置后,再次进行测试
备注:keepalived可以将多个无状态的单点通过虚拟IP(以下称为VIP)漂移的方式搭建成一个高可用服务,常用组合比如 keepalived+nginx,lvs,haproxy和memcached等。
它的实现基础是VRRP协议,包括核心的MASTER竞选机制都是在VRRP协议所约定的。
2)一轮测试发现:问题仍然存在,修复失败,且无新增日志。于是,我们要求增加日志信息,并以Debug方式启动算法,进行二轮测试。
3)二轮测试发现:问题仍然存在,出现新的错误日志,错误信息为:Connect error: No route to host(errno:113)。
百度一番,都说是server端的防火墙设置了过滤规则;但是,Server端并没有,怎么办?
Server端抓包:
经抓包发现,GPU服务器完成vip漂移需要耗时4s左右,然而,算法在漂移开始的2s内发送了近20次请求之后无请求。
问题的根源(可能):Server端vip漂移未完成时,算法却发送了大量请求导致Server端的tcp连接池满,后续server端不再为其他请求分配资源。

3.解决问题
1)根据调查的原因,修复方法是:sever端在进行vip漂移完成前,尽量减少算法的请求次数,因此我们对该算法进行了超时重试次数的设置和请求间隔的设置(可配置)。
2)算法修复后经测试,问题解决。

三、总结
1)合理且重要的日志输出对于问题的定位和调查非常重要
2)涉及HTTP请求的问题调查时,服务端抓包有必要
3)Linux 的errno113问题并不一定是设置了防火墙导致的

备注:
(一)vip环境:用来给K8s做三节点高可用,被K8s的kubeproxy的ipvs方式转发到具体pod,四层转发,tcp协议(NAT模式)
(二)Linux errono命令

由VIP漂移引发的算法异常问题调查和解决的更多相关文章

  1. keepalived vip漂移基本原理及选举算法

    keepalived可以将多个无状态的单点通过虚拟IP(以下称为VIP)漂移的方式搭建成一个高可用服务,常用组合比如 keepalived+nginx,lvs,haproxy和memcached等.它 ...

  2. (转)小谈keepalived vip漂移原理与VRRP协议

    背景:之前搭建过keepalived双机热备的集群,但对其中的原理不甚理解,看完就忘了,所有有必要深入的学习下. 简介 什么是keepalived呢?keepalived是实现高可用的一种轻量级的技术 ...

  3. 浅析keepalived vip漂移原理与VRRP协议

    2017-01-18 Martin 开源技术社区 简介 什么是keepalived呢?keepalived是实现高可用的一种轻量级的技术手段,主要用来防止单点故障(单点故障是指一旦某一点出现故障就会导 ...

  4. 经纪xx系统节点VIP案例介绍和深入分析异常

    系统环境    硬件平台 &  操作 IBM 570 操作系统版本号  AIX 5.3 物理内存  32G Oracle 产品及版本号  10.2.0.5 RAC 业务类型  OLTP 背 ...

  5. MHA集群(gtid复制)和vip漂移

    在上一片博客中,讲述了怎么去配置MHA架构!这片博客不再细说,只说明其中MySQL主从搭建,这里使用的是gtid加上半同步复制! 步骤与上一片博客一样,不同之处在于MySQL主从的搭建!详细的gtid ...

  6. mysql高可用架构 -> MHA配置VIP漂移-05

    VIP漂移的两种方式 1)通过keepalived的方式,管理虚拟IP的漂移 2)通过MHA自带脚本方式,管理虚拟IP的漂移 MHA脚本方式 虚拟ip漂移的脚本下载地址 -> wget http ...

  7. TCP端口复用引发的异常,用setsockopt来解决

    TCP端口复用引发的异常,用setsockopt来解决 我们在并发连接一个服务端时候他会出现这种情况 OSError: [WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允 ...

  8. mha之vip漂移 配置binlog-server备份服务器 Atlas

    MHAvip漂移 配置 通过MHA自带脚本方式,管理虚拟IP的漂移 获取管理脚本master_ip_failover cp master_ip_failover /usr/local/bin/ #脚本 ...

  9. MHA 的 Binlog Server & VIP 漂移

    目录 Binlog Server 在 MHA 配置文件中配置 Binlog Server 创建 Binlog 存放目录 实时传输主库 Binlog 命令 重启 MHA 检验 MHA Manager 服 ...

随机推荐

  1. java实现排列序数

    X星系的某次考古活动发现了史前智能痕迹. 这是一些用来计数的符号,经过分析它的计数规律如下: (为了表示方便,我们把这些奇怪的符号用a~q代替) abcdefghijklmnopq 表示0 abcde ...

  2. java实现第六届蓝桥杯生命之树

    生命之树 生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点 ...

  3. OO第一作业周期(前四周)总结

    前言:回顾这三次的作业,在一次次的练习下渐渐理解了一些Java的一些基本知识和类与对象的含义与用法,也找到了很多自身的不足和问题,主要是反映类与类之间的关系没有理解到位,这次总结后又有了新的感悟和理解 ...

  4. WPF 学习(一)

    一.WPF介绍 WPF全称 Windows Presentation Foundation,干啥用的? 主要是用来制作Windows桌面客户端软件的. .Net平台下制作Windows桌面客户端软件主 ...

  5. 【Transferable NAS with RL】2018-CVPR-Learning Transferable Architectures for Scalable Image Recognition

    Transferable NAS with RL 2018-CVPR-Learning Transferable Architectures for Scalable Image Recognitio ...

  6. Redis PHP扩展安装步骤

    ### 下载最新的扩展文件,解压并进入文件夹 wget https://codeload.github.com/phpredis/phpredis/tar.gz/2.2.7 tar -zxvf 2.2 ...

  7. Docker巨轮的航行之路-基础知识篇

    一.什么是Docker Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...

  8. 2019-02-05 Linux的一些常用命令学习2

    黑马程序员python课的笔记 ls -l 显示文件详细信息 ls -l -h 以k形式显示大小 ls -a 显示指定目录下的所有子目录和文件,包括隐藏文件 ls匹配符 *代表任意个数的字符 ?代表任 ...

  9. UI 自动化遇到的坑

    1,ElementNotInteractableException: Message: element not interactable 该解决方法是用xpath定位,然后使用js操作元素,点击之类 ...

  10. LR字符串处理函数-lr_save_var

    int lr_save_var ("截取的字符串"+start,len,options,param_name) start:表示从第几位截取  len:表示截取长度  option ...